From 9b9afa45580fb73251cf31d8dfeb6fdf246f3e89 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 8 Jul 2012 15:33:53 +0000 Subject: [PATCH] [FREELDR] Add code to dump amd64 cpu state. Add a bugcheck function. svn path=/trunk/; revision=56851 --- .../boot/freeldr/freeldr/arch/i386/i386bug.c | 106 +++++++++++++++--- 1 file changed, 88 insertions(+), 18 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/i386/i386bug.c b/reactos/boot/freeldr/freeldr/arch/i386/i386bug.c index 989ce6ec9e1..e9740e28045 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/i386bug.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/i386bug.c @@ -51,7 +51,7 @@ i386PrintText(char *pszText) while (1) { chr = *pszText++; - + if (chr == 0) break; if (chr == '\n') { @@ -59,7 +59,7 @@ i386PrintText(char *pszText) i386_ScreenPosX = 0; continue; } - + MachVideoPutChar(chr, SCREEN_ATTR, i386_ScreenPosX, i386_ScreenPosY); i386_ScreenPosX++; } @@ -70,7 +70,7 @@ PrintText(const char *format, ...) { va_list argptr; char buffer[256]; - + va_start(argptr, format); _vsnprintf(buffer, sizeof(buffer), format, argptr); buffer[sizeof(buffer) - 1] = 0; @@ -84,10 +84,15 @@ i386PrintFrames(PKTRAP_FRAME TrapFrame) FRAME *Frame; PrintText("Frames:\n"); - +#ifdef _M_IX86 for (Frame = (FRAME*)TrapFrame->Ebp; Frame != 0 && (ULONG_PTR)Frame < STACK32ADDR; Frame = Frame->Next) +#else + for (Frame = (FRAME*)TrapFrame->TrapFrame; + Frame != 0 && (ULONG_PTR)Frame < STACK32ADDR; + Frame = Frame->Next) +#endif { PrintText("%p ", Frame->Address); } @@ -105,31 +110,96 @@ i386PrintExceptionText(ULONG TrapIndex, PKTRAP_FRAME TrapFrame, PKSPECIAL_REGIST VERSION"\n" "Report this error to the ReactOS Development mailing list \n\n" "%s\n", i386ExceptionDescriptionText[TrapIndex]); - - PrintText("EAX: %.8lx ESP: %.8lx CR0: %.8lx DR0: %.8lx\n", +#ifdef _M_IX86 + PrintText("EAX: %.8lx ESP: %.8lx CR0: %.8lx DR0: %.8lx\n", TrapFrame->Eax, TrapFrame->HardwareEsp, Special->Cr0, TrapFrame->Dr0); - PrintText("EBX: %.8lx EBP: %.8lx CR1: ???????? DR1: %.8lx\n", + PrintText("EBX: %.8lx EBP: %.8lx CR1: ???????? DR1: %.8lx\n", TrapFrame->Ebx, TrapFrame->Ebp, TrapFrame->Dr1); - PrintText("ECX: %.8lx ESI: %.8lx CR2: %.8lx DR2: %.8lx\n", + PrintText("ECX: %.8lx ESI: %.8lx CR2: %.8lx DR2: %.8lx\n", TrapFrame->Ecx, TrapFrame->Esi, Special->Cr2, TrapFrame->Dr2); - PrintText("EDX: %.8lx EDI: %.8lx CR3: %.8lx DR3: %.8lx\n", + PrintText("EDX: %.8lx EDI: %.8lx CR3: %.8lx DR3: %.8lx\n", TrapFrame->Edx, TrapFrame->Edi, Special->Cr3, TrapFrame->Dr3); - PrintText(" DR6: %.8lx\n", + PrintText(" DR6: %.8lx\n", TrapFrame->Dr6); - PrintText(" DR7: %.8lx\n\n", + PrintText(" DR7: %.8lx\n\n", TrapFrame->Dr7); - PrintText("CS: %.4lx EIP: %.8lx\n", + PrintText("CS: %.4lx EIP: %.8lx\n", TrapFrame->SegCs, TrapFrame->Eip); - PrintText("DS: %.4lx ERROR CODE: %.8lx\n", - TrapFrame->SegDs, TrapFrame->Eip); - PrintText("ES: %.4lx EFLAGS: %.8lx\n", + PrintText("DS: %.4lx ERROR CODE: %.8lx\n", + TrapFrame->SegDs, TrapFrame->ErrCode); + PrintText("ES: %.4lx EFLAGS: %.8lx\n", TrapFrame->SegEs, TrapFrame->EFlags); - PrintText("FS: %.4lx GDTR Base: %.8lx Limit: %.4x\n", + PrintText("FS: %.4lx GDTR Base: %.8lx Limit: %.4x\n", TrapFrame->SegFs, Special->Gdtr.Base, Special->Gdtr.Limit); - PrintText("GS: %.4lx IDTR Base: %.8lx Limit: %.4x\n", + PrintText("GS: %.4lx IDTR Base: %.8lx Limit: %.4x\n", TrapFrame->SegGs, Special->Idtr.Base, Special->Idtr.Limit); - PrintText("SS: %.4lx LDTR: %.4lx TR: %.4lx\n\n", + PrintText("SS: %.4lx LDTR: %.4lx TR: %.4lx\n\n", TrapFrame->HardwareSegSs, Special->Ldtr, Special->Idtr.Limit); i386PrintFrames(TrapFrame); // Display frames +#else + PrintText("RAX: %.8lx R8: %.8lx R12: %.8lx RSI: %.8lx\n", + TrapFrame->Rax, TrapFrame->R8, 0, TrapFrame->Rsi); + PrintText("RBX: %.8lx R9: %.8lx R13: %.8lx RDI: %.8lx\n", + TrapFrame->Rbx, TrapFrame->R9, 0, TrapFrame->Rdi); + PrintText("RCX: %.8lx R10: %.8lx R14: %.8lx RBP: %.8lx\n", + TrapFrame->Rcx, TrapFrame->R10, 0, TrapFrame->Rbp); + PrintText("RDX: %.8lx R11: %.8lx R15: %.8lx RSP: %.8lx\n", + TrapFrame->Rdx, TrapFrame->R11, 0, TrapFrame->Rsp); + + PrintText("CS: %.4lx RIP: %.8lx\n", + TrapFrame->SegCs, TrapFrame->Rip); + PrintText("DS: %.4lx ERROR CODE: %.8lx\n", + TrapFrame->SegDs, TrapFrame->ErrorCode); + PrintText("ES: %.4lx EFLAGS: %.8lx\n", + TrapFrame->SegEs, TrapFrame->EFlags); + PrintText("FS: %.4lx GDTR Base: %.8lx Limit: %.4x\n", + TrapFrame->SegFs, Special->Gdtr.Base, Special->Gdtr.Limit); + PrintText("GS: %.4lx IDTR Base: %.8lx Limit: %.4x\n", + TrapFrame->SegGs, Special->Idtr.Base, Special->Idtr.Limit); + PrintText("SS: %.4lx LDTR: %.4lx TR: %.4lx\n\n", + TrapFrame->SegSs, Special->Ldtr, Special->Idtr.Limit); +#endif } + +char *BugCodeStrings[] = +{ + "TEST_BUGCHECK", + "MISSING_HARDWARE_REQUIREMENTS", +}; + +ULONG_PTR BugCheckInfo[5]; + +void +NTAPI +FrLdrBugCheckEx( + ULONG BugCode, + PCHAR File, + ULONG Line) +{ + MachVideoClearScreen(SCREEN_ATTR); + i386_ScreenPosX = 0; + i386_ScreenPosY = 0; + + PrintText("A problem has been detected and FreeLoader boot has been aborted.\n\n"); + + PrintText("%ld: %s\n\n", BugCode, BugCodeStrings[BugCode]); + + if (File) + { + PrintText("Location: %s:%ld\n\n", File, Line); + } + + PrintText("Bug Information:\n %p\n %p\n %p\n %p\n %p\n\n", + BugCheckInfo[0], BugCheckInfo[1], BugCheckInfo[2], BugCheckInfo[3], BugCheckInfo[4]); + + for (;;); +} + +void +NTAPI +FrLdrBugCheck(ULONG BugCode) +{ + FrLdrBugCheckEx(BugCode, 0, 0); +} +