9338217762a6becc9f9e1b68db1b6635f70c6eea
[mirror_edk2.git] / MdePkg / Library / UefiDebugLibStdErr / DebugLib.c
1 /** @file
2 UEFI Debug Library that uses PrintLib to send messages to STDERR.
3
4 Copyright (c) 2006, Intel Corporation<BR>
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 //
16 // Define the maximum debug and assert message length that this library supports
17 //
18 #define MAX_DEBUG_MESSAGE_LENGTH 0x100
19
20
21 /**
22
23 Prints a debug message to the debug output device if the specified error level is enabled.
24
25 If any bit in ErrorLevel is also set in PcdDebugPrintErrorLevel, then print
26 the message specified by Format and the associated variable argument list to
27 the debug output device.
28
29 If Format is NULL, then ASSERT().
30
31 @param ErrorLevel The error level of the debug message.
32 @param Format Format string for the debug message to print.
33
34 **/
35 VOID
36 EFIAPI
37 DebugPrint (
38 IN UINTN ErrorLevel,
39 IN CONST CHAR8 *Format,
40 ...
41 )
42 {
43 CHAR16 Buffer[MAX_DEBUG_MESSAGE_LENGTH];
44 VA_LIST Marker;
45
46 //
47 // If Format is NULL, then ASSERT().
48 //
49 ASSERT (Format != NULL);
50
51 //
52 // Check driver debug mask value and global mask
53 //
54 if ((ErrorLevel & PcdGet32(PcdDebugPrintErrorLevel)) == 0) {
55 return;
56 }
57
58 //
59 // Convert the DEBUG() message to a Unicode String
60 //
61 VA_START (Marker, Format);
62 UnicodeVSPrintAsciiFormat (Buffer, sizeof (Buffer), Format, Marker);
63 VA_END (Marker);
64
65 //
66 // Send the print string to the Standard Error device
67 //
68 if (gST->StdErr != NULL) {
69 gST->StdErr->OutputString (gST->StdErr, Buffer);
70 }
71 }
72
73
74 /**
75
76 Prints an assert message containing a filename, line number, and description.
77 This may be followed by a breakpoint or a dead loop.
78
79 Print a message of the form "ASSERT <FileName>(<LineNumber>): <Description>\n"
80 to the debug output device. If DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED bit of
81 PcdDebugProperyMask is set then CpuBreakpoint() is called. Otherwise, if
82 DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugProperyMask is set then
83 CpuDeadLoop() is called. If neither of these bits are set, then this function
84 returns immediately after the message is printed to the debug output device.
85 DebugAssert() must actively prevent recusrsion. If DebugAssert() is called while
86 processing another DebugAssert(), then DebugAssert() must return immediately.
87
88 If FileName is NULL, then a <FileName> string of "(NULL) Filename" is printed.
89
90 If Description is NULL, then a <Description> string of "(NULL) Description" is printed.
91
92 @param FileName Pointer to the name of the source file that generated the assert condition.
93 @param LineNumber The line number in the source file that generated the assert condition
94 @param Description Pointer to the description of the assert condition.
95
96 **/
97 VOID
98 EFIAPI
99 DebugAssert (
100 IN CONST CHAR8 *FileName,
101 IN UINTN LineNumber,
102 IN CONST CHAR8 *Description
103 )
104 {
105 CHAR16 Buffer[MAX_DEBUG_MESSAGE_LENGTH];
106
107 //
108 // Generate the ASSERT() message in Unicode format
109 //
110 UnicodeSPrintAsciiFormat (Buffer, sizeof (Buffer), "ASSERT %s(%d): %s\n", FileName, LineNumber, Description);
111
112 //
113 // Send the print string to the Standard Error device
114 //
115 if (gST->StdErr != NULL) {
116 gST->StdErr->OutputString (gST->StdErr, Buffer);
117 }
118
119 //
120 // Generate a Breakpoint, DeadLoop, or NOP based on PCD settings
121 //
122 if ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED) != 0) {
123 CpuBreakpoint ();
124 } else if ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED) != 0) {
125 CpuDeadLoop ();
126 }
127 }
128
129
130 /**
131
132 Fills a target buffer with PcdDebugClearMemoryValue, and returns the target buffer.
133
134 This function fills Length bytes of Buffer with the value specified by
135 PcdDebugClearMemoryValue, and returns Buffer.
136
137 If Buffer is NULL, then ASSERT().
138
139 If Length is greater than (MAX_ADDRESS ? Buffer + 1), then ASSERT().
140
141 @param Buffer Pointer to the target buffer to fill with PcdDebugClearMemoryValue.
142 @param Length Number of bytes in Buffer to fill with zeros PcdDebugClearMemoryValue.
143
144 @return Buffer
145
146 **/
147 VOID *
148 EFIAPI
149 DebugClearMemory (
150 OUT VOID *Buffer,
151 IN UINTN Length
152 )
153 {
154 //
155 // If Buffer is NULL, then ASSERT().
156 //
157 ASSERT (Buffer != NULL);
158
159 //
160 // SetMem() checks for the the ASSERT() condition on Length and returns Buffer
161 //
162 return SetMem (Buffer, Length, PcdGet8(PcdDebugClearMemoryValue));
163 }
164
165
166 /**
167
168 Returns TRUE if ASSERT() macros are enabled.
169
170 This function returns TRUE if the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of
171 PcdDebugProperyMask is set. Otherwise FALSE is returned.
172
173 @retval TRUE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set.
174 @retval FALSE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear.
175
176 **/
177 BOOLEAN
178 EFIAPI
179 DebugAssertEnabled (
180 VOID
181 )
182 {
183 return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED) != 0);
184 }
185
186
187 /**
188
189 Returns TRUE if DEBUG()macros are enabled.
190
191 This function returns TRUE if the DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of
192 PcdDebugProperyMask is set. Otherwise FALSE is returned.
193
194 @retval TRUE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is set.
195 @retval FALSE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is clear.
196
197 **/
198 BOOLEAN
199 EFIAPI
200 DebugPrintEnabled (
201 VOID
202 )
203 {
204 return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_PRINT_ENABLED) != 0);
205 }
206
207
208 /**
209
210 Returns TRUE if DEBUG_CODE()macros are enabled.
211
212 This function returns TRUE if the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of
213 PcdDebugProperyMask is set. Otherwise FALSE is returned.
214
215 @retval TRUE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set.
216 @retval FALSE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is clear.
217
218 **/
219 BOOLEAN
220 EFIAPI
221 DebugCodeEnabled (
222 VOID
223 )
224 {
225 return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_CODE_ENABLED) != 0);
226 }
227
228
229 /**
230
231 Returns TRUE if DEBUG_CLEAR_MEMORY()macro is enabled.
232
233 This function returns TRUE if the DEBUG_PROPERTY_DEBUG_CLEAR_MEMORY_ENABLED bit of
234 PcdDebugProperyMask is set. Otherwise FALSE is returned.
235
236 @retval TRUE The DEBUG_PROPERTY_DEBUG_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is set.
237 @retval FALSE The DEBUG_PROPERTY_DEBUG_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is clear.
238
239 **/
240 BOOLEAN
241 EFIAPI
242 DebugClearMemoryEnabled (
243 VOID
244 )
245 {
246 return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED) != 0);
247 }