#include #include #include #include #include #include #include void exception_init() { asm volatile( "adr x0, exception_vector_table" ENDL "msr vbar_el1, x0" ENDL ::: "x0" ); } void not_implemented_handler() { DEBUG_EXCEP("not implemented caught"); } void synchronous_handler(trapframe_t *regs) { disable_interrupt(); DEBUG_EXCEP("synchronous caught"); uint64_t x0 = 0x0; R_REG(x0, x0); uint64_t spsr_el1 = 0x0; R_SYSREG(spsr_el1, spsr_el1); uint64_t elr_el1 = 0x0; R_SYSREG(elr_el1, elr_el1); uint64_t esr_el1 = 0x0; R_SYSREG(esr_el1, esr_el1); LOG(x0); LOG(spsr_el1); LOG(elr_el1); DEBUG_EXCEP(esr_el1) switch ((esr_el1 >> 26) & 0x7f) { case 0b010101: syscall_handler(regs); break; default: } }