ReactOS  0.4.14-dev-554-g2f8d847
i386bug.c File Reference
#include <freeldr.h>
#include <debug.h>
Include dependency graph for i386bug.c:

Go to the source code of this file.

Classes

struct  _FRAME
 

Macros

#define SCREEN_ATTR   0x1F
 

Typedefs

typedef struct _FRAME FRAME
 

Functions

static void i386PrintText (char *pszText)
 
static void PrintText (const char *format,...)
 
static void i386PrintFrames (PKTRAP_FRAME TrapFrame)
 
void NTAPI i386PrintExceptionText (ULONG TrapIndex, PKTRAP_FRAME TrapFrame, PKSPECIAL_REGISTERS Special)
 
VOID FrLdrBugCheckWithMessage (ULONG BugCode, PCHAR File, ULONG Line, PSTR Format,...)
 
void NTAPI FrLdrBugCheckEx (ULONG BugCode, PCHAR File, ULONG Line)
 
void NTAPI FrLdrBugCheck (ULONG BugCode)
 

Variables

static const chari386ExceptionDescriptionText []
 
ULONG i386_ScreenPosX = 0
 
ULONG i386_ScreenPosY = 0
 

Macro Definition Documentation

◆ SCREEN_ATTR

#define SCREEN_ATTR   0x1F

Definition at line 35 of file i386bug.c.

Typedef Documentation

◆ FRAME

typedef struct _FRAME FRAME

Function Documentation

◆ FrLdrBugCheck()

void NTAPI FrLdrBugCheck ( ULONG  BugCode)

Definition at line 244 of file i386bug.c.

245 {
246  FrLdrBugCheckEx(BugCode, 0, 0);
247 }
void NTAPI FrLdrBugCheckEx(ULONG BugCode, PCHAR File, ULONG Line)
Definition: i386bug.c:215

◆ FrLdrBugCheckEx()

void NTAPI FrLdrBugCheckEx ( ULONG  BugCode,
PCHAR  File,
ULONG  Line 
)

Definition at line 215 of file i386bug.c.

