From 76f5af7d3094e4c22664aaada6d501ed07020711 Mon Sep 17 00:00:00 2001 From: WangRunji Date: Sat, 14 Jul 2018 17:58:33 +0800 Subject: [PATCH] Merge `rust_main`. Change the way to pass multiboot info address. --- kernel/src/arch/x86_64/boot/boot.asm | 2 +- kernel/src/arch/x86_64/mod.rs | 10 ++++++++-- kernel/src/lib.rs | 20 ++------------------ 3 files changed, 11 insertions(+), 21 deletions(-) diff --git a/kernel/src/arch/x86_64/boot/boot.asm b/kernel/src/arch/x86_64/boot/boot.asm index bfee356..c72f4bf 100644 --- a/kernel/src/arch/x86_64/boot/boot.asm +++ b/kernel/src/arch/x86_64/boot/boot.asm @@ -7,7 +7,7 @@ section .text bits 32 start: mov esp, stack_top - mov edi, ebx ; move Multiboot info pointer to edi + push ebx ; push Multiboot info pointer to stack_top call check_multiboot call check_cpuid diff --git a/kernel/src/arch/x86_64/mod.rs b/kernel/src/arch/x86_64/mod.rs index 58b1ee3..291f660 100644 --- a/kernel/src/arch/x86_64/mod.rs +++ b/kernel/src/arch/x86_64/mod.rs @@ -11,9 +11,15 @@ pub mod idt; pub mod smp; pub mod memory; -pub fn init(multiboot_information_address: usize) { +pub fn init() { idt::init(); - let boot_info = unsafe { multiboot2::load(multiboot_information_address) }; + // Load boot info address from stack_top. + // See `boot.asm` + extern { + fn stack_top(); + } + let boot_info_addr = unsafe { *(stack_top as *const u32).offset(-1) } as usize; + let boot_info = unsafe { multiboot2::load(boot_info_addr) }; let rsdt_addr = boot_info.rsdp_v1_tag().unwrap().rsdt_address(); memory::init(boot_info); // Now heap is available diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs index a92c59e..d48eb1a 100644 --- a/kernel/src/lib.rs +++ b/kernel/src/lib.rs @@ -76,32 +76,16 @@ mod arch; #[path = "arch/riscv32/mod.rs"] mod arch; -#[no_mangle] -#[cfg(target_arch = "riscv")] -pub extern fn rust_main() -> ! { - logging::init(); - arch::init(); - info!("RISCV init end"); - process::init(); - fs::load_sfs(); - unsafe { arch::interrupt::enable(); } - loop {} -} - /// The entry point of Rust kernel #[no_mangle] -#[cfg(target_arch = "x86_64")] -pub extern "C" fn rust_main(multiboot_information_address: usize) -> ! { +pub extern "C" fn rust_main() -> ! { // ATTENTION: we have a very small stack and no guard page println!("Hello World{}", "!"); logging::init(); - arch::init(multiboot_information_address); - + arch::init(); process::init(); - fs::load_sfs(); - unsafe { arch::interrupt::enable(); } // thread::test::local_key();