parent
							
								
									4c1137a107
								
							
						
					
					
						commit
						da6dd763d7
					
				@ -0,0 +1,104 @@
 | 
				
			||||
.macro SAVE_ALL
 | 
				
			||||
    # store sp in sscratch
 | 
				
			||||
    csrw sscratch, sp
 | 
				
			||||
    # provide room for trap frame
 | 
				
			||||
    addi sp, sp, -36 * 4
 | 
				
			||||
    # save x registers except x2 (sp)
 | 
				
			||||
    sw x1, 1*4(sp)
 | 
				
			||||
    sw x3, 3*4(sp)
 | 
				
			||||
    sw x4, 4*4(sp)
 | 
				
			||||
    sw x5, 5*4(sp)
 | 
				
			||||
    sw x6, 6*4(sp)
 | 
				
			||||
    sw x7, 7*4(sp)
 | 
				
			||||
    sw x8, 8*4(sp)
 | 
				
			||||
    sw x9, 9*4(sp)
 | 
				
			||||
    sw x10, 10*4(sp)
 | 
				
			||||
    sw x11, 11*4(sp)
 | 
				
			||||
    sw x12, 12*4(sp)
 | 
				
			||||
    sw x13, 13*4(sp)
 | 
				
			||||
    sw x14, 14*4(sp)
 | 
				
			||||
    sw x15, 15*4(sp)
 | 
				
			||||
    sw x16, 16*4(sp)
 | 
				
			||||
    sw x17, 17*4(sp)
 | 
				
			||||
    sw x18, 18*4(sp)
 | 
				
			||||
    sw x19, 19*4(sp)
 | 
				
			||||
    sw x20, 20*4(sp)
 | 
				
			||||
    sw x21, 21*4(sp)
 | 
				
			||||
    sw x22, 22*4(sp)
 | 
				
			||||
    sw x23, 23*4(sp)
 | 
				
			||||
    sw x24, 24*4(sp)
 | 
				
			||||
    sw x25, 25*4(sp)
 | 
				
			||||
    sw x26, 26*4(sp)
 | 
				
			||||
    sw x27, 27*4(sp)
 | 
				
			||||
    sw x28, 28*4(sp)
 | 
				
			||||
    sw x29, 29*4(sp)
 | 
				
			||||
    sw x30, 30*4(sp)
 | 
				
			||||
    sw x31, 31*4(sp)
 | 
				
			||||
 | 
				
			||||
    # get sp, sstatus, sepc, sbadvaddr, scause
 | 
				
			||||
    csrr s0, sscratch
 | 
				
			||||
    csrr s1, sstatus
 | 
				
			||||
    csrr s2, sepc
 | 
				
			||||
    csrr s3, sbadaddr
 | 
				
			||||
    csrr s4, scause
 | 
				
			||||
    # store sp, sstatus, sepc, sbadvaddr, scause
 | 
				
			||||
    sw s0, 2*4(sp)
 | 
				
			||||
    sw s1, 32*4(sp)
 | 
				
			||||
    sw s2, 33*4(sp)
 | 
				
			||||
    sw s3, 34*4(sp)
 | 
				
			||||
    sw s4, 35*4(sp)
 | 
				
			||||
.endm
 | 
				
			||||
 | 
				
			||||
.macro RESTORE_ALL
 | 
				
			||||
    # sstatus and sepc may be changed in ISR
 | 
				
			||||
    lw s1, 32*4(sp)
 | 
				
			||||
    lw s2, 33*4(sp)
 | 
				
			||||
    csrw sstatus, s1
 | 
				
			||||
    csrw sepc, s2
 | 
				
			||||
 | 
				
			||||
    # restore x registers except x2 (sp)
 | 
				
			||||
    lw x1, 1*4(sp)
 | 
				
			||||
    lw x3, 3*4(sp)
 | 
				
			||||
    lw x4, 4*4(sp)
 | 
				
			||||
    lw x5, 5*4(sp)
 | 
				
			||||
    lw x6, 6*4(sp)
 | 
				
			||||
    lw x7, 7*4(sp)
 | 
				
			||||
    lw x8, 8*4(sp)
 | 
				
			||||
    lw x9, 9*4(sp)
 | 
				
			||||
    lw x10, 10*4(sp)
 | 
				
			||||
    lw x11, 11*4(sp)
 | 
				
			||||
    lw x12, 12*4(sp)
 | 
				
			||||
    lw x13, 13*4(sp)
 | 
				
			||||
    lw x14, 14*4(sp)
 | 
				
			||||
    lw x15, 15*4(sp)
 | 
				
			||||
    lw x16, 16*4(sp)
 | 
				
			||||
    lw x17, 17*4(sp)
 | 
				
			||||
    lw x18, 18*4(sp)
 | 
				
			||||
    lw x19, 19*4(sp)
 | 
				
			||||
    lw x20, 20*4(sp)
 | 
				
			||||
    lw x21, 21*4(sp)
 | 
				
			||||
    lw x22, 22*4(sp)
 | 
				
			||||
    lw x23, 23*4(sp)
 | 
				
			||||
    lw x24, 24*4(sp)
 | 
				
			||||
    lw x25, 25*4(sp)
 | 
				
			||||
    lw x26, 26*4(sp)
 | 
				
			||||
    lw x27, 27*4(sp)
 | 
				
			||||
    lw x28, 28*4(sp)
 | 
				
			||||
    lw x29, 29*4(sp)
 | 
				
			||||
    lw x30, 30*4(sp)
 | 
				
			||||
    lw x31, 31*4(sp)
 | 
				
			||||
    # restore sp last
 | 
				
			||||
    lw x2, 2*4(sp)
 | 
				
			||||
.endm
 | 
				
			||||
 | 
				
			||||
    .section .text
 | 
				
			||||
    .globl __alltraps
 | 
				
			||||
__alltraps:
 | 
				
			||||
    SAVE_ALL
 | 
				
			||||
    move a0, sp
 | 
				
			||||
    jal rust_trap
 | 
				
			||||
    .globl __trapret
 | 
				
			||||
__trapret:
 | 
				
			||||
    RESTORE_ALL
 | 
				
			||||
    # return from supervisor call
 | 
				
			||||
    sret
 | 
				
			||||
@ -0,0 +1,30 @@
 | 
				
			||||
use super::riscv::register::*;
 | 
				
			||||
 | 
				
			||||
pub fn init() {
 | 
				
			||||
    unsafe {
 | 
				
			||||
        // Set the exception vector address
 | 
				
			||||
        stvec::write(__alltraps as usize, stvec::TrapMode::Direct);
 | 
				
			||||
        // Enable interrupt
 | 
				
			||||
        sstatus::set_sie();
 | 
				
			||||
    }
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
#[no_mangle]
 | 
				
			||||
pub extern fn rust_trap(tf: &mut TrapFrame) {
 | 
				
			||||
    println!("Trap:\n{:#x?}", tf);
 | 
				
			||||
    loop {}
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
#[derive(Debug, Clone)]
 | 
				
			||||
#[repr(C)]
 | 
				
			||||
pub struct TrapFrame {
 | 
				
			||||
    x: [usize; 32],
 | 
				
			||||
    sstatus: sstatus::Sstatus,
 | 
				
			||||
    sepc: usize,
 | 
				
			||||
    sbadaddr: usize,
 | 
				
			||||
    scause: scause::Scause,
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
extern {
 | 
				
			||||
    fn __alltraps();
 | 
				
			||||
}
 | 
				
			||||
					Loading…
					
					
				
		Reference in new issue