- Convert 8, 9, 10, 15/F

svn path=/trunk/; revision=23634
This commit is contained in:
Alex Ionescu 2006-08-21 03:01:47 +00:00
parent 162d423eff
commit 03f23a9e0a
2 changed files with 52 additions and 263 deletions

View file

@ -181,215 +181,6 @@ KiKernelTrapHandler(PKTRAP_FRAME Tf, ULONG ExceptionNr, PVOID Cr2)
return(0);
}
VOID
KiDoubleFaultHandler(VOID)
{
#if 0
unsigned int cr2;
ULONG StackLimit;
ULONG StackBase;
ULONG Esp0;
ULONG ExceptionNr = 8;
KTSS* OldTss;
PULONG Frame;
ULONG OldCr3;
#if 0
ULONG i, j;
static PVOID StackTrace[MM_STACK_SIZE / sizeof(PVOID)];
static ULONG StackRepeatCount[MM_STACK_SIZE / sizeof(PVOID)];
static ULONG StackRepeatLength[MM_STACK_SIZE / sizeof(PVOID)];
ULONG TraceLength;
BOOLEAN FoundRepeat;
#endif
OldTss = KeGetCurrentKPCR()->TSS;
Esp0 = OldTss->Esp0;
/* Get CR2 */
cr2 = Ke386GetCr2();
if (PsGetCurrentThread() != NULL &&
PsGetCurrentThread()->ThreadsProcess != NULL)
{
OldCr3 = (ULONG)
PsGetCurrentThread()->ThreadsProcess->Pcb.DirectoryTableBase.QuadPart;
}
else
{
OldCr3 = 0xBEADF0AL;
}
/*
* Check for stack underflow
*/
if (PsGetCurrentThread() != NULL &&
Esp0 < (ULONG)PsGetCurrentThread()->Tcb.StackLimit)
{
DbgPrint("Stack underflow (tf->esp %x Limit %x)\n",
Esp0, (ULONG)PsGetCurrentThread()->Tcb.StackLimit);
ExceptionNr = 12;
}
/*
* Print out the CPU registers
*/
if (ExceptionNr < ARRAY_SIZE(ExceptionTypeStrings))
{
DbgPrint("%s Exception: %d(%x)\n", ExceptionTypeStrings[ExceptionNr],
ExceptionNr, 0);
}
else
{
DbgPrint("Exception: %d(%x)\n", ExceptionNr, 0);
}
DbgPrint("CS:EIP %x:%x ", OldTss->Cs, OldTss->Eip);
KeRosPrintAddress((PVOID)OldTss->Eip);
DbgPrint("\n");
DbgPrint("cr2 %x cr3 %x ", cr2, OldCr3);
DbgPrint("Proc: %x ",PsGetCurrentProcess());
if (PsGetCurrentProcess() != NULL)
{
DbgPrint("Pid: %x <", PsGetCurrentProcess()->UniqueProcessId);
DbgPrint("%.16s> ", PsGetCurrentProcess()->ImageFileName);
}
if (PsGetCurrentThread() != NULL)
{
DbgPrint("Thrd: %x Tid: %x",
PsGetCurrentThread(),
PsGetCurrentThread()->Cid.UniqueThread);
}
DbgPrint("\n");
DbgPrint("DS %x ES %x FS %x GS %x\n", OldTss->Ds, OldTss->Es,
OldTss->Fs, OldTss->Gs);
DbgPrint("EAX: %.8x EBX: %.8x ECX: %.8x\n", OldTss->Eax, OldTss->Ebx,
OldTss->Ecx);
DbgPrint("EDX: %.8x EBP: %.8x ESI: %.8x\nESP: %.8x ", OldTss->Edx,
OldTss->Ebp, OldTss->Esi, Esp0);
DbgPrint("EDI: %.8x EFLAGS: %.8x ", OldTss->Edi, OldTss->Eflags);
if (OldTss->Cs == KGDT_R0_CODE)
{
DbgPrint("kESP %.8x ", Esp0);
if (PsGetCurrentThread() != NULL)
{
DbgPrint("kernel stack base %x\n",
PsGetCurrentThread()->Tcb.StackLimit);
}
}
else
{
DbgPrint("User ESP %.8x\n", OldTss->Esp);
}
if ((OldTss->Cs & 0xffff) == KGDT_R0_CODE)
{
if (PsGetCurrentThread() != NULL)
{
StackLimit = (ULONG)PsGetCurrentThread()->Tcb.StackBase;
StackBase = (ULONG)PsGetCurrentThread()->Tcb.StackLimit;
}
else
{
StackLimit = (ULONG)init_stack_top;
StackBase = (ULONG)init_stack;
}
/*
Change to an #if 0 to reduce the amount of information printed on
a recursive stack trace.
*/
#if 1
DbgPrint("Frames: ");
Frame = (PULONG)OldTss->Ebp;
while (Frame != NULL && (ULONG)Frame >= StackBase)
{
KeRosPrintAddress((PVOID)Frame[1]);
Frame = (PULONG)Frame[0];
DbgPrint("\n");
}
#else
DbgPrint("Frames: ");
i = 0;
Frame = (PULONG)OldTss->Ebp;
while (Frame != NULL && (ULONG)Frame >= StackBase)
{
StackTrace[i] = (PVOID)Frame[1];
Frame = (PULONG)Frame[0];
i++;
}
TraceLength = i;
i = 0;
while (i < TraceLength)
{
StackRepeatCount[i] = 0;
j = i + 1;
FoundRepeat = FALSE;
while ((j - i) <= (TraceLength - j) && FoundRepeat == FALSE)
{
if (memcmp(&StackTrace[i], &StackTrace[j],
(j - i) * sizeof(PVOID)) == 0)
{
StackRepeatCount[i] = 2;
StackRepeatLength[i] = j - i;
FoundRepeat = TRUE;
}
else
{
j++;
}
}
if (FoundRepeat == FALSE)
{
i++;
continue;
}
j = j + StackRepeatLength[i];
while ((TraceLength - j) >= StackRepeatLength[i] &&
FoundRepeat == TRUE)
{
if (memcmp(&StackTrace[i], &StackTrace[j],
StackRepeatLength[i] * sizeof(PVOID)) == 0)
{
StackRepeatCount[i]++;
j = j + StackRepeatLength[i];
}
else
{
FoundRepeat = FALSE;
}
}
i = j;
}
i = 0;
while (i < TraceLength)
{
if (StackRepeatCount[i] == 0)
{
KeRosPrintAddress(StackTrace[i]);
i++;
}
else
{
DbgPrint("{");
if (StackRepeatLength[i] == 0)
{
for(;;);
}
for (j = 0; j < StackRepeatLength[i]; j++)
{
KeRosPrintAddress(StackTrace[i + j]);
}
DbgPrint("}*%d", StackRepeatCount[i]);
i = i + StackRepeatLength[i] * StackRepeatCount[i];
}
}
#endif
}
#endif
DbgPrint("\n");
for(;;);
}
VOID
NTAPI
KiDumpTrapFrame(PKTRAP_FRAME Tf, ULONG Parameter1, ULONG Parameter2)

