main.rs
1 #![no_std] 2 #![no_main] 3 #![feature(abi_x86_interrupt)] 4 #![feature(ascii_char)] 5 #![allow(clippy::empty_loop)] 6 7 extern crate alloc; 8 9 use alloc::string::String; 10 use bootloader_api::{entry_point, BootInfo}; 11 use core::panic::PanicInfo; 12 use initrd::InitrdFilesystem; 13 14 mod arch; 15 mod driver; 16 mod fs; 17 mod initrd; 18 mod logging; 19 mod memory; 20 21 #[macro_use] 22 extern crate log; 23 pub use log::{debug, error, info, trace, warn}; 24 25 #[panic_handler] 26 fn panic(_info: &PanicInfo) -> ! { 27 error!("{}", _info); 28 loop {} 29 } 30 31 use bootloader_api::config::{BootloaderConfig, Mapping}; 32 33 const UPPER_HALF_START: usize = 0xFFFF800000000000; 34 35 pub static BOOTLOADER_CONFIG: BootloaderConfig = { 36 let mut config = BootloaderConfig::new_default(); 37 config.mappings.physical_memory = Some(Mapping::Dynamic); 38 config.mappings.dynamic_range_start = Some(UPPER_HALF_START as u64); 39 config 40 }; 41 42 entry_point!(main, config = &BOOTLOADER_CONFIG); 43 44 #[no_mangle] 45 pub fn main(_info: &'static mut BootInfo) -> ! { 46 logging::init(); 47 #[cfg(target_arch = "x86_64")] 48 arch::x86::init(); 49 50 memory::init( 51 &_info.memory_regions, 52 _info.physical_memory_offset.into_option().unwrap(), 53 ); 54 55 let initrd = unsafe { 56 InitrdFilesystem::new( 57 _info.ramdisk_addr.into_option().unwrap() as *mut u8, 58 _info.ramdisk_len as usize, 59 ) 60 }; 61 62 let file = initrd.get_file_at_path("initrd/test.txt").unwrap(); 63 64 let content = String::from_utf8(file.content.to_vec()).unwrap(); 65 66 info!("{content}"); 67 info!("looping"); 68 69 loop {} 70 }