mod.rs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. use fdt::node::FdtNode;
  2. use log::{debug, info};
  3. use system_error::SystemError;
  4. use crate::{
  5. arch::{driver::sbi::SbiDriver, mm::init::mm_early_init},
  6. driver::{firmware::efi::init::efi_init, open_firmware::fdt::open_firmware_fdt_driver},
  7. init::{boot_params, init::start_kernel},
  8. mm::{memblock::mem_block_manager, PhysAddr, VirtAddr},
  9. print, println,
  10. smp::cpu::ProcessorId,
  11. };
  12. use super::{cpu::init_local_context, interrupt::entry::handle_exception};
  13. #[derive(Debug)]
  14. pub struct ArchBootParams {
  15. /// 启动时的fdt物理地址
  16. pub fdt_paddr: PhysAddr,
  17. pub fdt_vaddr: Option<VirtAddr>,
  18. pub fdt_size: usize,
  19. pub boot_hartid: ProcessorId,
  20. }
  21. impl ArchBootParams {
  22. pub const DEFAULT: Self = ArchBootParams {
  23. fdt_paddr: PhysAddr::new(0),
  24. fdt_vaddr: None,
  25. fdt_size: 0,
  26. boot_hartid: ProcessorId::new(0),
  27. };
  28. pub fn arch_fdt(&self) -> VirtAddr {
  29. // 如果fdt_vaddr为None,则说明还没有进行内核虚拟地址空间的映射,此时返回物理地址
  30. if self.fdt_vaddr.is_none() {
  31. return VirtAddr::new(self.fdt_paddr.data());
  32. }
  33. self.fdt_vaddr.unwrap()
  34. }
  35. }
  36. static mut BOOT_HARTID: u32 = 0;
  37. static mut BOOT_FDT_PADDR: PhysAddr = PhysAddr::new(0);
  38. #[no_mangle]
  39. unsafe extern "C" fn kernel_main(hartid: usize, fdt_paddr: usize) -> ! {
  40. let fdt_paddr = PhysAddr::new(fdt_paddr);
  41. unsafe {
  42. BOOT_HARTID = hartid as u32;
  43. BOOT_FDT_PADDR = fdt_paddr;
  44. }
  45. setup_trap_vector();
  46. start_kernel();
  47. }
  48. /// 设置中断、异常处理函数
  49. fn setup_trap_vector() {
  50. let ptr = handle_exception as *const () as usize;
  51. unsafe {
  52. riscv::register::stvec::write(ptr, riscv::register::stvec::TrapMode::Direct);
  53. // Set sup0 scratch register to 0, indicating to exception vector that
  54. // we are presently executing in kernel.
  55. riscv::register::sscratch::write(0);
  56. }
  57. }
  58. #[inline(never)]
  59. fn print_node(node: FdtNode<'_, '_>, n_spaces: usize) {
  60. (0..n_spaces).for_each(|_| print!(" "));
  61. println!("{}/", node.name);
  62. node.properties().for_each(|p| {
  63. (0..n_spaces + 4).for_each(|_| print!(" "));
  64. if p.name == "compatible" {
  65. println!("{}: {:?}", p.name, p.as_str());
  66. } else {
  67. println!("{}: {:?}", p.name, p.value);
  68. }
  69. });
  70. for child in node.children() {
  71. print_node(child, n_spaces + 4);
  72. }
  73. }
  74. /// 解析fdt,获取内核启动参数
  75. #[inline(never)]
  76. unsafe fn parse_dtb() {
  77. let fdt_paddr = boot_params().read().arch.fdt_paddr;
  78. if fdt_paddr.is_null() {
  79. panic!("Failed to get fdt address!");
  80. }
  81. open_firmware_fdt_driver()
  82. .early_scan_device_tree()
  83. .expect("Failed to scan device tree at boottime.");
  84. }
  85. #[inline(never)]
  86. pub fn early_setup_arch() -> Result<(), SystemError> {
  87. SbiDriver::early_init();
  88. let hartid = unsafe { BOOT_HARTID };
  89. let fdt_paddr = unsafe { BOOT_FDT_PADDR };
  90. let fdt =
  91. unsafe { fdt::Fdt::from_ptr(fdt_paddr.data() as *const u8).expect("Failed to parse fdt!") };
  92. let mut arch_boot_params_guard = boot_params().write();
  93. arch_boot_params_guard.arch.fdt_paddr = fdt_paddr;
  94. arch_boot_params_guard.arch.fdt_size = fdt.total_size();
  95. arch_boot_params_guard.arch.boot_hartid = ProcessorId::new(hartid);
  96. // debug!("fdt_paddr: {:?}, fdt_size: {}", fdt_paddr, fdt.total_size());
  97. drop(arch_boot_params_guard);
  98. info!(
  99. "DragonOS kernel is running on hart {}, fdt address:{:?}",
  100. hartid, fdt_paddr
  101. );
  102. mm_early_init();
  103. print_node(fdt.find_node("/").unwrap(), 0);
  104. unsafe { parse_dtb() };
  105. for x in mem_block_manager().to_iter() {
  106. debug!("before efi: {x:?}");
  107. }
  108. efi_init();
  109. open_firmware_fdt_driver().early_init_fdt_scan_reserved_mem();
  110. return Ok(());
  111. }
  112. #[inline(never)]
  113. pub fn setup_arch() -> Result<(), SystemError> {
  114. init_local_context();
  115. return Ok(());
  116. }
  117. #[inline(never)]
  118. pub fn setup_arch_post() -> Result<(), SystemError> {
  119. // todo
  120. return Ok(());
  121. }