1 use core::sync::atomic::{compiler_fence, Ordering}; 2 3 use system_error::SystemError; 4 use x86::dtables::DescriptorTablePointer; 5 6 use crate::{ 7 arch::{interrupt::trap::arch_trap_init, process::table::TSSManager}, 8 init::init::start_kernel, 9 kdebug, 10 mm::{MemoryManagementArch, PhysAddr}, 11 }; 12 13 use super::{ 14 driver::{ 15 hpet::{hpet_init, hpet_instance}, 16 tsc::TSCManager, 17 }, 18 MMArch, 19 }; 20 21 #[derive(Debug)] 22 pub struct ArchBootParams {} 23 24 impl ArchBootParams { 25 pub const DEFAULT: Self = ArchBootParams {}; 26 } 27 28 extern "C" { 29 static mut GDT_Table: [usize; 0usize]; 30 static mut IDT_Table: [usize; 0usize]; 31 fn head_stack_start(); 32 33 fn multiboot2_init(mb2_info: u64, mb2_magic: u32) -> bool; 34 } 35 36 #[no_mangle] 37 unsafe extern "C" fn kernel_main( 38 mb2_info: u64, 39 mb2_magic: u64, 40 bsp_gdt_size: u64, 41 bsp_idt_size: u64, 42 ) -> ! { 43 let mut gdtp = DescriptorTablePointer::<usize>::default(); 44 let gdt_vaddr = 45 MMArch::phys_2_virt(PhysAddr::new(&GDT_Table as *const usize as usize)).unwrap(); 46 let idt_vaddr = 47 MMArch::phys_2_virt(PhysAddr::new(&IDT_Table as *const usize as usize)).unwrap(); 48 gdtp.base = gdt_vaddr.data() as *const usize; 49 gdtp.limit = bsp_gdt_size as u16 - 1; 50 51 let idtp = DescriptorTablePointer::<usize> { 52 base: idt_vaddr.data() as *const usize, 53 limit: bsp_idt_size as u16 - 1, 54 }; 55 56 x86::dtables::lgdt(&gdtp); 57 x86::dtables::lidt(&idtp); 58 59 compiler_fence(Ordering::SeqCst); 60 multiboot2_init(mb2_info, (mb2_magic & 0xFFFF_FFFF) as u32); 61 compiler_fence(Ordering::SeqCst); 62 63 start_kernel(); 64 } 65 66 /// 在内存管理初始化之前的架构相关的早期初始化 67 #[inline(never)] 68 pub fn early_setup_arch() -> Result<(), SystemError> { 69 let stack_start = unsafe { *(head_stack_start as *const u64) } as usize; 70 kdebug!("head_stack_start={:#x}\n", stack_start); 71 unsafe { 72 let gdt_vaddr = 73 MMArch::phys_2_virt(PhysAddr::new(&GDT_Table as *const usize as usize)).unwrap(); 74 let idt_vaddr = 75 MMArch::phys_2_virt(PhysAddr::new(&IDT_Table as *const usize as usize)).unwrap(); 76 77 kdebug!("GDT_Table={:?}, IDT_Table={:?}\n", gdt_vaddr, idt_vaddr); 78 } 79 80 set_current_core_tss(stack_start, 0); 81 unsafe { TSSManager::load_tr() }; 82 arch_trap_init().expect("arch_trap_init failed"); 83 84 return Ok(()); 85 } 86 87 /// 架构相关的初始化 88 #[inline(never)] 89 pub fn setup_arch() -> Result<(), SystemError> { 90 return Ok(()); 91 } 92 93 /// 架构相关的初始化(在IDLE的最后一个阶段) 94 #[inline(never)] 95 pub fn setup_arch_post() -> Result<(), SystemError> { 96 hpet_init().expect("hpet init failed"); 97 hpet_instance().hpet_enable().expect("hpet enable failed"); 98 TSCManager::init().expect("tsc init failed"); 99 100 return Ok(()); 101 } 102 103 fn set_current_core_tss(stack_start: usize, ist0: usize) { 104 let current_tss = unsafe { TSSManager::current_tss() }; 105 kdebug!( 106 "set_current_core_tss: stack_start={:#x}, ist0={:#x}\n", 107 stack_start, 108 ist0 109 ); 110 current_tss.set_rsp(x86::Ring::Ring0, stack_start as u64); 111 current_tss.set_ist(0, ist0 as u64); 112 } 113