static void handle_illegal_instruction(trapframe_t* tf) { tf->insn = *(uint16_t*)tf->epc; int len = insn_len(tf->insn); if (len == 4) tf->insn |= ((uint32_t)*(uint16_t*)(tf->epc + 2) << 16); else kassert(len == 2); dump_tf(tf); panic("An illegal instruction was executed!"); }
static void handle_misaligned_store(trapframe_t* tf) { dump_tf(tf); panic("Misaligned AMO!"); }
static void segfault(trapframe_t* tf, uintptr_t addr, const char* type) { dump_tf(tf); const char* who = (tf->status & SSTATUS_SPP) ? "Kernel" : "User"; panic("%s %s segfault @ %p", who, type, addr); }
static void handle_breakpoint(trapframe_t* tf) { dump_tf(tf); printk("Breakpoint!\n"); tf->epc += 4; }
static void handle_misaligned_fetch(trapframe_t* tf) { dump_tf(tf); panic("Misaligned instruction access!"); }
static void handle_instruction_access_fault(trapframe_t *tf) { dump_tf(tf); panic("Instruction access fault!"); }
static void handle_misaligned_load(trapframe_t* tf) { dump_tf(tf); panic("Misaligned Load!"); }
static void handle_store_access_fault(trapframe_t *tf) { dump_tf(tf); panic("Store/AMO access fault!"); }
static void handle_load_access_fault(trapframe_t *tf) { dump_tf(tf); panic("Load access fault!"); }
void handle_misaligned_load(trapframe_t* tf) { // TODO emulate misaligned loads and stores dump_tf(tf); panic("Misaligned load!"); }