Compare commits

...

2 commits

Author SHA1 Message Date
gil c70be3fe1f Add trap.rs 2024-05-16 11:21:27 -05:00
gil be4bc6e270 Add to-do and set interrupt CSRs 2024-05-16 10:39:53 -05:00
3 changed files with 21 additions and 2 deletions

View file

@ -6,12 +6,14 @@
use core::panic::PanicInfo;
mod heap;
mod trap;
mod uart;
#[naked]
#[no_mangle]
#[link_section = ".text.init"]
unsafe extern "C" fn _enter() -> ! {
// TODO see if possible to replace this somehow...
use core::arch::asm;
asm!(
// load hartid into t0; if t0 =/= 0, then jump to busy loop
@ -29,9 +31,17 @@ unsafe extern "C" fn _enter() -> ! {
"la gp, _global_pointer",
".option pop", // pops the current option stack
// delegate all traps to S-mode trap handler
"li t5, 0xffff",
"csrw medeleg, t5", // delegate all machine exceptions
"csrw mideleg, t5", // delegate all machine interrupts
// set the stack pointer
"la sp, _init_stack_top",
"la t2, {trap_vector}",
"csrw mtvec, t2",
// clear the BSS
"la t0, _bss_start",
"la t1, _bss_end",
@ -41,8 +51,8 @@ unsafe extern "C" fn _enter() -> ! {
"addi t0, t0, 1",
"bne t0, t1, 1b",
"2:",
// BSS is clear!
"j 4f",
// BSS is clear!
// busy loop if hartid =/= 0
"3:",
@ -53,6 +63,7 @@ unsafe extern "C" fn _enter() -> ! {
// "tail-call" to {start} (call without saving a return address)
"tail {start}",
start = sym start, // {start} refers to the function [start] below
trap_vector = sym trap::trap_handler, // {trap_vector} refers to function [trap::trap_handler]
options(noreturn) // we must handle "returning" from assembly
);
}

View file

@ -38,7 +38,7 @@ SECTIONS {
} >ram AT>ram :bss # and this goes into the bss segment
. = ALIGN(16); # our stack needs to be 16-byte aligned, per the C calling convention
PROVIDE(_init_stack_top = . + 0x1000); # reserve 0x1000 bytes for the initialisation stack
PROVIDE(_init_stack_top = . + 0x1000); # reserve 0x1000 bytes (4 kB) for the initialisation stack
PROVIDE(_kernel_heap_bottom = _init_stack_top); # allocate heap to remaining physical memory
PROVIDE(_kernel_heap_top = ORIGIN(ram) + LENGTH(ram)); # top of heap is end of ram

8
src/trap.rs Normal file
View file

@ -0,0 +1,8 @@
#[naked]
pub unsafe extern "C" fn trap_handler() -> ! {
use core::arch::asm;
asm!(
"mret",
options(noreturn)
);
}