static void pht_refill_fail(uintptr_t badvaddr, istate_t *istate) { fault_if_from_uspace(istate, "PHT Refill Exception on %p.", (void *) badvaddr); panic_memtrap(istate, PF_ACCESS_UNKNOWN, badvaddr, "PHT Refill Exception."); }
static void tlb_modified_fail(istate_t *istate) { uintptr_t va = cp0_badvaddr_read(); fault_if_from_uspace(istate, "TLB Modified Exception on %p.", (void *) va); panic_memtrap(istate, PF_ACCESS_WRITE, va, "TLB Modified Exception."); }
static void tlb_invalid_fail(istate_t *istate) { uintptr_t va = cp0_badvaddr_read(); fault_if_from_uspace(istate, "TLB Invalid Exception on %p.", (void *) va); panic_memtrap(istate, PF_ACCESS_UNKNOWN, va, "TLB Invalid Exception."); }
static void nm_fault(unsigned int n, istate_t *istate) { #ifdef CONFIG_FPU_LAZY scheduler_fpu_lazy_request(); #else fault_if_from_uspace(istate, "FPU fault."); panic("FPU fault."); #endif }
static void cpuns_exception(unsigned int n, istate_t *istate) { if (cp0_cause_coperr(cp0_cause_read()) == fpu_cop_id) scheduler_fpu_lazy_request(); else { fault_if_from_uspace(istate, "Unhandled Coprocessor Unusable Exception."); panic_badtrap(istate, n, "Unhandled Coprocessor Unusable Exception."); } }
/** General Protection Fault. * */ static void gp_fault(unsigned int n, istate_t *istate) { if (TASK) { irq_spinlock_lock(&TASK->lock, false); size_t ver = TASK->arch.iomapver; irq_spinlock_unlock(&TASK->lock, false); if (CPU->arch.iomapver_copy != ver) { /* * This fault can be caused by an early access * to I/O port because of an out-dated * I/O Permission bitmap installed on CPU. * Install the fresh copy and restart * the instruction. */ io_perm_bitmap_install(); return; } fault_if_from_uspace(istate, "General protection fault."); } panic_badtrap(istate, n, "General protection fault."); }
/** Handle syscall userspace call */ static void syscall_exception(unsigned int n, istate_t *istate) { fault_if_from_uspace(istate, "Syscall is handled through shortcut."); }
static void unhandled_exception(unsigned int n, istate_t *istate) { fault_if_from_uspace(istate, "Unhandled exception %s.", exctable[n]); panic_badtrap(istate, n, "Unhandled exception %s.", exctable[n]); }
static void ss_fault(unsigned int n, istate_t *istate) { fault_if_from_uspace(istate, "Stack fault."); panic_badtrap(istate, n, "Stack fault."); }
static void de_fault(unsigned int n, istate_t *istate) { fault_if_from_uspace(istate, "Divide error."); panic_badtrap(istate, n, "Divide error."); }
static void null_interrupt(unsigned int n, istate_t *istate) { fault_if_from_uspace(istate, "Unserviced interrupt: %u.", n); panic_badtrap(istate, n, "Unserviced interrupt."); }