diff --git a/asm.S b/asm.S index 910d359..db553a8 100644 --- a/asm.S +++ b/asm.S @@ -46,6 +46,21 @@ _abs_start: .cfi_startproc .cfi_undefined ra + // Save boot arguments to RAM if on hartid 0 + csrr t0, mhartid + bnez t0, 1f + la t1, boot_args + STORE a0, 0*REGBYTES(t1) + STORE a1, 1*REGBYTES(t1) + STORE a2, 2*REGBYTES(t1) + STORE a3, 3*REGBYTES(t1) + STORE a4, 4*REGBYTES(t1) + STORE a5, 5*REGBYTES(t1) + STORE a6, 6*REGBYTES(t1) + STORE a7, 7*REGBYTES(t1) + fence rw, rw +1: + csrw mie, 0 csrw mip, 0 @@ -117,6 +132,15 @@ _abs_start: .cfi_endproc +/* + Space to save the value of argument registers at boot +*/ +.section .data +.global boot_args +boot_args: +#define ARGUMENT_REGISTER_COUNT 8 // a0 to a7 +.skip REGBYTES * ARGUMENT_REGISTER_COUNT + /* Trap entry point (_start_trap) diff --git a/bin/riscv32i-unknown-none-elf.a b/bin/riscv32i-unknown-none-elf.a index 50197c5..6cbfb38 100644 Binary files a/bin/riscv32i-unknown-none-elf.a and b/bin/riscv32i-unknown-none-elf.a differ diff --git a/bin/riscv32ic-unknown-none-elf.a b/bin/riscv32ic-unknown-none-elf.a index 0b7f592..65d34cf 100644 Binary files a/bin/riscv32ic-unknown-none-elf.a and b/bin/riscv32ic-unknown-none-elf.a differ diff --git a/bin/riscv32if-unknown-none-elf.a b/bin/riscv32if-unknown-none-elf.a index 18ec3f2..610beed 100644 Binary files a/bin/riscv32if-unknown-none-elf.a and b/bin/riscv32if-unknown-none-elf.a differ diff --git a/bin/riscv32ifc-unknown-none-elf.a b/bin/riscv32ifc-unknown-none-elf.a index 4e8484b..bece4bb 100644 Binary files a/bin/riscv32ifc-unknown-none-elf.a and b/bin/riscv32ifc-unknown-none-elf.a differ diff --git a/bin/riscv32ifd-unknown-none-elf.a b/bin/riscv32ifd-unknown-none-elf.a index 41068e6..721a700 100644 Binary files a/bin/riscv32ifd-unknown-none-elf.a and b/bin/riscv32ifd-unknown-none-elf.a differ diff --git a/bin/riscv32ifdc-unknown-none-elf.a b/bin/riscv32ifdc-unknown-none-elf.a index 223b169..ad8a613 100644 Binary files a/bin/riscv32ifdc-unknown-none-elf.a and b/bin/riscv32ifdc-unknown-none-elf.a differ diff --git a/bin/riscv32im-unknown-none-elf.a b/bin/riscv32im-unknown-none-elf.a index 94f4569..dc3c978 100644 Binary files a/bin/riscv32im-unknown-none-elf.a and b/bin/riscv32im-unknown-none-elf.a differ diff --git a/bin/riscv32imc-unknown-none-elf.a b/bin/riscv32imc-unknown-none-elf.a index f90bcc3..65c17c5 100644 Binary files a/bin/riscv32imc-unknown-none-elf.a and b/bin/riscv32imc-unknown-none-elf.a differ diff --git a/bin/riscv32imf-unknown-none-elf.a b/bin/riscv32imf-unknown-none-elf.a index 2127d91..551821a 100644 Binary files a/bin/riscv32imf-unknown-none-elf.a and b/bin/riscv32imf-unknown-none-elf.a differ diff --git a/bin/riscv32imfc-unknown-none-elf.a b/bin/riscv32imfc-unknown-none-elf.a index 0c15700..10db21f 100644 Binary files a/bin/riscv32imfc-unknown-none-elf.a and b/bin/riscv32imfc-unknown-none-elf.a differ diff --git a/bin/riscv32imfd-unknown-none-elf.a b/bin/riscv32imfd-unknown-none-elf.a index 54fb2a4..8de247a 100644 Binary files a/bin/riscv32imfd-unknown-none-elf.a and b/bin/riscv32imfd-unknown-none-elf.a differ diff --git a/bin/riscv32imfdc-unknown-none-elf.a b/bin/riscv32imfdc-unknown-none-elf.a index e474cce..d8b4c7f 100644 Binary files a/bin/riscv32imfdc-unknown-none-elf.a and b/bin/riscv32imfdc-unknown-none-elf.a differ diff --git a/bin/riscv64i-unknown-none-elf.a b/bin/riscv64i-unknown-none-elf.a index 079f096..60994fe 100644 Binary files a/bin/riscv64i-unknown-none-elf.a and b/bin/riscv64i-unknown-none-elf.a differ diff --git a/bin/riscv64ic-unknown-none-elf.a b/bin/riscv64ic-unknown-none-elf.a index 5cf2c97..a338da9 100644 Binary files a/bin/riscv64ic-unknown-none-elf.a and b/bin/riscv64ic-unknown-none-elf.a differ diff --git a/bin/riscv64if-unknown-none-elf.a b/bin/riscv64if-unknown-none-elf.a index 87f299b..06573eb 100644 Binary files a/bin/riscv64if-unknown-none-elf.a and b/bin/riscv64if-unknown-none-elf.a differ diff --git a/bin/riscv64ifc-unknown-none-elf.a b/bin/riscv64ifc-unknown-none-elf.a index 57101ee..8f970c4 100644 Binary files a/bin/riscv64ifc-unknown-none-elf.a and b/bin/riscv64ifc-unknown-none-elf.a differ diff --git a/bin/riscv64ifd-unknown-none-elf.a b/bin/riscv64ifd-unknown-none-elf.a index a25a69d..aa1af51 100644 Binary files a/bin/riscv64ifd-unknown-none-elf.a and b/bin/riscv64ifd-unknown-none-elf.a differ diff --git a/bin/riscv64ifdc-unknown-none-elf.a b/bin/riscv64ifdc-unknown-none-elf.a index c1e05fc..2a68032 100644 Binary files a/bin/riscv64ifdc-unknown-none-elf.a and b/bin/riscv64ifdc-unknown-none-elf.a differ diff --git a/bin/riscv64im-unknown-none-elf.a b/bin/riscv64im-unknown-none-elf.a index 587320f..e974f29 100644 Binary files a/bin/riscv64im-unknown-none-elf.a and b/bin/riscv64im-unknown-none-elf.a differ diff --git a/bin/riscv64imc-unknown-none-elf.a b/bin/riscv64imc-unknown-none-elf.a index fb5d641..b97ed57 100644 Binary files a/bin/riscv64imc-unknown-none-elf.a and b/bin/riscv64imc-unknown-none-elf.a differ diff --git a/bin/riscv64imf-unknown-none-elf.a b/bin/riscv64imf-unknown-none-elf.a index a9ebfed..3ec35ad 100644 Binary files a/bin/riscv64imf-unknown-none-elf.a and b/bin/riscv64imf-unknown-none-elf.a differ diff --git a/bin/riscv64imfc-unknown-none-elf.a b/bin/riscv64imfc-unknown-none-elf.a index 680159a..02f9189 100644 Binary files a/bin/riscv64imfc-unknown-none-elf.a and b/bin/riscv64imfc-unknown-none-elf.a differ diff --git a/bin/riscv64imfd-unknown-none-elf.a b/bin/riscv64imfd-unknown-none-elf.a index d4f5169..5ff1d28 100644 Binary files a/bin/riscv64imfd-unknown-none-elf.a and b/bin/riscv64imfd-unknown-none-elf.a differ diff --git a/bin/riscv64imfdc-unknown-none-elf.a b/bin/riscv64imfdc-unknown-none-elf.a index 8141df3..8107d54 100644 Binary files a/bin/riscv64imfdc-unknown-none-elf.a and b/bin/riscv64imfdc-unknown-none-elf.a differ diff --git a/src/lib.rs b/src/lib.rs index 50b86cd..8e0f991 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -353,8 +353,13 @@ extern "C" { // Initial values of the .data section (stored in Flash) static _sidata: u32; + + static boot_args: [usize; ARGUMENT_REGISTERS_COUNT]; } +/// a0 to a7 +const ARGUMENT_REGISTERS_COUNT: usize = 8; + /// Rust entry point (_start_rust) /// /// Zeros bss section, initializes data section and calls main. This function @@ -389,6 +394,18 @@ pub unsafe extern "C" fn start_rust() -> ! { main(); } +/// Returns the value an argument register had when this firmware was first booted. +/// +/// The argument registers are `a0` to `a7`, indexed 0 to 7. +/// This returns `None` for an out-of-bounds index. +/// +/// Some of these registers may have had values passed by the previous boot stage: +/// . +/// Otherwise, the returned `usize` value is undefined. +pub fn boot_argument(index: usize) -> Option { + unsafe { boot_args.get(index).copied() } +} + /// Registers saved in trap handler #[allow(missing_docs)] #[repr(C)]