aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/boot.S11
-rwxr-xr-xsrc/main.rs28
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() {