#include #include #include #include #include /* WIP: only works while interrupting Xen context */ ENTRY(handle_trap) /* Exceptions from xen */ save_to_stack: /* Save context to stack */ REG_S sp, (CPU_USER_REGS_SP - CPU_USER_REGS_SIZE) (sp) addi sp, sp, -CPU_USER_REGS_SIZE REG_S t0, CPU_USER_REGS_T0(sp) /* Save registers */ REG_S ra, CPU_USER_REGS_RA(sp) REG_S gp, CPU_USER_REGS_GP(sp) REG_S t1, CPU_USER_REGS_T1(sp) REG_S t2, CPU_USER_REGS_T2(sp) REG_S s0, CPU_USER_REGS_S0(sp) REG_S s1, CPU_USER_REGS_S1(sp) REG_S a0, CPU_USER_REGS_A0(sp) REG_S a1, CPU_USER_REGS_A1(sp) REG_S a2, CPU_USER_REGS_A2(sp) REG_S a3, CPU_USER_REGS_A3(sp) REG_S a4, CPU_USER_REGS_A4(sp) REG_S a5, CPU_USER_REGS_A5(sp) REG_S a6, CPU_USER_REGS_A6(sp) REG_S a7, CPU_USER_REGS_A7(sp) REG_S s2, CPU_USER_REGS_S2(sp) REG_S s3, CPU_USER_REGS_S3(sp) REG_S s4, CPU_USER_REGS_S4(sp) REG_S s5, CPU_USER_REGS_S5(sp) REG_S s6, CPU_USER_REGS_S6(sp) REG_S s7, CPU_USER_REGS_S7(sp) REG_S s8, CPU_USER_REGS_S8(sp) REG_S s9, CPU_USER_REGS_S9(sp) REG_S s10,CPU_USER_REGS_S10(sp) REG_S s11,CPU_USER_REGS_S11(sp) REG_S t3, CPU_USER_REGS_T3(sp) REG_S t4, CPU_USER_REGS_T4(sp) REG_S t5, CPU_USER_REGS_T5(sp) REG_S t6, CPU_USER_REGS_T6(sp) csrr t0, CSR_SEPC REG_S t0, CPU_USER_REGS_SEPC(sp) csrr t0, CSR_SSTATUS REG_S t0, CPU_USER_REGS_SSTATUS(sp) mv a0, sp jal do_trap restore_registers: /* Restore stack_cpu_regs */ REG_L t0, CPU_USER_REGS_SEPC(sp) csrw CSR_SEPC, t0 REG_L t0, CPU_USER_REGS_SSTATUS(sp) csrw CSR_SSTATUS, t0 REG_L ra, CPU_USER_REGS_RA(sp) REG_L gp, CPU_USER_REGS_GP(sp) REG_L t0, CPU_USER_REGS_T0(sp) REG_L t1, CPU_USER_REGS_T1(sp) REG_L t2, CPU_USER_REGS_T2(sp) REG_L s0, CPU_USER_REGS_S0(sp) REG_L s1, CPU_USER_REGS_S1(sp) REG_L a0, CPU_USER_REGS_A0(sp) REG_L a1, CPU_USER_REGS_A1(sp) REG_L a2, CPU_USER_REGS_A2(sp) REG_L a3, CPU_USER_REGS_A3(sp) REG_L a4, CPU_USER_REGS_A4(sp) REG_L a5, CPU_USER_REGS_A5(sp) REG_L a6, CPU_USER_REGS_A6(sp) REG_L a7, CPU_USER_REGS_A7(sp) REG_L s2, CPU_USER_REGS_S2(sp) REG_L s3, CPU_USER_REGS_S3(sp) REG_L s4, CPU_USER_REGS_S4(sp) REG_L s5, CPU_USER_REGS_S5(sp) REG_L s6, CPU_USER_REGS_S6(sp) REG_L s7, CPU_USER_REGS_S7(sp) REG_L s8, CPU_USER_REGS_S8(sp) REG_L s9, CPU_USER_REGS_S9(sp) REG_L s10, CPU_USER_REGS_S10(sp) REG_L s11, CPU_USER_REGS_S11(sp) REG_L t3, CPU_USER_REGS_T3(sp) REG_L t4, CPU_USER_REGS_T4(sp) REG_L t5, CPU_USER_REGS_T5(sp) REG_L t6, CPU_USER_REGS_T6(sp) /* Restore sp */ REG_L sp, CPU_USER_REGS_SP(sp) sret