[FREELDR]
[reactos.git] / reactos / boot / freeldr / freeldr / include / debug.h
1 /*
2 * FreeLoader
3 * Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20 #ifndef __DEBUG_H
21 #define __DEBUG_H
22
23 #define DPRINT_NONE 0 // No debug print
24 #define DPRINT_WARNING 1 // debugger messages and other misc stuff
25 #define DPRINT_MEMORY 2 // memory management messages
26 #define DPRINT_FILESYSTEM 3 // file system messages
27 #define DPRINT_INIFILE 4 // .ini file messages
28 #define DPRINT_UI 5 // user interface messages
29 #define DPRINT_DISK 6 // disk messages
30 #define DPRINT_CACHE 7 // cache messages
31 #define DPRINT_REGISTRY 8 // registry messages
32 #define DPRINT_REACTOS 9 // ReactOS messages
33 #define DPRINT_LINUX 10 // Linux messages
34 #define DPRINT_HWDETECT 11 // hardware detection messages
35 #define DPRINT_WINDOWS 12 // messages from Windows loader
36 #define DPRINT_PELOADER 13 // messages from PE images loader
37 #define DPRINT_SCSIPORT 14 // messages from SCSI miniport
38 #define DPRINT_HEAP 15 // messages in a bottle
39 #define DBG_CHANNELS_COUNT 16
40
41 #if DBG && !defined(_M_ARM)
42
43 VOID DebugInit(VOID);
44 ULONG DbgPrint(const char *Format, ...);
45 VOID DbgPrint2(ULONG Mask, ULONG Level, const char *File, ULONG Line, char *Format, ...);
46 VOID DebugDumpBuffer(ULONG Mask, PVOID Buffer, ULONG Length);
47 VOID DbgParseDebugChannels(PCHAR Value);
48
49 #define ERR_LEVEL 0x1
50 #define FIXME_LEVEL 0x2
51 #define WARN_LEVEL 0x4
52 #define TRACE_LEVEL 0x8
53
54 #define MAX_LEVEL ERR_LEVEL | FIXME_LEVEL | WARN_LEVEL | TRACE_LEVEL
55
56 #define DBG_DEFAULT_CHANNEL(ch) static int DbgDefaultChannel = DPRINT_##ch
57
58 #define ERR_CH(ch, fmt, ...) DbgPrint2(DPRINT_##ch, ERR_LEVEL, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
59 #define FIXME_CH(ch, fmt, ...) DbgPrint2(DPRINT_##ch, FIXME_LEVEL, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
60 #define WARN_CH(ch, fmt, ...) DbgPrint2(DPRINT_##ch, WARN_LEVEL, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
61 #define TRACE_CH(ch, fmt, ...) DbgPrint2(DPRINT_##ch, TRACE_LEVEL, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
62
63 #define ERR(fmt, ...) DbgPrint2(DbgDefaultChannel, ERR_LEVEL, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
64 #define FIXME(fmt, ...) DbgPrint2(DbgDefaultChannel, FIXME_LEVEL, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
65 #define WARN(fmt, ...) DbgPrint2(DbgDefaultChannel, WARN_LEVEL, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
66 #define TRACE(fmt, ...) DbgPrint2(DbgDefaultChannel, TRACE_LEVEL, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
67
68 #define UNIMPLEMENTED DbgPrint("(%s:%d) WARNING: %s is UNIMPLEMENTED!\n", __FILE__, __LINE__, __FUNCTION__);
69
70 #define BugCheck(fmt, ...) do { DbgPrint("(%s:%d) Fatal Error in %s: " fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); for (;;); } while (0)
71 #define DbgDumpBuffer(mask, buf, len) DebugDumpBuffer(mask, buf, len)
72
73 #ifdef __i386__
74
75 // Debugging support functions:
76 //
77 // BREAKPOINT() - Inserts an "int 3" instruction
78 // INSTRUCTION_BREAKPOINTX(x) - Enters exception handler right before instruction at address "x" is executed
79 // MEMORY_READWRITE_BREAKPOINTX(x) - Enters exception handler when a read or write occurs at address "x"
80 // MEMORY_WRITE_BREAKPOINTX(x) - Enters exception handler when a write occurs at address "x"
81 //
82 // You may have as many BREAKPOINT()'s as you like but you may only
83 // have up to four of any of the others.
84 #define BREAKPOINT() __asm__ ("int $3");
85 void INSTRUCTION_BREAKPOINT1(unsigned long addr);
86 void MEMORY_READWRITE_BREAKPOINT1(unsigned long addr);
87 void MEMORY_WRITE_BREAKPOINT1(unsigned long addr);
88 void INSTRUCTION_BREAKPOINT2(unsigned long addr);
89 void MEMORY_READWRITE_BREAKPOINT2(unsigned long addr);
90 void MEMORY_WRITE_BREAKPOINT2(unsigned long addr);
91 void INSTRUCTION_BREAKPOINT3(unsigned long addr);
92 void MEMORY_READWRITE_BREAKPOINT3(unsigned long addr);
93 void MEMORY_WRITE_BREAKPOINT3(unsigned long addr);
94 void INSTRUCTION_BREAKPOINT4(unsigned long addr);
95 void MEMORY_READWRITE_BREAKPOINT4(unsigned long addr);
96 void MEMORY_WRITE_BREAKPOINT4(unsigned long addr);
97
98 #endif // defined __i386__
99
100 #else
101
102 #define DBG_DEFAULT_CHANNEL(ch)
103
104 #define ERR_CH(ch, fmt, ...)
105 #define FIXME_CH(ch, fmt, ...)
106 #define WARN_CH(ch, fmt, ...)
107 #define TRACE_CH(ch, fmt, ...)
108
109 #define ERR(fmt, ...)
110 #define FIXME(fmt, ...)
111 #define WARN(fmt, ...)
112 #define TRACE(fmt, ...)
113
114 #define UNIMPLEMENTED
115
116 #define DebugInit()
117 #define BugCheck(fmt, ...)
118 #define DbgDumpBuffer(mask, buf, len)
119 #define DbgParseDebugChannels(val)
120
121 #endif // DBG
122
123 void
124 NTAPI
125 FrLdrBugCheck(ULONG BugCode);
126
127 VOID
128 NTAPI
129 FrLdrBugCheckWithMessage(
130 ULONG BugCode,
131 PCHAR File,
132 ULONG Line,
133 PSTR Format,
134 ...);
135
136 /* Bugcheck codes */
137 enum _FRLDR_BUGCHECK_CODES
138 {
139 TEST_BUGCHECK,
140 MISSING_HARDWARE_REQUIREMENTS,
141 FREELDR_IMAGE_CORRUPTION,
142 MEMORY_INIT_FAILURE,
143 };
144
145 extern char *BugCodeStrings[];
146 extern ULONG_PTR BugCheckInfo[5];
147
148 #endif // defined __DEBUG_H