View file

@ -41,7 +41,7 @@ idt _KiTrap11, INT_32_DPL0 /* INT 0B: Segment Not Present (#NP) */
idt _KiTrap12, INT_32_DPL0 /* INT 0C: Stack Fault Exception (#SS) */
idt _KiTrap13, INT_32_DPL0 /* INT 0D: General Protection (#GP) */
idt _KiTrap14, INT_32_DPL0 /* INT 0E: Page-Fault Exception (#PF) */
idt _KiTrap15, INT_32_DPL0 /* INT 0F: RESERVED [FIXME: HBIRR HACK] */
idt _KiTrap0F, INT_32_DPL0 /* INT 0F: RESERVED */
idt _KiTrap16, INT_32_DPL0 /* INT 10: x87 FPU Error (#MF) */
idt _KiTrap17, INT_32_DPL0 /* INT 11: Align Check Exception (#AC) */
idt _KiTrap0F, INT_32_DPL0 /* INT 12: Machine Check Exception (#MC)*/
@ -1143,10 +1143,19 @@ BogusTrap:
.endfunc
.globl _KiTrap8
.func KiTrap8
_KiTrap8:
call _KiDoubleFaultHandler
iret
/* Can't really do too much */
push 0
push 0
push 0
push 8
push UNEXPECTED_KERNEL_MODE_TRAP
call _KeBugCheckEx@20
.endfunc
.func KiTrap9
_KiTrap9:
/* Push error code */
push 0
@ -1154,37 +1163,48 @@ _KiTrap9:
/* Enter trap */
TRAP_PROLOG(9)
/* Call the C exception handler */
/* Enable interrupts and bugcheck */
sti
push 0
push 0
push 0
push 9
push ebp
call _KiTrapHandler
add esp, 8
push UNEXPECTED_KERNEL_MODE_TRAP
call _KeBugCheckEx@20
.endfunc
/* Check for v86 recovery */
cmp eax, 1
/* Return to caller */
jne _Kei386EoiHelper@0
jmp _KiV86Complete
#if 1
.func KiTrap10
_KiTrap10:
/* Enter trap */
TRAP_PROLOG(10)
/* Call the C exception handler */
/* Check for V86 */
test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAGS_V86_MASK
jnz V86IntA
/* Check if the frame was from kernelmode */
test word ptr [ebp+KTRAP_FRAME_CS], MODE_MASK
jz Fatal
V86IntA:
/* Check if OF was set during iretd */
test dword ptr [ebp+KTRAP_FRAME_EFLAGS], EFLAG_ZERO
sti
jz Fatal
/* It was, just mask it out */
and dword ptr [ebp+KTRAP_FRAME_EFLAGS], ~EFLAG_ZERO
jmp _Kei386EoiHelper@0
Fatal:
/* TSS failure for some other reason: crash */
push 0
push 0
push 0
push 10
push ebp
call _KiTrapHandler
add esp, 8
/* Check for v86 recovery */
cmp eax, 1
/* Return to caller */
jne _Kei386EoiHelper@0
jmp _KiV86Complete
#endif
push UNEXPECTED_KERNEL_MODE_TRAP
call _KeBugCheckEx@20
.endfunc
_KiTrap11:
/* Enter trap */
@ -1220,7 +1240,6 @@ _KiTrap12:
jne _Kei386EoiHelper@0
jmp _KiV86Complete
#if 1
_KiTrap13:
/* Enter trap */
TRAP_PROLOG(13)
@ -1237,7 +1256,6 @@ _KiTrap13:
/* Return to caller */
jne _Kei386EoiHelper@0
jmp _KiV86Complete
#endif
_KiTrap14:
/* Enter trap */
@ -1256,25 +1274,17 @@ _KiTrap14:
jne _Kei386EoiHelper@0
jmp _KiV86Complete
_KiTrap15:
_KiTrap0F:
/* Push error code */
push 0
/* Enter trap */
TRAP_PROLOG(15)
sti
/* Call the C exception handler */
push 15
push ebp
call _KiTrapHandler
add esp, 8
/* Check for v86 recovery */
cmp eax, 1
/* Return to caller */
jne _Kei386EoiHelper@0
jmp _KiV86Complete
/* Raise a fatal exception */
mov eax, 15
jmp _KiSystemFatalException
_KiTrap16:
/* Push error code */
@ -1316,18 +1326,6 @@ _KiTrap17:
jne _Kei386EoiHelper@0
jmp _KiV86Complete
_KiTrap0F:
/* Push error code */
push 0
/* Enter trap */
TRAP_PROLOG(15)
sti
/* Raise a fatal exception */
mov eax, 15
jmp _KiSystemFatalException
.func KiSystemFatalException
_KiSystemFatalException: