/ kernel / src / main.rs
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  }