Pārlūkot izejas kodu

change arch riscv64 start stage

Heinz 8 mēneši atpakaļ
vecāks
revīzija
d92ae935f8
3 mainītis faili ar 22 papildinājumiem un 20 dzēšanām
  1. 12 0
      arch/src/riscv64/entry.S
  2. 2 2
      arch/src/riscv64/mod.rs
  3. 8 18
      arch/src/riscv64/start.rs

+ 12 - 0
arch/src/riscv64/entry.S

@@ -0,0 +1,12 @@
+.section .text.entry
+.globl _start
+_start:
+    la sp, boot_stack_top
+    call riscv64_start
+
+.section .bss.stack
+    .globl boot_stack_lower_bound
+boot_stack_lower_bound:
+    .space 4096 * 16
+    .globl boot_stack_top
+boot_stack_top:

+ 2 - 2
arch/src/riscv64/mod.rs

@@ -1,5 +1,5 @@
 mod mm;
-mod entry;
+mod start;
 mod context;
 mod console;
 mod io;
@@ -10,7 +10,7 @@ mod interrupt;
 mod fdt;
 
 pub use self::mm::*;
-pub use self::entry::*;
+pub use self::start::*;
 pub use self::context::*;
 pub use self::console::*;
 pub use self::io::*;

+ 8 - 18
arch/src/riscv64/entry.rs → arch/src/riscv64/start.rs

@@ -5,9 +5,7 @@ use super::{
 };
 
 use core::{
-    arch::naked_asm,
-    ptr::NonNull,
-    sync::atomic::AtomicUsize,
+    arch::global_asm, ptr::NonNull, sync::atomic::AtomicUsize
 };
 use intrusive_list::{container_of, Link};
 use buddy_allocator::{BuddyAllocator, BuddyRawPage};
@@ -19,8 +17,7 @@ use eonix_mm::{
 };
 use spin::Mutex;
 
-#[link_section = ".bss.stack"]
-static mut BOOT_STACK: [u8; 4096 * 16] = [0; 4096 * 16];
+global_asm!("start.S");
 
 static mut PAGES: [RawPage; 1024] = [const { RawPage::new() }; 1024];
 
@@ -202,22 +199,15 @@ extern "C" {
     fn kernel_init();
 }
 
-/// bootstrap in rust
-#[naked]
+/// TODO: 
+/// linker,现在VMA和LMA不对
+/// 现在的地址空间可能要改一改,改回Sv39的,Sv48有点大了
 #[no_mangle]
-#[link_section = ".text.entry"]
-unsafe extern "C" fn _start(hart_id: usize, dtb_addr: usize) -> ! {
-    naked_asm!(
-        "la sp, {stack_top}",
-        "j {start_fn}",
-        stack_top = sym BOOT_STACK,
-        start_fn = sym riscv64_start,
-    )
-}
-
-fn riscv64_start(hart_id: usize, dtb_addr: usize) {
+pub unsafe extern "C" fn riscv64_start(hart_id: usize, dtb_addr: usize) -> ! {
     let num_harts = get_num_harts(dtb_addr);
     config::smp::set_num_harts(num_harts);
     setup_kernel_page_table();
     unsafe { kernel_init() };
+
+    unreachable!();
 }