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:
csd4ni3l
2026-05-16 00:30:01 +02:00
parent 17f2a3c7e4
commit 812d4cf6d4
32 changed files with 911 additions and 405 deletions
+60 -6
View File
@@ -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;
};
}