mirror of
https://github.com/XunilGroup/XunilOS.git
synced 2026-06-02 13:44:25 +02:00
Patched everything for aarch64, aside from scheduler, add more linker
points to aarch64 ld, add aarch64 heap, init, page tables and usermode, make hhdm_offset a global atomic, aarch64 uses semihosting for output, add generic PageTable type, add a function that creates and maps pages, use allow to remove warnings, add a bufwriter so kernel panic always works
This commit is contained in:
@@ -1,22 +1,34 @@
|
||||
use core::ptr::null;
|
||||
|
||||
#[cfg(target_arch = "x86_64")]
|
||||
use crate::arch::x86_64::paging::create_and_map_multiple_pages;
|
||||
#[allow(unused_imports)]
|
||||
use crate::driver::elf::{
|
||||
header::{
|
||||
EI_CLASS, EI_DATA, EI_VERSION, ELF_MAGIC, EM_X86_64, ET_DYN, ET_EXEC, ET_REL, Elf64Ehdr,
|
||||
EI_CLASS, EI_DATA, EI_VERSION, ELF_MAGIC, EM_AARCH64, EM_X86_64, ET_DYN, ET_EXEC, ET_REL,
|
||||
Elf64Ehdr,
|
||||
},
|
||||
program::load_program,
|
||||
};
|
||||
|
||||
#[cfg(target_arch = "aarch64")]
|
||||
use crate::arch::aarch64::paging::{
|
||||
AArchPageTable, create_and_map_multiple_pages, user_data_flags,
|
||||
};
|
||||
use crate::{mm::address_space::AddressSpace, println, task::scheduler::SCHEDULER};
|
||||
#[cfg(target_arch = "x86_64")]
|
||||
use x86_64::structures::paging::OffsetPageTable;
|
||||
use x86_64::structures::paging::{OffsetPageTable, PageTableFlags};
|
||||
|
||||
#[cfg(target_arch = "aarch64")]
|
||||
type PageTable = AArchPageTable;
|
||||
|
||||
#[cfg(target_arch = "x86_64")]
|
||||
type PageTable<'a> = OffsetPageTable<'a>;
|
||||
|
||||
pub fn validate_elf(elf_header: &Elf64Ehdr, elf_len: usize) -> bool {
|
||||
#[cfg(target_arch = "x86_64")]
|
||||
let required_machine = EM_X86_64;
|
||||
|
||||
#[cfg(target_arch = "aarch64")]
|
||||
use crate::driver::elf::header::EM_AARCH64;
|
||||
#[cfg(target_arch = "aarch64")]
|
||||
let required_machine = EM_AARCH64;
|
||||
|
||||
@@ -37,8 +49,7 @@ pub fn validate_elf(elf_header: &Elf64Ehdr, elf_len: usize) -> bool {
|
||||
&& (elf_header.e_phoff + (elf_header.e_phnum*elf_header.e_phentsize) as u64) <= elf_len as u64
|
||||
}
|
||||
|
||||
#[cfg(target_arch = "x86_64")]
|
||||
pub fn load_file(mapper: &mut OffsetPageTable, elf_bytes: &[u8]) -> (*const u8, u64) {
|
||||
pub fn load_file(mapper: &mut PageTable, elf_bytes: &[u8]) -> (*const u8, u64) {
|
||||
// elf header size
|
||||
if elf_bytes.len() < 64 {
|
||||
return (null(), 0);
|
||||
@@ -60,3 +71,46 @@ pub fn load_file(mapper: &mut OffsetPageTable, elf_bytes: &[u8]) -> (*const u8,
|
||||
_ => return (null(), 0),
|
||||
};
|
||||
}
|
||||
|
||||
pub fn run_elf(file_bytes: &[u8], should_swapgs: bool) {
|
||||
let stack_base: u64 = 0x0000_7fff_0000_0000;
|
||||
let page_count = 4096; // 16 mib
|
||||
let page_size = 0x1000u64;
|
||||
let stack_top = stack_base + (page_count as u64 * page_size);
|
||||
|
||||
if let Some(mut address_space) = AddressSpace::new() {
|
||||
address_space.use_address_space();
|
||||
|
||||
let (entry_point, heap_base) = load_file(&mut address_space.mapper, file_bytes);
|
||||
|
||||
println!("Entry point: {:?}", entry_point);
|
||||
|
||||
let process_pid = SCHEDULER
|
||||
.spawn_process(entry_point as u64, stack_top, heap_base)
|
||||
.unwrap();
|
||||
|
||||
#[cfg(target_arch = "aarch64")]
|
||||
create_and_map_multiple_pages(
|
||||
&mut address_space.mapper,
|
||||
page_count,
|
||||
stack_base,
|
||||
user_data_flags(),
|
||||
);
|
||||
|
||||
#[cfg(target_arch = "x86_64")]
|
||||
create_and_map_multiple_pages(
|
||||
&mut address_space.mapper,
|
||||
page_count,
|
||||
stack_base,
|
||||
PageTableFlags::PRESENT | PageTableFlags::WRITABLE | PageTableFlags::USER_ACCESSIBLE,
|
||||
);
|
||||
|
||||
SCHEDULER.with_process(process_pid, |process| {
|
||||
process.address_space = Some(address_space)
|
||||
});
|
||||
|
||||
SCHEDULER.switch_to(process_pid, should_swapgs);
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user