mirror of
https://github.com/XunilGroup/XunilOS.git
synced 2026-06-02 12:44:24 +02:00
85e0d45d3c
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
33 lines
944 B
Rust
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),
|
|
};
|
|
}
|