xref: /DragonOS/kernel/src/arch/x86_64/init/mod.rs (revision 731bc2b32d7b37298883d7a15b6dca659b436ee4)
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