Files
XunilOS/kernel/src/driver/elf/loader.rs
T
csd4ni3l 85e0d45d3c Add correct framebuffer mapping, so Doom works again, remove unneded
code, add cooperative scheduling on syscalls determined by the
reschedule flag, make serial console automatically clear and be a single
render, make process_scancodes push to all processes, add a user-facing
framebuffer to be mapped, automatically swap buffers inside timer
interrupt, update all submodules
2026-05-11 19:09:20 +02:00

33 lines
944 B
Rust

use core::ptr::null;
use x86_64::structures::paging::OffsetPageTable;
use crate::driver::elf::{
header::{ET_DYN, ET_EXEC, ET_REL, Elf64Ehdr},
program::load_program,
validation::validate_elf,
};
pub fn load_file(mapper: &mut OffsetPageTable, elf_bytes: &[u8]) -> (*const u8, u64) {
// elf header size
if elf_bytes.len() < 64 {
return (null(), 0);
}
let elf_header: Elf64Ehdr =
unsafe { core::ptr::read_unaligned(elf_bytes.as_ptr() as *const Elf64Ehdr) };
if !validate_elf(&elf_header, elf_bytes.len()) {
return (null(), 0);
}
let elf_header_ptr = elf_bytes.as_ptr() as *const Elf64Ehdr;
return match elf_header.e_type {
ET_EXEC => unsafe { load_program(mapper, elf_header_ptr, elf_bytes, false) },
ET_DYN => unsafe { load_program(mapper, elf_header_ptr, elf_bytes, true) },
ET_REL => return (null(), 0),
_ => return (null(), 0),
};
}