Skip to main content

roxy_loader/
load_kernel.rs

1use 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}