roxy_loader/
load_kernel.rs1use core::mem::transmute;
2
3use anyhow::{Context, Result};
4use roxy_loader_api::bootinfo::BootInfo;
5use uefi::cstr16;
6
7use crate::{
8 elf_loader::RoxyElfLoader,
9 elf_processing::{kernel_entry_point, parse_kernel_elf, validate_kernel_elf},
10 utils::read_file,
11};
12
13pub type KernelEntry = extern "sysv64" fn(*const BootInfo);
14
15pub fn load_kernel() -> Result<KernelEntry> {
16 let kernel_file = read_file(cstr16!("\\KERNEL")).context("Failed to read kernel file")?;
17 let kernel_elf = parse_kernel_elf(&kernel_file)?;
18 validate_kernel_elf(&kernel_elf)?;
19
20 kernel_elf
21 .load(&mut RoxyElfLoader)
22 .expect("Failed to load kernel elf");
23
24 unsafe { Ok(transmute(kernel_entry_point(&kernel_elf))) }
25}