|  | @@ -1,6 +1,5 @@
 | 
											
												
													
														|  |  #![no_std]
 |  |  #![no_std]
 | 
											
												
													
														|  |  #![no_main]
 |  |  #![no_main]
 | 
											
												
													
														|  | -#![feature(naked_functions)]
 |  | 
 | 
											
												
													
														|  |  #![allow(static_mut_refs)]
 |  |  #![allow(static_mut_refs)]
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  #[macro_use]
 |  |  #[macro_use]
 | 
											
										
											
												
													
														|  | @@ -30,31 +29,29 @@ const RISCV_IMAGE_MAGIC: u64 = 0x5643534952; /* Magic number, little endian, "RI
 | 
											
												
													
														|  |  const RISCV_IMAGE_MAGIC2: u32 = 0x05435352; /* Magic number 2, little endian, "RSC\x05" */
 |  |  const RISCV_IMAGE_MAGIC2: u32 = 0x05435352; /* Magic number 2, little endian, "RSC\x05" */
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  /// boot header
 |  |  /// boot header
 | 
											
												
													
														|  | -#[naked]
 |  | 
 | 
											
												
													
														|  | 
 |  | +#[unsafe(naked)]
 | 
											
												
													
														|  |  #[unsafe(no_mangle)]
 |  |  #[unsafe(no_mangle)]
 | 
											
												
													
														|  |  #[unsafe(link_section = ".head.text")]
 |  |  #[unsafe(link_section = ".head.text")]
 | 
											
												
													
														|  |  unsafe extern "C" fn _boot_header() -> ! {
 |  |  unsafe extern "C" fn _boot_header() -> ! {
 | 
											
												
													
														|  | -    unsafe {
 |  | 
 | 
											
												
													
														|  | -        naked_asm!(
 |  | 
 | 
											
												
													
														|  | -            "j _start",
 |  | 
 | 
											
												
													
														|  | -            ".word 0",
 |  | 
 | 
											
												
													
														|  | -            ".balign 8",
 |  | 
 | 
											
												
													
														|  | -            ".dword 0x200000",
 |  | 
 | 
											
												
													
														|  | -            ".dword iend - istart",
 |  | 
 | 
											
												
													
														|  | -            ".dword {RISCV_HEAD_FLAGS}",
 |  | 
 | 
											
												
													
														|  | -            ".word  {RISCV_HEADER_VERSION}",
 |  | 
 | 
											
												
													
														|  | -            ".word  0",
 |  | 
 | 
											
												
													
														|  | -            ".dword 0",
 |  | 
 | 
											
												
													
														|  | -            ".dword {RISCV_IMAGE_MAGIC}",
 |  | 
 | 
											
												
													
														|  | -            ".balign 4",
 |  | 
 | 
											
												
													
														|  | -            ".word  {RISCV_IMAGE_MAGIC2}",
 |  | 
 | 
											
												
													
														|  | -            ".word  0",
 |  | 
 | 
											
												
													
														|  | -            RISCV_HEAD_FLAGS = const RISCV_HEAD_FLAGS,
 |  | 
 | 
											
												
													
														|  | -            RISCV_HEADER_VERSION = const RISCV_HEADER_VERSION,
 |  | 
 | 
											
												
													
														|  | -            RISCV_IMAGE_MAGIC = const RISCV_IMAGE_MAGIC,
 |  | 
 | 
											
												
													
														|  | -            RISCV_IMAGE_MAGIC2 = const RISCV_IMAGE_MAGIC2,
 |  | 
 | 
											
												
													
														|  | -        );
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    naked_asm!(
 | 
											
												
													
														|  | 
 |  | +        "j _start",
 | 
											
												
													
														|  | 
 |  | +        ".word 0",
 | 
											
												
													
														|  | 
 |  | +        ".balign 8",
 | 
											
												
													
														|  | 
 |  | +        ".dword 0x200000",
 | 
											
												
													
														|  | 
 |  | +        ".dword iend - istart",
 | 
											
												
													
														|  | 
 |  | +        ".dword {RISCV_HEAD_FLAGS}",
 | 
											
												
													
														|  | 
 |  | +        ".word  {RISCV_HEADER_VERSION}",
 | 
											
												
													
														|  | 
 |  | +        ".word  0",
 | 
											
												
													
														|  | 
 |  | +        ".dword 0",
 | 
											
												
													
														|  | 
 |  | +        ".dword {RISCV_IMAGE_MAGIC}",
 | 
											
												
													
														|  | 
 |  | +        ".balign 4",
 | 
											
												
													
														|  | 
 |  | +        ".word  {RISCV_IMAGE_MAGIC2}",
 | 
											
												
													
														|  | 
 |  | +        ".word  0",
 | 
											
												
													
														|  | 
 |  | +        RISCV_HEAD_FLAGS = const RISCV_HEAD_FLAGS,
 | 
											
												
													
														|  | 
 |  | +        RISCV_HEADER_VERSION = const RISCV_HEADER_VERSION,
 | 
											
												
													
														|  | 
 |  | +        RISCV_IMAGE_MAGIC = const RISCV_IMAGE_MAGIC,
 | 
											
												
													
														|  | 
 |  | +        RISCV_IMAGE_MAGIC2 = const RISCV_IMAGE_MAGIC2,
 | 
											
												
													
														|  | 
 |  | +    );
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  const STACK_SIZE: usize = 512 * 1024; // 512 KiB
 |  |  const STACK_SIZE: usize = 512 * 1024; // 512 KiB
 | 
											
										
											
												
													
														|  | @@ -88,53 +85,47 @@ static mut BOOT_HART_ID: usize = 0;
 | 
											
												
													
														|  |  /// # Safety
 |  |  /// # Safety
 | 
											
												
													
														|  |  ///
 |  |  ///
 | 
											
												
													
														|  |  /// 裸函数。
 |  |  /// 裸函数。
 | 
											
												
													
														|  | -#[naked]
 |  | 
 | 
											
												
													
														|  | 
 |  | +#[unsafe(naked)]
 | 
											
												
													
														|  |  #[unsafe(no_mangle)]
 |  |  #[unsafe(no_mangle)]
 | 
											
												
													
														|  |  #[unsafe(link_section = ".text.entry")]
 |  |  #[unsafe(link_section = ".text.entry")]
 | 
											
												
													
														|  |  unsafe extern "C" fn _start(hartid: usize, device_tree_paddr: usize) -> ! {
 |  |  unsafe extern "C" fn _start(hartid: usize, device_tree_paddr: usize) -> ! {
 | 
											
												
													
														|  | -    unsafe {
 |  | 
 | 
											
												
													
														|  | -        naked_asm!(
 |  | 
 | 
											
												
													
														|  | -            // clear bss segment
 |  | 
 | 
											
												
													
														|  | -            "   la      t0, sbss
 |  | 
 | 
											
												
													
														|  | 
 |  | +    naked_asm!(
 | 
											
												
													
														|  | 
 |  | +        // clear bss segment
 | 
											
												
													
														|  | 
 |  | +        "   la      t0, sbss
 | 
											
												
													
														|  |              la      t1, ebss
 |  |              la      t1, ebss
 | 
											
												
													
														|  |          1:  bgeu    t0, t1, 2f
 |  |          1:  bgeu    t0, t1, 2f
 | 
											
												
													
														|  |              sd      zero, 0(t0)
 |  |              sd      zero, 0(t0)
 | 
											
												
													
														|  |              addi    t0, t0, 8
 |  |              addi    t0, t0, 8
 | 
											
												
													
														|  |              j       1b",
 |  |              j       1b",
 | 
											
												
													
														|  | -            "2:",
 |  | 
 | 
											
												
													
														|  | -            "   la sp, {stack} + {stack_size}",
 |  | 
 | 
											
												
													
														|  | -            "   j  {main}",
 |  | 
 | 
											
												
													
														|  | -            stack_size = const STACK_SIZE,
 |  | 
 | 
											
												
													
														|  | -            stack      =   sym STACK,
 |  | 
 | 
											
												
													
														|  | -            main       =   sym rust_main,
 |  | 
 | 
											
												
													
														|  | -        )
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | 
 |  | +        "2:",
 | 
											
												
													
														|  | 
 |  | +        "   la sp, {stack} + {stack_size}",
 | 
											
												
													
														|  | 
 |  | +        "   j  {main}",
 | 
											
												
													
														|  | 
 |  | +        stack_size = const STACK_SIZE,
 | 
											
												
													
														|  | 
 |  | +        stack      =   sym STACK,
 | 
											
												
													
														|  | 
 |  | +        main       =   sym rust_main,
 | 
											
												
													
														|  | 
 |  | +    )
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -#[naked]
 |  | 
 | 
											
												
													
														|  | 
 |  | +#[unsafe(naked)]
 | 
											
												
													
														|  |  #[unsafe(no_mangle)]
 |  |  #[unsafe(no_mangle)]
 | 
											
												
													
														|  |  extern "C" fn init_hart(hartid: usize, opaque: usize) {
 |  |  extern "C" fn init_hart(hartid: usize, opaque: usize) {
 | 
											
												
													
														|  | -    unsafe {
 |  | 
 | 
											
												
													
														|  | -        naked_asm!(
 |  | 
 | 
											
												
													
														|  | -            "add sp, a1, zero",
 |  | 
 | 
											
												
													
														|  | -            "csrw sscratch, sp",
 |  | 
 | 
											
												
													
														|  | -            "call {init_main}",
 |  | 
 | 
											
												
													
														|  | -            init_main = sym init_main,
 |  | 
 | 
											
												
													
														|  | -        )
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    naked_asm!(
 | 
											
												
													
														|  | 
 |  | +        "add sp, a1, zero",
 | 
											
												
													
														|  | 
 |  | +        "csrw sscratch, sp",
 | 
											
												
													
														|  | 
 |  | +        "call {init_main}",
 | 
											
												
													
														|  | 
 |  | +        init_main = sym init_main,
 | 
											
												
													
														|  | 
 |  | +    )
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -#[naked]
 |  | 
 | 
											
												
													
														|  | 
 |  | +#[unsafe(naked)]
 | 
											
												
													
														|  |  #[unsafe(no_mangle)]
 |  |  #[unsafe(no_mangle)]
 | 
											
												
													
														|  |  extern "C" fn core_send_ipi(hartid: usize, opaque: usize) {
 |  |  extern "C" fn core_send_ipi(hartid: usize, opaque: usize) {
 | 
											
												
													
														|  | -    unsafe {
 |  | 
 | 
											
												
													
														|  | -        naked_asm!(
 |  | 
 | 
											
												
													
														|  | -            "add sp, a1, zero",
 |  | 
 | 
											
												
													
														|  | -            "csrw sscratch, sp",
 |  | 
 | 
											
												
													
														|  | -            "call {send_ipi}",
 |  | 
 | 
											
												
													
														|  | -            send_ipi = sym send_ipi,
 |  | 
 | 
											
												
													
														|  | -        )
 |  | 
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    naked_asm!(
 | 
											
												
													
														|  | 
 |  | +        "add sp, a1, zero",
 | 
											
												
													
														|  | 
 |  | +        "csrw sscratch, sp",
 | 
											
												
													
														|  | 
 |  | +        "call {send_ipi}",
 | 
											
												
													
														|  | 
 |  | +        send_ipi = sym send_ipi,
 | 
											
												
													
														|  | 
 |  | +    )
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  extern "C" fn send_ipi(hartid: usize) -> ! {
 |  |  extern "C" fn send_ipi(hartid: usize) -> ! {
 |