diff --git a/kaleid/kernel/ke/idt.c b/kaleid/kernel/ke/idt.c index c279bde..251cf7a 100644 --- a/kaleid/kernel/ke/idt.c +++ b/kaleid/kernel/ke/idt.c @@ -341,21 +341,7 @@ static void EarlyExceptionHandler(ISRFrame_t *regs) // static void DoubleFaultHandler(ISRFrame_t *regs) { - ulong StackGuardTwo = (ulong)MmGetStackGuards(1); - - if (regs->rsp <= StackGuardTwo + 4*KB && (regs->rsp - 4*KB <= regs->cr2)) { - bprintf(BStdOut, - "\n\n%CPANIC\n[ISR 0x8] Irrecoverable Kernel Stack Overflow\n\n" - " Double Fault Error code : %#x (%b)\n" - " Stack Guard bypassed : %#x", - - VGA_COLOR_LIGHT_RED, - regs->ErrorCode, - regs->ErrorCode, - StackGuardTwo - ); - } else { - bprintf(BStdOut, + bprintf(BStdOut, "\n\n%CPANIC\n[ISR 0x8] Irrecoverable Kernel Double Fault Abort\n\n" " Error code : 0x%x (%b)", @@ -364,8 +350,6 @@ static void DoubleFaultHandler(ISRFrame_t *regs) regs->ErrorCode ); - } - KeBrkDumpRegisters(regs); BStdOut->flusher(BStdOut); diff --git a/kaleid/kernel/mm/gdt.c b/kaleid/kernel/mm/gdt.c index 79f9bc6..8bd426a 100644 --- a/kaleid/kernel/mm/gdt.c +++ b/kaleid/kernel/mm/gdt.c @@ -45,6 +45,10 @@ void MmInitGdt(void) gdt[1].access = 0x98; gdt[1].flags = 0x20; + gdt[2].lowLimit = 0xFFFF; + gdt[2].access = 0x98; + gdt[2].flags = 0x20; + tssDesc.access = 0x89; tssDesc.flags = 0x40; tssDesc.lowBase = (ulong)&tss & 0xFFFF; diff --git a/kaleid/kernel/mm/paging.c b/kaleid/kernel/mm/paging.c index a513d3a..dbd0110 100644 --- a/kaleid/kernel/mm/paging.c +++ b/kaleid/kernel/mm/paging.c @@ -142,7 +142,8 @@ void *MmTranslateKPageToAddr(void *rank) static void PagingHandler(ISRFrame_t *regs) { ulong StackGuardOne = (ulong)MmGetStackGuards(0); - if (regs->cr2 >= StackGuardOne && (regs->rsp + 4*KB >= regs->cr2)) { + ulong StackGuardTwo = (ulong)MmGetStackGuards(1); + if ((regs->cr2 >= StackGuardOne) && (regs->cr2 <= StackGuardOne + 4*KB) && (regs->rsp <= regs->cr2)) { bprintf(BStdOut, "\n\n%CPANIC\n[ISR 0x8] Irrecoverable Kernel Stack Underflow\n\n" " Double Fault Error code : %#x (%b)\n" @@ -153,6 +154,17 @@ static void PagingHandler(ISRFrame_t *regs) regs->ErrorCode, StackGuardOne ); + } else if ((regs->cr2 >= StackGuardTwo) && (regs->cr2 <= StackGuardTwo + 4*KB) && (regs->rsp >= regs->cr2)) { + bprintf(BStdOut, + "\n\n%CPANIC\n[ISR 0x8] Irrecoverable Kernel Stack Overflow\n\n" + " Double Fault Error code : %#x (%b)\n" + " Stack Guard bypassed : %#x", + + VGA_COLOR_LIGHT_RED, + regs->ErrorCode, + regs->ErrorCode, + StackGuardTwo + ); } else { //XXX page fault bprintf(BStdOut, "\n\n%CPANIC\n[ISR 0x%x] Irrecoverable Kernel Page Fault at %p\n\n"