forked from AbleOS/ableos
75 lines
1.9 KiB
Rust
75 lines
1.9 KiB
Rust
mod gdt;
|
|
mod interrupts;
|
|
mod logging;
|
|
mod memory;
|
|
|
|
pub use logging::log;
|
|
|
|
use crate::allocator;
|
|
use limine::{
|
|
LimineHhdmRequest, LimineKernelFileRequest, LimineMemmapRequest, LimineModuleRequest,
|
|
};
|
|
use x86_64::VirtAddr;
|
|
|
|
#[no_mangle]
|
|
unsafe extern "C" fn _kernel_start() -> ! {
|
|
logging::init();
|
|
crate::logger::init().expect("failed to set logger");
|
|
log::info!("Initialising AKern {}", crate::VERSION);
|
|
|
|
static HDHM_REQ: LimineHhdmRequest = LimineHhdmRequest::new(0);
|
|
memory::init_pt(VirtAddr::new(
|
|
HDHM_REQ
|
|
.get_response()
|
|
.get()
|
|
.expect("tried to get physical memory mapping offset from Limine")
|
|
.offset,
|
|
));
|
|
|
|
static MMAP_REQ: LimineMemmapRequest = LimineMemmapRequest::new(0);
|
|
memory::init_falloc(
|
|
MMAP_REQ
|
|
.get_response()
|
|
.get()
|
|
.expect("tried to get memory map from Limine")
|
|
.memmap(),
|
|
);
|
|
|
|
allocator::init();
|
|
gdt::init();
|
|
interrupts::init();
|
|
|
|
static KFILE_REQ: LimineKernelFileRequest = LimineKernelFileRequest::new(0);
|
|
static MOD_REQ: LimineModuleRequest = LimineModuleRequest::new(0);
|
|
crate::kmain::kmain(
|
|
KFILE_REQ
|
|
.get_response()
|
|
.get()
|
|
.and_then(|r| r.kernel_file.get())
|
|
.expect("failed to get kernel file from Limine")
|
|
.cmdline
|
|
.to_str()
|
|
.map(core::ffi::CStr::to_str)
|
|
.transpose()
|
|
.expect("expected valid cmdline string")
|
|
.unwrap_or_default(),
|
|
MOD_REQ
|
|
.get_response()
|
|
.get()
|
|
.and_then(|m| m.modules().get(0))
|
|
.map(|file| unsafe {
|
|
core::slice::from_raw_parts(
|
|
file.base.as_ptr().expect("invalid initrd"),
|
|
file.length as usize,
|
|
)
|
|
}),
|
|
)
|
|
}
|
|
|
|
/// Spin loop
|
|
pub fn sloop() -> ! {
|
|
loop {
|
|
x86_64::instructions::hlt();
|
|
}
|
|
}
|