#include #include #include static const ASCII* GetExceptionClassString(UInt32 class) { switch (class) { case 0x00: return "Unknown reason"; case 0x01: return "Trapped WFI | WFE instruction"; case 0x07: return "Trapped SIMD | FP instruction"; case 0x11: return "SVC from EL1"; case 0x15: return "SVC from EL0"; case 0x20: return "Instruction abort (LoEL)"; // User Execute Fault case 0x21: return "Instruction abort (CurrEL)"; // Kernel Execute Fault case 0x22: return "PC Alignment Fault"; // Jumped to a misaligned address case 0x24: return "Data abort (LoEL)"; // User Memory Fault case 0x25: return "Data abort (CurrEL)"; // Kernel Memory Fault case 0x26: return "SP Alignment Fault"; // SP must be 16-byte aligned case 0x3C: return "Breakpoint"; default: return "Reserved"; } } __attribute__((noreturn)) void OSPanicException(ExceptionsContext* frame) { UInt32 esr = frame->esr_el1; UInt32 class = (esr >> 26) & 0x3F; // Exception class (Bits 31:26) UInt32 length = (esr >> 25) & 0x1; // Instruction length (Bit 25) UInt32 syndrome = esr & 0x1FFFFFF; // Syndrome (Bits 24:0) // i cant show any info since i have no formatter yet :( IOSerialPutString("\n-------------------\n"); IOSerialPutString("Kernel Panic! :(\n"); IOSerialPutString("-------------------\n"); IOSerialPutString("CPU Exception: "); IOSerialPutString(GetExceptionClassString(class)); IOSerialPutString("\n-------------------\n"); IOSerialPutString("System halted.\n"); while (1) { CPUDisableInterrupts(); CPUWaitForInterrupt(); } }