diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/boot.S | 11 | ||||
-rwxr-xr-x | src/main.rs | 28 |
2 files changed, 14 insertions, 25 deletions
diff --git a/src/boot.S b/src/boot.S new file mode 100644 index 0000000..d31e5fe --- /dev/null +++ b/src/boot.S @@ -0,0 +1,11 @@ + .global _start + .section .text.init +_start: + .option push + .option norelax + la gp, __global_pointer$ + .option pop + la sp, _stack_top + + csrr a0, mhartid + tail main diff --git a/src/main.rs b/src/main.rs index c0d41d3..8d95d00 100755 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,11 @@ -#![feature(naked_functions)] - #![no_std] #![no_main] -use core::arch::asm; +use core::arch::global_asm; use gd32vf103_pac::Peripherals; +global_asm!(include_str!("boot.S")); + #[no_mangle] fn main(_hartid: usize) -> ! { // let peripherals = Peripherals::take().unwrap(); @@ -49,28 +49,6 @@ fn main(_hartid: usize) -> ! { } } -#[naked] -#[link_section = ".text.init"] -#[export_name = "_start"] -unsafe extern "C" fn _start() -> ! { - // At boot, the hart is in privilege mode M, mstatus fields MIE - // and MPRV are 0, the pc is set to a reset vector, the mcause - // register specifies why the reset occurred. - // c.f.: [^super::rism2] ยง 3.4 (Reset) - asm!( - ".option push", - ".option norelax", - "la gp, __global_pointer$", - ".option pop", - - "csrr a0, mhartid", - "la sp, _stack_top", - - "tail main", - options(noreturn) - ) -} - #[panic_handler] fn panic(info: &core::panic::PanicInfo) -> ! { if let Some(loc) = info.location() { |