ReactOS  0.4.14-dev-838-g99f979d
i386bug.c
Go to the documentation of this file.
1 
2 #include <freeldr.h>
3 
4 #include <debug.h>
5 
6 typedef struct _FRAME
7 {
8  struct _FRAME *Next;
9  void *Address;
10 } FRAME;
11 
13 {
14  "Exception 00: DIVIDE BY ZERO\n\n",
15  "Exception 01: DEBUG EXCEPTION\n\n",
16  "Exception 02: NON-MASKABLE INTERRUPT EXCEPTION\n\n",
17  "Exception 03: BREAKPOINT (INT 3)\n\n",
18  "Exception 04: OVERFLOW\n\n",
19  "Exception 05: BOUND EXCEPTION\n\n",
20  "Exception 06: INVALID OPCODE\n\n",
21  "Exception 07: FPU NOT AVAILABLE\n\n",
22  "Exception 08: DOUBLE FAULT\n\n",
23  "Exception 09: COPROCESSOR SEGMENT OVERRUN\n\n",
24  "Exception 0A: INVALID TSS\n\n",
25  "Exception 0B: SEGMENT NOT PRESENT\n\n",
26  "Exception 0C: STACK EXCEPTION\n\n",
27  "Exception 0D: GENERAL PROTECTION FAULT\n\n",
28  "Exception 0E: PAGE FAULT\n\n",
29  "Exception 0F: Reserved\n\n",
30  "Exception 10: COPROCESSOR ERROR\n\n",
31  "Exception 11: ALIGNMENT CHECK\n\n",
32  "Exception 12: MACHINE CHECK\n\n"
33 };
34 
35 #define SCREEN_ATTR 0x1F // Bright white on blue background
36 
37 /* Used to store the current X and Y position on the screen */
40 
41 #if 0
42 static void
43 i386PrintChar(CHAR chr, ULONG x, ULONG y)
44 {
46 }
47 #endif
48 
49 static void
51 {
52  ULONG Width, Unused;
53 
55 
56  for (; *pszText != ANSI_NULL; ++pszText)
57  {
58  if (*pszText == '\n')
59  {
60  i386_ScreenPosX = 0;
62  continue;
63  }
64 
66  if (++i386_ScreenPosX >= Width)
67  {
68  i386_ScreenPosX = 0;
70  }
71  // FIXME: Implement vertical screen scrolling if we are at the end of the screen.
72  }
73 }
74 
75 static void
77 {
78  CHAR Buffer[512];
79 
80  _vsnprintf(Buffer, sizeof(Buffer), Format, args);
81  Buffer[sizeof(Buffer) - 1] = ANSI_NULL;
82 
84 }
85 
86 static void
87 PrintText(const CHAR *Format, ...)
88 {
89  va_list argptr;
90 
91  va_start(argptr, Format);
92  PrintTextV(Format, argptr);
93  va_end(argptr);
94 }
95 
96 static void
98 {
99  FRAME *Frame;
100 
101  PrintText("Frames:\n");
102 #ifdef _M_IX86
103  for (Frame = (FRAME*)TrapFrame->Ebp;
104  Frame != 0 && (ULONG_PTR)Frame < STACKADDR;
105  Frame = Frame->Next)
106 #else
107  for (Frame = (FRAME*)TrapFrame->TrapFrame;
108  Frame != 0 && (ULONG_PTR)Frame < STACKADDR;
109  Frame = Frame->Next)
110 #endif
111  {
112  PrintText("%p ", Frame->Address);
113  }
114 }
115 
116 void
117 NTAPI
119 {
120  PUCHAR InstructionPointer;
121 
124  i386_ScreenPosX = 0;
125  i386_ScreenPosY = 0;
126 
127  PrintText("An error occured in " VERSION "\n"
128  "Report this error on the ReactOS Bug Tracker: https://jira.reactos.org\n\n"
129  "0x%02lx: %s\n", TrapIndex, i386ExceptionDescriptionText[TrapIndex]);
130 #ifdef _M_IX86
131  PrintText("EAX: %.8lx ESP: %.8lx CR0: %.8lx DR0: %.8lx\n",
132  TrapFrame->Eax, TrapFrame->HardwareEsp, Special->Cr0, TrapFrame->Dr0);
133  PrintText("EBX: %.8lx EBP: %.8lx CR1: ???????? DR1: %.8lx\n",
134  TrapFrame->Ebx, TrapFrame->Ebp, TrapFrame->Dr1);
135  PrintText("ECX: %.8lx ESI: %.8lx CR2: %.8lx DR2: %.8lx\n",
136  TrapFrame->Ecx, TrapFrame->Esi, Special->Cr2, TrapFrame->Dr2);
137  PrintText("EDX: %.8lx EDI: %.8lx CR3: %.8lx DR3: %.8lx\n",
138  TrapFrame->Edx, TrapFrame->Edi, Special->Cr3, TrapFrame->Dr3);
139  PrintText(" DR6: %.8lx\n",
140  TrapFrame->Dr6);
141  PrintText(" DR7: %.8lx\n\n",
142  TrapFrame->Dr7);
143  PrintText("CS: %.4lx EIP: %.8lx\n",
144  TrapFrame->SegCs, TrapFrame->Eip);
145  PrintText("DS: %.4lx ERROR CODE: %.8lx\n",
146  TrapFrame->SegDs, TrapFrame->ErrCode);
147  PrintText("ES: %.4lx EFLAGS: %.8lx\n",
148  TrapFrame->SegEs, TrapFrame->EFlags);
149  PrintText("FS: %.4lx GDTR Base: %.8lx Limit: %.4x\n",
150  TrapFrame->SegFs, Special->Gdtr.Base, Special->Gdtr.Limit);
151  PrintText("GS: %.4lx IDTR Base: %.8lx Limit: %.4x\n",
152  TrapFrame->SegGs, Special->Idtr.Base, Special->Idtr.Limit);
153  PrintText("SS: %.4lx LDTR: %.4lx TR: %.4lx\n\n",
154  TrapFrame->HardwareSegSs, Special->Ldtr, Special->Idtr.Limit);
155 
156  i386PrintFrames(TrapFrame); // Display frames
157  InstructionPointer = (PUCHAR)TrapFrame->Eip;
158 #else
159  PrintText("RAX: %.8lx R8: %.8lx R12: %.8lx RSI: %.8lx\n",
160  TrapFrame->Rax, TrapFrame->R8, 0, TrapFrame->Rsi);
161  PrintText("RBX: %.8lx R9: %.8lx R13: %.8lx RDI: %.8lx\n",
162  TrapFrame->Rbx, TrapFrame->R9, 0, TrapFrame->Rdi);
163  PrintText("RCX: %.8lx R10: %.8lx R14: %.8lx RBP: %.8lx\n",
164  TrapFrame->Rcx, TrapFrame->R10, 0, TrapFrame->Rbp);
165  PrintText("RDX: %.8lx R11: %.8lx R15: %.8lx RSP: %.8lx\n",
166  TrapFrame->Rdx, TrapFrame->R11, 0, TrapFrame->Rsp);
167 
168  PrintText("CS: %.4lx RIP: %.8lx\n",
169  TrapFrame->SegCs, TrapFrame->Rip);
170  PrintText("DS: %.4lx ERROR CODE: %.8lx\n",
171  TrapFrame->SegDs, TrapFrame->ErrorCode);
172  PrintText("ES: %.4lx EFLAGS: %.8lx\n",
173  TrapFrame->SegEs, TrapFrame->EFlags);
174  PrintText("FS: %.4lx GDTR Base: %.8lx Limit: %.4x\n",
175  TrapFrame->SegFs, Special->Gdtr.Base, Special->Gdtr.Limit);
176  PrintText("GS: %.4lx IDTR Base: %.8lx Limit: %.4x\n",
177  TrapFrame->SegGs, Special->Idtr.Base, Special->Idtr.Limit);
178  PrintText("SS: %.4lx LDTR: %.4lx TR: %.4lx\n\n",
179  TrapFrame->SegSs, Special->Ldtr, Special->Idtr.Limit);
180  InstructionPointer = (PUCHAR)TrapFrame->Rip;
181 #endif
182  PrintText("\nInstruction stream: %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x \n",
183  InstructionPointer[0], InstructionPointer[1],
184  InstructionPointer[2], InstructionPointer[3],
185  InstructionPointer[4], InstructionPointer[5],
186  InstructionPointer[6], InstructionPointer[7]);
187 }
188 
189 VOID
191  ULONG BugCode,
192  PCHAR File,
193  ULONG Line,
194  PSTR Format,
195  ...)
196 {
197  va_list argptr;
198 
201  i386_ScreenPosX = 0;
202  i386_ScreenPosY = 0;
203 
204  PrintText("A problem has been detected and FreeLoader boot has been aborted.\n\n");
205 
206  PrintText("%ld: %s\n\n", BugCode, BugCodeStrings[BugCode]);
207 
208  if (File)
209  {
210  PrintText("Location: %s:%ld\n\n", File, Line);
211  }
212 
213  va_start(argptr, Format);
214  PrintTextV(Format, argptr);
215  va_end(argptr);
216 
217  _disable();
218  __halt();
219  for (;;);
220 }
221 
222 void
223 NTAPI
225  ULONG BugCode,
226  PCHAR File,
227  ULONG Line)
228 {
231  i386_ScreenPosX = 0;
232  i386_ScreenPosY = 0;
233 
234  PrintText("A problem has been detected and FreeLoader boot has been aborted.\n\n");
235 
236  PrintText("%ld: %s\n\n", BugCode, BugCodeStrings[BugCode]);
237 
238  if (File)
239  {
240  PrintText("Location: %s:%ld\n\n", File, Line);
241  }
242 
243  PrintText("Bug Information:\n %p\n %p\n %p\n %p\n %p\n\n",
245 
246  _disable();
247  __halt();
248  for (;;);
249 }
250 
251 void
252 NTAPI
254 {
255  FrLdrBugCheckEx(BugCode, 0, 0);
256 }
UINT64 R8
Definition: ketypes.h:321
char * BugCodeStrings[]
Definition: debug.c:504
signed char * PCHAR
Definition: retypes.h:7
VOID FrLdrBugCheckWithMessage(ULONG BugCode, PCHAR File, ULONG Line, PSTR Format,...)
Definition: i386bug.c:190
UINT64 Rbp
Definition: ketypes.h:372
UINT64 R10
Definition: ketypes.h:323
_Must_inspect_result_ typedef _In_ PVOID Unused
Definition: iotypes.h:1129
void NTAPI i386PrintExceptionText(ULONG TrapIndex, PKTRAP_FRAME TrapFrame, PKSPECIAL_REGISTERS Special)
Definition: i386bug.c:118
UINT64 Rbx
Definition: ketypes.h:369
UINT64 R9
Definition: ketypes.h:322
#define MachVideoGetDisplaySize(W, H, D)
Definition: machine.h:96
unsigned char * PUCHAR
Definition: retypes.h:3
char CHAR
Definition: xmlstorage.h:175
__INTRIN_INLINE void __halt(void)
Definition: intrin_x86.h:1595
USHORT SegFs
Definition: ketypes.h:366
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
ULONG HardwareSegSs
Definition: ketypes.h:271
ULONG Esi
Definition: ketypes.h:263
Definition: match.c:390
PVOID Base
Definition: ketypes.h:486
ULONG Edi
Definition: ketypes.h:262
USHORT Limit
Definition: ketypes.h:485
uint32_t ULONG_PTR
Definition: typedefs.h:63
#define STACKADDR
Definition: x86common.h:16
UINT64 Dr2
Definition: ketypes.h:344
ULONG Eax
Definition: ketypes.h:258
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
#define va_end(ap)
Definition: acmsvcex.h:90
UINT64 Rsi
Definition: ketypes.h:371
USHORT SegGs
Definition: ketypes.h:367
#define ANSI_NULL
UINT64 Rax
Definition: ketypes.h:318
#define MachVideoPutChar(Ch, Attr, X, Y)
Definition: machine.h:106
USHORT SegEs
Definition: ketypes.h:365
static void PrintTextV(const CHAR *Format, va_list args)
Definition: i386bug.c:76
struct _FRAME * Next
Definition: i386bug.c:8
USHORT SegCs
Definition: ketypes.h:380
char * va_list
Definition: acmsvcex.h:78
Definition: bufpool.h:45
KDESCRIPTOR Gdtr
Definition: ketypes.h:506
void NTAPI FrLdrBugCheck(ULONG BugCode)
Definition: i386bug.c:253
ULONG HardwareEsp
Definition: ketypes.h:270
void NTAPI FrLdrBugCheckEx(ULONG BugCode, PCHAR File, ULONG Line)
Definition: i386bug.c:224
UINT64 Dr6
Definition: ketypes.h:346
static void i386PrintFrames(PKTRAP_FRAME TrapFrame)
Definition: i386bug.c:97
UINT64 Dr3
Definition: ketypes.h:345
struct _FRAME FRAME
Definition: ncftp.h:79
#define MachVideoClearScreen(Attr)
Definition: machine.h:92
UINT64 Rdx
Definition: ketypes.h:320
UINT64 Dr1
Definition: ketypes.h:343
#define MachVideoHideShowTextCursor(Show)
Definition: machine.h:104
USHORT SegDs
Definition: ketypes.h:364
ULONG Ecx
Definition: ketypes.h:257
ULONG Eip
Definition: ketypes.h:267
int chr(char *serport)
Definition: gdblib.c:152
UINT64 Dr0
Definition: ketypes.h:342
UINT64 R11
Definition: ketypes.h:324
USHORT SegSs
Definition: ketypes.h:387
ULONG Ebx
Definition: ketypes.h:264
signed char * PSTR
Definition: retypes.h:7
UINT64 Rsp
Definition: ketypes.h:386
#define SCREEN_ATTR
Definition: i386bug.c:35
#define va_start(ap, A)
Definition: acmsvcex.h:91
UINT64 Rdi
Definition: ketypes.h:370
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
#define _vsnprintf
Definition: xmlstorage.h:202
UINT64 ErrorCode
Definition: ketypes.h:375
UINT64 Rip
Definition: ketypes.h:379
void __cdecl _disable(void)
Definition: intrin_arm.h:365
unsigned int ULONG
Definition: retypes.h:1
ULONG_PTR BugCheckInfo[5]
Definition: debug.c:512
static void PrintText(const CHAR *Format,...)
Definition: i386bug.c:87
Definition: File.h:15
UINT64 Dr7
Definition: ketypes.h:347
static const CHAR * i386ExceptionDescriptionText[]
Definition: i386bug.c:12
IN BOOLEAN OUT PSTR Buffer
Definition: progress.h:34
UINT64 Rcx
Definition: ketypes.h:319
static ULONG i386_ScreenPosY
Definition: i386bug.c:39
void * Address
Definition: i386bug.c:9
static ULONG i386_ScreenPosX
Definition: i386bug.c:38
ULONG ErrCode
Definition: ketypes.h:266
ULONG EFlags
Definition: ketypes.h:384
#define VERSION
Definition: rdesktop.h:45
UINT64 TrapFrame
Definition: ketypes.h:368
ULONG Edx
Definition: ketypes.h:256
ULONG Ebp
Definition: ketypes.h:265
Definition: i386bug.c:6
KDESCRIPTOR Idtr
Definition: ketypes.h:507
static void i386PrintText(CHAR *pszText)
Definition: i386bug.c:50