kernel/kernelvec.S
64 lines
1 #2 # interrupts and exceptions while in supervisor3 # mode come here.4 #5 # the current stack is a kernel stack.6 # push registers, call kerneltrap().7 # when kerneltrap() returns, restore registers, return.8 #9.globl kerneltrap10.globl kernelvec11.align 412kernelvec:13 # make room to save registers.14 addi sp, sp, -2561516 # save caller-saved registers.17 sd ra, 0(sp)18 # sd sp, 8(sp)19 sd gp, 16(sp)20 sd tp, 24(sp)21 sd t0, 32(sp)22 sd t1, 40(sp)23 sd t2, 48(sp)24 sd a0, 72(sp)25 sd a1, 80(sp)26 sd a2, 88(sp)27 sd a3, 96(sp)28 sd a4, 104(sp)29 sd a5, 112(sp)30 sd a6, 120(sp)31 sd a7, 128(sp)32 sd t3, 216(sp)33 sd t4, 224(sp)34 sd t5, 232(sp)35 sd t6, 240(sp)3637 # call the C trap handler in trap.c38 call kerneltrap3940 # restore registers.41 ld ra, 0(sp)42 # ld sp, 8(sp)43 ld gp, 16(sp)44 # not tp (contains hartid), in case we moved CPUs45 ld t0, 32(sp)46 ld t1, 40(sp)47 ld t2, 48(sp)48 ld a0, 72(sp)49 ld a1, 80(sp)50 ld a2, 88(sp)51 ld a3, 96(sp)52 ld a4, 104(sp)53 ld a5, 112(sp)54 ld a6, 120(sp)55 ld a7, 128(sp)56 ld t3, 216(sp)57 ld t4, 224(sp)58 ld t5, 232(sp)59 ld t6, 240(sp)6061 addi sp, sp, 2566263 # return to whatever we were doing in the kernel.64 sret65