diff -r 2b433474f2ba -r 957c583b417b kernel/eka/nkernsmp/x86/vectors.cia --- a/kernel/eka/nkernsmp/x86/vectors.cia Tue Sep 28 15:28:31 2010 +0100 +++ b/kernel/eka/nkernsmp/x86/vectors.cia Mon Oct 04 12:03:52 2010 +0100 @@ -514,9 +514,17 @@ asm("add eax, 8 "); // EAX = ESP at point of exception if ring 3 asm("mov cx, %0" : : "i" (KRing0DS)); asm("mov gs, cx "); // exception in user mode -> GS = user mode DS + asm("mov [ebp], eax "); + asm("jmp short ring3_exception "); + asm("ring0_exception: "); asm("mov [ebp], eax "); + asm("cmp dword ptr [ebp+%0], 13 " : : "i" _FOFF(TX86ExcInfo, iExcId)); // check for GPF + asm("jnz short ring3_exception "); + asm("cmp dword ptr [ebp+%0], 0x7fa " : : "i" _FOFF(TX86ExcInfo, iExcErrorCode)); // check for int 0xff + asm("jz short fatal_exception_crash "); // explicit crash instruction, so die immediately + asm("ring3_exception: "); asm("cmp dword ptr [esi+%0], -1 " : : "i" _FOFF(TSubScheduler, iSSX.iIrqNestCount)); asm("jnz short fatal_exception_irq "); asm("cmp dword ptr [esi+%0], 0 " : : "i" _FOFF(TSubScheduler, iKernLockCount)); @@ -567,6 +575,7 @@ asm("fatal_exception_irq: "); asm("fatal_exception_locked: "); + asm("fatal_exception_crash: "); asm("mov eax, %0" : : "i" (addressof_TheScheduler)); asm("lea eax, [eax+%0]" : : "i" _FOFF(TScheduler,iMonitorExceptionHandler)); asm("mov eax, [eax] ");