ableos/kernel/src/arch/x86_64/mod.rs

80 lines
2.2 KiB
Rust

use limine::{LimineHhdmRequest, LimineKernelFileRequest, LimineMmapRequest, LimineModuleRequest};
use spin::Mutex;
use uart_16550::SerialPort;
use x86_64::VirtAddr;
use crate::allocator;
mod gdt;
mod interrupts;
mod memory;
static SERIAL_CONSOLE: Mutex<SerialPort> = Mutex::new(unsafe { SerialPort::new(0x3f8) });
#[no_mangle]
unsafe extern "C" fn _kernel_start() -> ! {
static HDHM_REQ: LimineHhdmRequest = LimineHhdmRequest::new(0);
static MMAP_REQ: LimineMmapRequest = LimineMmapRequest::new(0);
static KFILE_REQ: LimineKernelFileRequest = LimineKernelFileRequest::new(0);
static MOD_REQ: LimineModuleRequest = LimineModuleRequest::new(0);
SERIAL_CONSOLE.lock().init();
crate::logger::init().expect("failed to set logger");
log::info!("Initialising AKern {}", crate::VERSION);
memory::init_pt(VirtAddr::new(
HDHM_REQ
.get_response()
.get()
.expect("tried to get physical memory mapping offset from Limine")
.offset,
));
memory::init_falloc(
MMAP_REQ
.get_response()
.get()
.and_then(limine::LimineMemmapResponse::mmap)
.expect("tried to get memory map from Limine"),
);
allocator::init();
gdt::init();
interrupts::init();
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_string()
.unwrap_or_default(),
MOD_REQ
.get_response()
.get()
.and_then(|r| r.modules())
.and_then(|m| m.get(0))
.map(|file| unsafe {
core::slice::from_raw_parts(
file.base.as_ptr().expect("invalid initrd"),
file.length as usize,
)
}),
)
}
/// Format args to serial console
pub fn serial_fmt(args: core::fmt::Arguments<'_>) -> core::fmt::Result {
use core::fmt::Write;
x86_64::instructions::interrupts::without_interrupts(|| SERIAL_CONSOLE.lock().write_fmt(args))
}
/// Spin loop
pub fn sloop() -> ! {
loop {
x86_64::instructions::hlt();
}
}