219 {
222  i386_ScreenPosX = 0;
223  i386_ScreenPosY = 0;
224 
225  PrintText("A problem has been detected and FreeLoader boot has been aborted.\n\n");
226 
227  PrintText("%ld: %s\n\n", BugCode, BugCodeStrings[BugCode]);
228 
229  if (File)
230  {
231  PrintText("Location: %s:%ld\n\n", File, Line);
232  }
233 
234  PrintText("Bug Information:\n %p\n %p\n %p\n %p\n %p\n\n",
236 
237  _disable();
238  __halt();
239  for (;;);
240 }
char * BugCodeStrings[]
Definition: debug.c:504
__INTRIN_INLINE void __halt(void)
Definition: intrin_x86.h:1595
Definition: ncftp.h:79
#define MachVideoClearScreen(Attr)
Definition: machine.h:92
#define MachVideoHideShowTextCursor(Show)
Definition: machine.h:104
#define SCREEN_ATTR
Definition: i386bug.c:35
void __cdecl _disable(void)
Definition: intrin_arm.h:365
ULONG_PTR BugCheckInfo[5]
Definition: debug.c:512
Definition: File.h:15
static void PrintText(const char *format,...)
Definition: i386bug.c:71
ULONG i386_ScreenPosY
Definition: i386bug.c:47
ULONG i386_ScreenPosX
Definition: i386bug.c:46

Referenced by FrLdrBugCheck().

◆ FrLdrBugCheckWithMessage()

VOID FrLdrBugCheckWithMessage ( ULONG  BugCode,
PCHAR  File,
ULONG  Line,
PSTR  Format,
  ... 
)

Definition at line 177 of file i386bug.c.

183 {
184  CHAR Buffer[1024];
185  va_list argptr;
186 
189  i386_ScreenPosX = 0;
190  i386_ScreenPosY = 0;
191 
192  PrintText("A problem has been detected and FreeLoader boot has been aborted.\n\n");
193 
194  PrintText("%ld: %s\n\n", BugCode, BugCodeStrings[BugCode]);
195 
196  if (File)
197  {
198  PrintText("Location: %s:%ld\n\n", File, Line);
199  }
200 
201  va_start(argptr, Format);
202  _vsnprintf(Buffer, sizeof(Buffer), Format, argptr);
203  va_end(argptr);
204  Buffer[sizeof(Buffer) - 1] = 0;
205 
207 
208  _disable();
209  __halt();
210  for (;;);
211 }
char * BugCodeStrings[]
Definition: debug.c:504
char CHAR
Definition: xmlstorage.h:175
__INTRIN_INLINE void __halt(void)
Definition: intrin_x86.h:1595
#define va_end(ap)
Definition: acmsvcex.h:90
char * va_list
Definition: acmsvcex.h:78
Definition: bufpool.h:45
Definition: ncftp.h:79
#define MachVideoClearScreen(Attr)
Definition: machine.h:92
#define MachVideoHideShowTextCursor(Show)
Definition: machine.h:104
#define SCREEN_ATTR
Definition: i386bug.c:35
#define va_start(ap, A)
Definition: acmsvcex.h:91
static void i386PrintText(char *pszText)
Definition: i386bug.c:50
#define _vsnprintf
Definition: xmlstorage.h:202
void __cdecl _disable(void)
Definition: intrin_arm.h:365
Definition: File.h:15
static void PrintText(const char *format,...)
Definition: i386bug.c:71
IN BOOLEAN OUT PSTR Buffer
Definition: progress.h:34
ULONG i386_ScreenPosY
Definition: i386bug.c:47
ULONG i386_ScreenPosX
Definition: i386bug.c:46

◆ i386PrintExceptionText()

void NTAPI i386PrintExceptionText ( ULONG  TrapIndex,
PKTRAP_FRAME  TrapFrame,
PKSPECIAL_REGISTERS  Special 
)

Definition at line 105 of file i386bug.c.

106 {
107  PUCHAR InstructionPointer;
108 
111  i386_ScreenPosX = 0;
112  i386_ScreenPosY = 0;
113 
114  PrintText("An error occured in " VERSION "\n"
115  "Report this error on the ReactOS Bug Tracker: https://jira.reactos.org\n\n"
116  "0x%02lx: %s\n", TrapIndex, i386ExceptionDescriptionText[TrapIndex]);
117 #ifdef _M_IX86
118  PrintText("EAX: %.8lx ESP: %.8lx CR0: %.8lx DR0: %.8lx\n",
119  TrapFrame->Eax, TrapFrame->HardwareEsp, Special->Cr0, TrapFrame->Dr0);
120  PrintText("EBX: %.8lx EBP: %.8lx CR1: ???????? DR1: %.8lx\n",
121  TrapFrame->Ebx, TrapFrame->Ebp, TrapFrame->Dr1);
122  PrintText("ECX: %.8lx ESI: %.8lx CR2: %.8lx DR2: %.8lx\n",
123  TrapFrame->Ecx, TrapFrame->Esi, Special->Cr2, TrapFrame->Dr2);
124  PrintText("EDX: %.8lx EDI: %.8lx CR3: %.8lx DR3: %.8lx\n",
125  TrapFrame->Edx, TrapFrame->Edi, Special->Cr3, TrapFrame->Dr3);
126  PrintText(" DR6: %.8lx\n",
127  TrapFrame->Dr6);
128  PrintText(" DR7: %.8lx\n\n",
129  TrapFrame->Dr7);
130  PrintText("CS: %.4lx EIP: %.8lx\n",
131  TrapFrame->SegCs, TrapFrame->Eip);
132  PrintText("DS: %.4lx ERROR CODE: %.8lx\n",
133  TrapFrame->SegDs, TrapFrame->ErrCode);
134  PrintText("ES: %.4lx EFLAGS: %.8lx\n",
135  TrapFrame->SegEs, TrapFrame->EFlags);
136  PrintText("FS: %.4lx GDTR Base: %.8lx Limit: %.4x\n",
137  TrapFrame->SegFs, Special->Gdtr.Base, Special->Gdtr.Limit);
138  PrintText("GS: %.4lx IDTR Base: %.8lx Limit: %.4x\n",
139  TrapFrame->SegGs, Special->Idtr.Base, Special->Idtr.Limit);
140  PrintText("SS: %.4lx LDTR: %.4lx TR: %.4lx\n\n",
141  TrapFrame->HardwareSegSs, Special->Ldtr, Special->Idtr.Limit);
142 
143  i386PrintFrames(TrapFrame); // Display frames
144  InstructionPointer = (PUCHAR)TrapFrame->Eip;
145 #else
146  PrintText("RAX: %.8lx R8: %.8lx R12: %.8lx RSI: %.8lx\n",
147  TrapFrame->Rax, TrapFrame->R8, 0, TrapFrame->Rsi);
148  PrintText("RBX: %.8lx R9: %.8lx R13: %.8lx RDI: %.8lx\n",
149  TrapFrame->Rbx, TrapFrame->R9, 0, TrapFrame->Rdi);
150  PrintText("RCX: %.8lx R10: %.8lx R14: %.8lx RBP: %.8lx\n",
151  TrapFrame->Rcx, TrapFrame->R10, 0, TrapFrame->Rbp);
152  PrintText("RDX: %.8lx R11: %.8lx R15: %.8lx RSP: %.8lx\n",
153  TrapFrame->Rdx, TrapFrame->R11, 0, TrapFrame->Rsp);
154 
155  PrintText("CS: %.4lx RIP: %.8lx\n",
156  TrapFrame->SegCs, TrapFrame->Rip);
157  PrintText("DS: %.4lx ERROR CODE: %.8lx\n",
158  TrapFrame->SegDs, TrapFrame->ErrorCode);
159  PrintText("ES: %.4lx EFLAGS: %.8lx\n",
160  TrapFrame->SegEs, TrapFrame->EFlags);
161  PrintText("FS: %.4lx GDTR Base: %.8lx Limit: %.4x\n",
162  TrapFrame->SegFs, Special->Gdtr.Base, Special->Gdtr.Limit);
163  PrintText("GS: %.4lx IDTR Base: %.8lx Limit: %.4x\n",
164  TrapFrame->SegGs, Special->Idtr.Base, Special->Idtr.Limit);
165  PrintText("SS: %.4lx LDTR: %.4lx TR: %.4lx\n\n",
166  TrapFrame->SegSs, Special->Ldtr, Special->Idtr.Limit);
167  InstructionPointer = (PUCHAR)TrapFrame->Rip;
168 #endif
169  PrintText("\nInstruction stream: %.2x %.2x %.2x %.2x %.2x %.2x %.2x %.2x \n",
170  InstructionPointer[0], InstructionPointer[1],
171  InstructionPointer[2], InstructionPointer[3],
172  InstructionPointer[4], InstructionPointer[5],
173  InstructionPointer[6], InstructionPointer[7]);
174 }
UINT64 R8
Definition: ketypes.h:321
UINT64 Rbp
Definition: ketypes.h:372
UINT64 R10
Definition: ketypes.h:323
UINT64 Rbx
Definition: ketypes.h:369
UINT64 R9
Definition: ketypes.h:322
unsigned char * PUCHAR
Definition: retypes.h:3
USHORT SegFs
Definition: ketypes.h:366
ULONG HardwareSegSs
Definition: ketypes.h:271
ULONG Esi
Definition: ketypes.h:263
PVOID Base
Definition: ketypes.h:486
ULONG Edi
Definition: ketypes.h:262
USHORT Limit
Definition: ketypes.h:485
UINT64 Dr2
Definition: ketypes.h:344
ULONG Eax
Definition: ketypes.h:258
UINT64 Rsi
Definition: ketypes.h:371
USHORT SegGs
Definition: ketypes.h:367
UINT64 Rax
Definition: ketypes.h:318
USHORT SegEs
Definition: ketypes.h:365
USHORT SegCs
Definition: ketypes.h:380
KDESCRIPTOR Gdtr
Definition: ketypes.h:506
static const char * i386ExceptionDescriptionText[]
Definition: i386bug.c:12
ULONG HardwareEsp
Definition: ketypes.h:270
UINT64 Dr6
Definition: ketypes.h:346
static void i386PrintFrames(PKTRAP_FRAME TrapFrame)
Definition: i386bug.c:84
UINT64 Dr3
Definition: ketypes.h:345
#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
UINT64 Dr0
Definition: ketypes.h:342
UINT64 R11
Definition: ketypes.h:324
USHORT SegSs
Definition: ketypes.h:387
ULONG Ebx
Definition: ketypes.h:264
UINT64 Rsp
Definition: ketypes.h:386
#define SCREEN_ATTR
Definition: i386bug.c:35
UINT64 Rdi
Definition: ketypes.h:370
UINT64 ErrorCode
Definition: ketypes.h:375
UINT64 Rip
Definition: ketypes.h:379
UINT64 Dr7
Definition: ketypes.h:347
static void PrintText(const char *format,...)
Definition: i386bug.c:71
UINT64 Rcx
Definition: ketypes.h:319
ULONG i386_ScreenPosY
Definition: i386bug.c:47
ULONG i386_ScreenPosX
Definition: i386bug.c:46
ULONG ErrCode
Definition: ketypes.h:266
ULONG EFlags
Definition: ketypes.h:384
#define VERSION
Definition: rdesktop.h:45
ULONG Edx
Definition: ketypes.h:256
ULONG Ebp
Definition: ketypes.h:265
KDESCRIPTOR Idtr
Definition: ketypes.h:507

◆ i386PrintFrames()

static void i386PrintFrames ( PKTRAP_FRAME  TrapFrame)
static

Definition at line 84 of file i386bug.c.

85 {
86  FRAME *Frame;
87 
88  PrintText("Frames:\n");
89 #ifdef _M_IX86
90  for (Frame = (FRAME*)TrapFrame->Ebp;
91  Frame != 0 && (ULONG_PTR)Frame < STACKADDR;
92  Frame = Frame->Next)
93 #else
94  for (Frame = (FRAME*)TrapFrame->TrapFrame;
95  Frame != 0 && (ULONG_PTR)Frame < STACKADDR;
96  Frame = Frame->Next)
97 #endif
98  {
99  PrintText("%p ", Frame->Address);
100  }
101 }
uint32_t ULONG_PTR
Definition: typedefs.h:63
#define STACKADDR
Definition: x86common.h:16
struct _FRAME * Next
Definition: i386bug.c:8
static void PrintText(const char *format,...)
Definition: i386bug.c:71
void * Address
Definition: i386bug.c:9
UINT64 TrapFrame
Definition: ketypes.h:368
ULONG Ebp
Definition: ketypes.h:265
Definition: i386bug.c:6

Referenced by i386PrintExceptionText().

◆ i386PrintText()

static void i386PrintText ( char pszText)
static

Definition at line 50 of file i386bug.c.

51 {
52  char chr;
53  while (1)
54  {
55  chr = *pszText++;
56 
57  if (chr == 0) break;
58  if (chr == '\n')
59  {
61  i386_ScreenPosX = 0;
62  continue;
63  }
64 
67  }
68 }
#define MachVideoPutChar(Ch, Attr, X, Y)
Definition: machine.h:106
int chr(char *serport)
Definition: gdblib.c:152
#define SCREEN_ATTR
Definition: i386bug.c:35
ULONG i386_ScreenPosY
Definition: i386bug.c:47
ULONG i386_ScreenPosX
Definition: i386bug.c:46

Referenced by FrLdrBugCheckWithMessage(), and PrintText().

◆ PrintText()

static void PrintText ( const char format,
  ... 
)
static

Definition at line 71 of file i386bug.c.

72 {
73  va_list argptr;
74  char buffer[256];
75 
76  va_start(argptr, format);
77  _vsnprintf(buffer, sizeof(buffer), format, argptr);
78  buffer[sizeof(buffer) - 1] = 0;
79  va_end(argptr);
81 }
GLuint buffer
Definition: glext.h:5915
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: gl.h:1546
#define va_end(ap)
Definition: acmsvcex.h:90
char * va_list
Definition: acmsvcex.h:78
#define va_start(ap, A)
Definition: acmsvcex.h:91
static void i386PrintText(char *pszText)
Definition: i386bug.c:50
#define _vsnprintf
Definition: xmlstorage.h:202

Referenced by FrLdrBugCheckEx(), FrLdrBugCheckWithMessage(), i386PrintExceptionText(), and i386PrintFrames().

Variable Documentation

◆ i386_ScreenPosX

ULONG i386_ScreenPosX = 0

◆ i386_ScreenPosY

ULONG i386_ScreenPosY = 0

◆ i386ExceptionDescriptionText

const char* i386ExceptionDescriptionText[]
static
Initial value:
=
{
"Exception 00: DIVIDE BY ZERO\n\n",
"Exception 01: DEBUG EXCEPTION\n\n",
"Exception 02: NON-MASKABLE INTERRUPT EXCEPTION\n\n",
"Exception 03: BREAKPOINT (INT 3)\n\n",
"Exception 04: OVERFLOW\n\n",
"Exception 05: BOUND EXCEPTION\n\n",
"Exception 06: INVALID OPCODE\n\n",
"Exception 07: FPU NOT AVAILABLE\n\n",
"Exception 08: DOUBLE FAULT\n\n",
"Exception 09: COPROCESSOR SEGMENT OVERRUN\n\n",
"Exception 0A: INVALID TSS\n\n",
"Exception 0B: SEGMENT NOT PRESENT\n\n",
"Exception 0C: STACK EXCEPTION\n\n",
"Exception 0D: GENERAL PROTECTION FAULT\n\n",
"Exception 0E: PAGE FAULT\n\n",
"Exception 0F: Reserved\n\n",
"Exception 10: COPROCESSOR ERROR\n\n",
"Exception 11: ALIGNMENT CHECK\n\n",
"Exception 12: MACHINE CHECK\n\n"
}

Definition at line 12 of file i386bug.c.

Referenced by i386PrintExceptionText().