diff --git a/Kernel/Source/Arch/Exceptions.c b/Kernel/Source/Arch/Exceptions.c index 70f3a1e..1c4228f 100644 --- a/Kernel/Source/Arch/Exceptions.c +++ b/Kernel/Source/Arch/Exceptions.c @@ -1,9 +1,20 @@ #include #include #include +#include Address ExceptionsHandler(ExceptionsContext* frame, ExceptionsType type) { if (type == ExceptionsIRQEl1h || type == ExceptionsIRQEl064) return GICDispatch(frame, type); + if (type == ExceptionsSyncEl1h || type == ExceptionsSyncEl064) { + UInt32 esr = frame->esr_el1; + UInt32 class = (esr >> 26) & 0x3F; + UInt32 syndrome = esr & 0x1FFFFFF; + + if (class == 0x11 || class == 0x15) { + if (syndrome == kOSSchedulerExceptionNumber) { + return SchedulerNext((Address)frame); + } + } + } OSPanicException(frame); } -