xref: /reactos/boot/freeldr/freeldr/include/debug.h (revision 7bee32d2)
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
42 
43     VOID
44     DebugInit(
45         _In_ PCSTR DebugString);
46 
47     ULONG   DbgPrint(const char *Format, ...);
48     VOID    DbgPrint2(ULONG Mask, ULONG Level, const char *File, ULONG Line, char *Format, ...);
49     VOID    DebugDumpBuffer(ULONG Mask, PVOID Buffer, ULONG Length);
50     VOID    DebugDisableScreenPort(VOID);
51     VOID    DbgParseDebugChannels(PCHAR Value);
52 
53     #define ERR_LEVEL      0x1
54     #define FIXME_LEVEL    0x2
55     #define WARN_LEVEL     0x4
56     #define TRACE_LEVEL    0x8
57 
58     #define MAX_LEVEL ERR_LEVEL | FIXME_LEVEL | WARN_LEVEL | TRACE_LEVEL
59 
60     #define DBG_DEFAULT_CHANNEL(ch) static int DbgDefaultChannel = DPRINT_##ch
61 
62     #define ERR_CH(ch, fmt, ...)    DbgPrint2(DPRINT_##ch, ERR_LEVEL, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
63     #define FIXME_CH(ch, fmt, ...)  DbgPrint2(DPRINT_##ch, FIXME_LEVEL, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
64     #define WARN_CH(ch, fmt, ...)   DbgPrint2(DPRINT_##ch, WARN_LEVEL, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
65     #define TRACE_CH(ch, fmt, ...)  DbgPrint2(DPRINT_##ch, TRACE_LEVEL, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
66 
67     #define ERR(fmt, ...)    DbgPrint2(DbgDefaultChannel, ERR_LEVEL, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
68     #define FIXME(fmt, ...)  DbgPrint2(DbgDefaultChannel, FIXME_LEVEL, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
69     #define WARN(fmt, ...)   DbgPrint2(DbgDefaultChannel, WARN_LEVEL, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
70     #define TRACE(fmt, ...)  DbgPrint2(DbgDefaultChannel, TRACE_LEVEL, __FILE__, __LINE__, fmt, ##__VA_ARGS__)
71 
72     #define UNIMPLEMENTED DbgPrint("(%s:%d) WARNING: %s is UNIMPLEMENTED!\n", __FILE__, __LINE__, __FUNCTION__);
73 
74     #define BugCheck(fmt, ...)              do { DbgPrint("(%s:%d) Fatal Error in %s: " fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); for (;;); } while (0)
75     #define DbgDumpBuffer(mask, buf, len)    DebugDumpBuffer(mask, buf, len)
76 
77 #ifdef __i386__
78 
79     // Debugging support functions:
80     //
81     // BREAKPOINT() - Inserts an "int 3" instruction
82     // INSTRUCTION_BREAKPOINTX(x) - Enters exception handler right before instruction at address "x" is executed
83     // MEMORY_READWRITE_BREAKPOINTX(x) - Enters exception handler when a read or write occurs at address "x"
84     // MEMORY_WRITE_BREAKPOINTX(x) - Enters exception handler when a write occurs at address "x"
85     //
86     // You may have as many BREAKPOINT()'s as you like but you may only
87     // have up to four of any of the others.
88 #define    BREAKPOINT()                __asm__ ("int $3");
89 void    INSTRUCTION_BREAKPOINT1(unsigned long addr);
90 void    MEMORY_READWRITE_BREAKPOINT1(unsigned long addr);
91 void    MEMORY_WRITE_BREAKPOINT1(unsigned long addr);
92 void    INSTRUCTION_BREAKPOINT2(unsigned long addr);
93 void    MEMORY_READWRITE_BREAKPOINT2(unsigned long addr);
94 void    MEMORY_WRITE_BREAKPOINT2(unsigned long addr);
95 void    INSTRUCTION_BREAKPOINT3(unsigned long addr);
96 void    MEMORY_READWRITE_BREAKPOINT3(unsigned long addr);
97 void    MEMORY_WRITE_BREAKPOINT3(unsigned long addr);
98 void    INSTRUCTION_BREAKPOINT4(unsigned long addr);
99 void    MEMORY_READWRITE_BREAKPOINT4(unsigned long addr);
100 void    MEMORY_WRITE_BREAKPOINT4(unsigned long addr);
101 
102 #endif // defined __i386__
103 
104 #else
105 
106     #define DBG_DEFAULT_CHANNEL(ch)
107 
108     #define ERR_CH(ch, fmt, ...)
109     #define FIXME_CH(ch, fmt, ...)
110     #define WARN_CH(ch, fmt, ...)
111     #define TRACE_CH(ch, fmt, ...)
112 
113     #define ERR(fmt, ...)
114     #define FIXME(fmt, ...)
115     #define WARN(fmt, ...)
116     #define TRACE(fmt, ...)
117 
118     #define UNIMPLEMENTED
119 
120     #define DebugInit(DebugString)
121     #define BugCheck(fmt, ...)
122     #define DbgDumpBuffer(mask, buf, len)
123     #define DebugDisableScreenPort()
124     #define DbgParseDebugChannels(val)
125 
126 #endif // DBG
127 
128 void
129 NTAPI
130 FrLdrBugCheck(ULONG BugCode);
131 
132 VOID
133 FrLdrBugCheckWithMessage(
134     ULONG BugCode,
135     PCHAR File,
136     ULONG Line,
137     PSTR Format,
138     ...);
139 
140 /* Bugcheck codes */
141 enum _FRLDR_BUGCHECK_CODES
142 {
143     TEST_BUGCHECK,
144     MISSING_HARDWARE_REQUIREMENTS,
145     FREELDR_IMAGE_CORRUPTION,
146     MEMORY_INIT_FAILURE,
147 #ifdef UEFIBOOT
148     EXIT_BOOTSERVICES_FAILURE,
149 #endif
150 };
151 
152 extern char *BugCodeStrings[];
153 extern ULONG_PTR BugCheckInfo[5];
154 
155 #endif // defined __DEBUG_H
156