mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 08:25:48 +00:00
- Convert 8, 9, 10, 15/F
svn path=/trunk/; revision=23634
This commit is contained in:
parent
162d423eff
commit
03f23a9e0a
2 changed files with 52 additions and 263 deletions
|
@ -181,215 +181,6 @@ KiKernelTrapHandler(PKTRAP_FRAME Tf, ULONG ExceptionNr, PVOID Cr2)
|
||||||
return(0);
|
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
|
VOID
|
||||||
NTAPI
|
NTAPI
|
||||||
KiDumpTrapFrame(PKTRAP_FRAME Tf, ULONG Parameter1, ULONG Parameter2)
|
KiDumpTrapFrame(PKTRAP_FRAME Tf, ULONG Parameter1, ULONG Parameter2)
|
||||||
|
|
|
@ -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 _KiTrap12, INT_32_DPL0 /* INT 0C: Stack Fault Exception (#SS) */
|
||||||
idt _KiTrap13, INT_32_DPL0 /* INT 0D: General Protection (#GP) */
|
idt _KiTrap13, INT_32_DPL0 /* INT 0D: General Protection (#GP) */
|
||||||
idt _KiTrap14, INT_32_DPL0 /* INT 0E: Page-Fault Exception (#PF) */
|
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 _KiTrap16, INT_32_DPL0 /* INT 10: x87 FPU Error (#MF) */
|
||||||
idt _KiTrap17, INT_32_DPL0 /* INT 11: Align Check Exception (#AC) */
|
idt _KiTrap17, INT_32_DPL0 /* INT 11: Align Check Exception (#AC) */
|
||||||
idt _KiTrap0F, INT_32_DPL0 /* INT 12: Machine Check Exception (#MC)*/
|
idt _KiTrap0F, INT_32_DPL0 /* INT 12: Machine Check Exception (#MC)*/
|
||||||
|
@ -1143,10 +1143,19 @@ BogusTrap:
|
||||||
.endfunc
|
.endfunc
|
||||||
|
|
||||||
.globl _KiTrap8
|
.globl _KiTrap8
|
||||||
|
.func KiTrap8
|
||||||
_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:
|
_KiTrap9:
|
||||||
/* Push error code */
|
/* Push error code */
|
||||||
push 0
|
push 0
|
||||||
|
@ -1154,37 +1163,48 @@ _KiTrap9:
|
||||||
/* Enter trap */
|
/* Enter trap */
|
||||||
TRAP_PROLOG(9)
|
TRAP_PROLOG(9)
|
||||||
|
|
||||||
/* Call the C exception handler */
|
/* Enable interrupts and bugcheck */
|
||||||
|
sti
|
||||||
|
push 0
|
||||||
|
push 0
|
||||||
|
push 0
|
||||||
push 9
|
push 9
|
||||||
push ebp
|
push UNEXPECTED_KERNEL_MODE_TRAP
|
||||||
call _KiTrapHandler
|
call _KeBugCheckEx@20
|
||||||
add esp, 8
|
.endfunc
|
||||||
|
|
||||||
/* Check for v86 recovery */
|
.func KiTrap10
|
||||||
cmp eax, 1
|
|
||||||
|
|
||||||
/* Return to caller */
|
|
||||||
jne _Kei386EoiHelper@0
|
|
||||||
jmp _KiV86Complete
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
_KiTrap10:
|
_KiTrap10:
|
||||||
/* Enter trap */
|
/* Enter trap */
|
||||||
TRAP_PROLOG(10)
|
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 10
|
||||||
push ebp
|
push UNEXPECTED_KERNEL_MODE_TRAP
|
||||||
call _KiTrapHandler
|
call _KeBugCheckEx@20
|
||||||
add esp, 8
|
.endfunc
|
||||||
|
|
||||||
/* Check for v86 recovery */
|
|
||||||
cmp eax, 1
|
|
||||||
|
|
||||||
/* Return to caller */
|
|
||||||
jne _Kei386EoiHelper@0
|
|
||||||
jmp _KiV86Complete
|
|
||||||
#endif
|
|
||||||
|
|
||||||
_KiTrap11:
|
_KiTrap11:
|
||||||
/* Enter trap */
|
/* Enter trap */
|
||||||
|
@ -1220,7 +1240,6 @@ _KiTrap12:
|
||||||
jne _Kei386EoiHelper@0
|
jne _Kei386EoiHelper@0
|
||||||
jmp _KiV86Complete
|
jmp _KiV86Complete
|
||||||
|
|
||||||
#if 1
|
|
||||||
_KiTrap13:
|
_KiTrap13:
|
||||||
/* Enter trap */
|
/* Enter trap */
|
||||||
TRAP_PROLOG(13)
|
TRAP_PROLOG(13)
|
||||||
|
@ -1237,7 +1256,6 @@ _KiTrap13:
|
||||||
/* Return to caller */
|
/* Return to caller */
|
||||||
jne _Kei386EoiHelper@0
|
jne _Kei386EoiHelper@0
|
||||||
jmp _KiV86Complete
|
jmp _KiV86Complete
|
||||||
#endif
|
|
||||||
|
|
||||||
_KiTrap14:
|
_KiTrap14:
|
||||||
/* Enter trap */
|
/* Enter trap */
|
||||||
|
@ -1256,25 +1274,17 @@ _KiTrap14:
|
||||||
jne _Kei386EoiHelper@0
|
jne _Kei386EoiHelper@0
|
||||||
jmp _KiV86Complete
|
jmp _KiV86Complete
|
||||||
|
|
||||||
_KiTrap15:
|
_KiTrap0F:
|
||||||
/* Push error code */
|
/* Push error code */
|
||||||
push 0
|
push 0
|
||||||
|
|
||||||
/* Enter trap */
|
/* Enter trap */
|
||||||
TRAP_PROLOG(15)
|
TRAP_PROLOG(15)
|
||||||
|
sti
|
||||||
|
|
||||||
/* Call the C exception handler */
|
/* Raise a fatal exception */
|
||||||
push 15
|
mov eax, 15
|
||||||
push ebp
|
jmp _KiSystemFatalException
|
||||||
call _KiTrapHandler
|
|
||||||
add esp, 8
|
|
||||||
|
|
||||||
/* Check for v86 recovery */
|
|
||||||
cmp eax, 1
|
|
||||||
|
|
||||||
/* Return to caller */
|
|
||||||
jne _Kei386EoiHelper@0
|
|
||||||
jmp _KiV86Complete
|
|
||||||
|
|
||||||
_KiTrap16:
|
_KiTrap16:
|
||||||
/* Push error code */
|
/* Push error code */
|
||||||
|
@ -1316,18 +1326,6 @@ _KiTrap17:
|
||||||
jne _Kei386EoiHelper@0
|
jne _Kei386EoiHelper@0
|
||||||
jmp _KiV86Complete
|
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
|
.func KiSystemFatalException
|
||||||
_KiSystemFatalException:
|
_KiSystemFatalException:
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue