#![no_std] #![no_main] use limine::BaseRevision; use xv1_kernel::drawing::framebuffer::set_fb_data; use core::fmt::Write; use xv1_kernel::serial; use core::panic::PanicInfo; use limine::request::{FramebufferRequest, HhdmRequest}; use limine::{RequestsEndMarker, RequestsStartMarker}; #[used] #[unsafe(link_section = ".requests")] pub static BASE_REVISION: BaseRevision = BaseRevision::new(); #[used] #[unsafe(link_section = ".requests")] pub static FRAMEBUFFER_REQUEST: FramebufferRequest = FramebufferRequest::new(); #[used] #[unsafe(link_section = ".requests")] pub static HHDM_REQUEST: HhdmRequest = HhdmRequest::new(); /// Define the start and end markers for Limine requests. #[used] #[unsafe(link_section = ".requests_start_marker")] static _START_MARKER: RequestsStartMarker = RequestsStartMarker::new(); #[used] #[unsafe(link_section = ".requests_end_marker")] static _END_MARKER: RequestsEndMarker = RequestsEndMarker::new(); #[unsafe(no_mangle)] unsafe extern "C" fn kmain() -> ! { assert!(BASE_REVISION.is_supported()); serial!("Hello from xv1!"); let fb = set_fb_data(&FRAMEBUFFER_REQUEST); let white = (255u32 << fb.red_mask_shift) | (255u32 << fb.green_mask_shift) | (255u32 << fb.blue_mask_shift); unsafe { (fb.base as *mut u32).write_volatile(white); } loop { x86_64::instructions::hlt(); } } #[panic_handler] fn panic(info: &PanicInfo) -> ! { let mut serial = unsafe { uart_16550::Uart16550Tty::new_port(0x3F8, uart_16550::Config::default()) }; if let Ok(s) = serial.as_mut() { let _ = writeln!(s, "PANIC: {info}"); } loop { x86_64::instructions::hlt(); } } pub fn hhdm_offset() -> u64 { HHDM_REQUEST.response().expect("No HHDM response :(").offset }