Add trap.rs

This commit is contained in:
gil 2024-05-16 11:21:27 -05:00
parent be4bc6e270
commit c70be3fe1f
3 changed files with 20 additions and 7 deletions

View file

@ -6,6 +6,7 @@
use core::panic::PanicInfo; use core::panic::PanicInfo;
mod heap; mod heap;
mod trap;
mod uart; mod uart;
#[naked] #[naked]
@ -30,9 +31,17 @@ unsafe extern "C" fn _enter() -> ! {
"la gp, _global_pointer", "la gp, _global_pointer",
".option pop", // pops the current option stack ".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 // set the stack pointer
"la sp, _init_stack_top", "la sp, _init_stack_top",
"la t2, {trap_vector}",
"csrw mtvec, t2",
// clear the BSS // clear the BSS
"la t0, _bss_start", "la t0, _bss_start",
"la t1, _bss_end", "la t1, _bss_end",
@ -42,13 +51,8 @@ unsafe extern "C" fn _enter() -> ! {
"addi t0, t0, 1", "addi t0, t0, 1",
"bne t0, t1, 1b", "bne t0, t1, 1b",
"2:", "2:",
// BSS is clear!
// 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
"j 4f", "j 4f",
// BSS is clear!
// busy loop if hartid =/= 0 // busy loop if hartid =/= 0
"3:", "3:",
@ -59,6 +63,7 @@ unsafe extern "C" fn _enter() -> ! {
// "tail-call" to {start} (call without saving a return address) // "tail-call" to {start} (call without saving a return address)
"tail {start}", "tail {start}",
start = sym start, // {start} refers to the function [start] below 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 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 } >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 . = 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_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 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)
);
}