]> git.proxmox.com Git - mirror_edk2.git/blob - MdePkg/Library/UefiDebugLibStdErr/DebugLib.c
Code scrub for the Debug library, PostCode library, Print library, and ExtractGuidedS...
[mirror_edk2.git] / MdePkg / Library / UefiDebugLibStdErr / DebugLib.c
1 /** @file
2 UEFI Debug Lib that sends messages to the Standard Error Device in the EFI System Table.
3
4 Copyright (c) 2006 - 2008, 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 #include <Uefi.h>
17
18
19 #include <Library/DebugLib.h>
20 #include <Library/UefiBootServicesTableLib.h>
21 #include <Library/PrintLib.h>
22 #include <Library/PcdLib.h>
23 #include <Library/BaseLib.h>
24 #include <Library/BaseMemoryLib.h>
25
26 //
27 // Define the maximum debug and assert message length that this library supports
28 //
29 #define MAX_DEBUG_MESSAGE_LENGTH 0x100
30
31
32 /**
33
34 Prints a debug message to the debug output device if the specified error level is enabled.
35
36 If any bit in ErrorLevel is also set in PcdDebugPrintErrorLevel, then print
37 the message specified by Format and the associated variable argument list to
38 the debug output device.
39
40 If Format is NULL, then ASSERT().
41
42 @param ErrorLevel The error level of the debug message.
43 @param Format Format string for the debug message to print.
44 @param ... The variable argument list.
45
46 **/
47 VOID
48 EFIAPI
49 DebugPrint (
50 IN UINTN ErrorLevel,
51 IN CONST CHAR8 *Format,
52 ...
53 )
54 {
55 CHAR16 Buffer[MAX_DEBUG_MESSAGE_LENGTH];
56 CHAR8 AsciiBuffer[MAX_DEBUG_MESSAGE_LENGTH];
57 VA_LIST Marker;
58
59 //
60 // If Format is NULL, then ASSERT().
61 //
62 ASSERT (Format != NULL);
63
64 //
65 // Check driver debug mask value and global mask
66 //
67 if ((ErrorLevel & PcdGet32(PcdDebugPrintErrorLevel)) == 0) {
68 return;
69 }
70
71 //
72 // Convert the DEBUG() message to a Unicode String
73 //
74 VA_START (Marker, Format);
75 AsciiVSPrint (AsciiBuffer, sizeof (AsciiBuffer), Format, Marker);
76 AsciiStrToUnicodeStr (AsciiBuffer, Buffer);
77 VA_END (Marker);
78
79 //
80 // Send the print string to the Standard Error device
81 //
82 if ((gST != NULL) && (gST->StdErr != NULL)) {
83 gST->StdErr->OutputString (gST->StdErr, Buffer);
84 }
85 }
86
87
88 /**
89
90 Prints an assert message containing a filename, line number, and description.
91 This may be followed by a breakpoint or a dead loop.
92
93 Print a message of the form "ASSERT <FileName>(<LineNumber>): <Description>\n"
94 to the debug output device. If DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED bit of
95 PcdDebugProperyMask is set then CpuBreakpoint() is called. Otherwise, if
96 DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED bit of PcdDebugProperyMask is set then
97 CpuDeadLoop() is called. If neither of these bits are set, then this function
98 returns immediately after the message is printed to the debug output device.
99 DebugAssert() must actively prevent recusrsion. If DebugAssert() is called while
100 processing another DebugAssert(), then DebugAssert() must return immediately.
101
102 If FileName is NULL, then a <FileName> string of "(NULL) Filename" is printed.
103
104 If Description is NULL, then a <Description> string of "(NULL) Description" is printed.
105
106 @param FileName Pointer to the name of the source file that generated the assert condition.
107 @param LineNumber The line number in the source file that generated the assert condition
108 @param Description Pointer to the description of the assert condition.
109
110 **/
111 VOID
112 EFIAPI
113 DebugAssert (
114 IN CONST CHAR8 *FileName,
115 IN UINTN LineNumber,
116 IN CONST CHAR8 *Description
117 )
118 {
119 CHAR16 Buffer[MAX_DEBUG_MESSAGE_LENGTH];
120 CHAR8 AsciiBuffer[MAX_DEBUG_MESSAGE_LENGTH];
121
122 //
123 // Generate the ASSERT() message in Unicode format
124 //
125 AsciiSPrint (AsciiBuffer, sizeof (AsciiBuffer), "ASSERT %a(%d): %a\n", FileName, LineNumber, Description);
126 AsciiStrToUnicodeStr (AsciiBuffer, Buffer);
127
128 //
129 // Send the print string to the Standard Error device
130 //
131 if ((gST != NULL) && (gST->StdErr != NULL)) {
132 gST->StdErr->OutputString (gST->StdErr, Buffer);
133 }
134
135 //
136 // Generate a Breakpoint, DeadLoop, or NOP based on PCD settings
137 //
138 if ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_ASSERT_BREAKPOINT_ENABLED) != 0) {
139 CpuBreakpoint ();
140 } else if ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_ASSERT_DEADLOOP_ENABLED) != 0) {
141 CpuDeadLoop ();
142 }
143 }
144
145
146 /**
147
148 Fills a target buffer with PcdDebugClearMemoryValue, and returns the target buffer.
149
150 This function fills Length bytes of Buffer with the value specified by
151 PcdDebugClearMemoryValue, and returns Buffer.
152
153 If Buffer is NULL, then ASSERT().
154
155 If Length is greater than (MAX_ADDRESS ? Buffer + 1), then ASSERT().
156
157 @param Buffer Pointer to the target buffer to fill with PcdDebugClearMemoryValue.
158 @param Length Number of bytes in Buffer to fill with zeros PcdDebugClearMemoryValue.
159
160 @return Buffer Pointer to the target buffer filled with PcdDebugClearMemoryValue.
161
162 **/
163 VOID *
164 EFIAPI
165 DebugClearMemory (
166 OUT VOID *Buffer,
167 IN UINTN Length
168 )
169 {
170 //
171 // If Buffer is NULL, then ASSERT().
172 //
173 ASSERT (Buffer != NULL);
174
175 //
176 // SetMem() checks for the the ASSERT() condition on Length and returns Buffer
177 //
178 return SetMem (Buffer, Length, PcdGet8(PcdDebugClearMemoryValue));
179 }
180
181
182 /**
183
184 Returns TRUE if ASSERT() macros are enabled.
185
186 This function returns TRUE if the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of
187 PcdDebugProperyMask is set. Otherwise FALSE is returned.
188
189 @retval TRUE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set.
190 @retval FALSE The DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear.
191
192 **/
193 BOOLEAN
194 EFIAPI
195 DebugAssertEnabled (
196 VOID
197 )
198 {
199 return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED) != 0);
200 }
201
202
203 /**
204
205 Returns TRUE if DEBUG()macros are enabled.
206
207 This function returns TRUE if the DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of
208 PcdDebugProperyMask is set. Otherwise FALSE is returned.
209
210 @retval TRUE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is set.
211 @retval FALSE The DEBUG_PROPERTY_DEBUG_PRINT_ENABLED bit of PcdDebugProperyMask is clear.
212
213 **/
214 BOOLEAN
215 EFIAPI
216 DebugPrintEnabled (
217 VOID
218 )
219 {
220 return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_PRINT_ENABLED) != 0);
221 }
222
223
224 /**
225
226 Returns TRUE if DEBUG_CODE()macros are enabled.
227
228 This function returns TRUE if the DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of
229 PcdDebugProperyMask is set. Otherwise FALSE is returned.
230
231 @retval TRUE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is set.
232 @retval FALSE The DEBUG_PROPERTY_DEBUG_CODE_ENABLED bit of PcdDebugProperyMask is clear.
233
234 **/
235 BOOLEAN
236 EFIAPI
237 DebugCodeEnabled (
238 VOID
239 )
240 {
241 return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_DEBUG_CODE_ENABLED) != 0);
242 }
243
244
245 /**
246
247 Returns TRUE if DEBUG_CLEAR_MEMORY()macro is enabled.
248
249 This function returns TRUE if the DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of
250 PcdDebugProperyMask is set. Otherwise FALSE is returned.
251
252 @retval TRUE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is set.
253 @retval FALSE The DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED bit of PcdDebugProperyMask is clear.
254
255 **/
256 BOOLEAN
257 EFIAPI
258 DebugClearMemoryEnabled (
259 VOID
260 )
261 {
262 return (BOOLEAN) ((PcdGet8(PcdDebugPropertyMask) & DEBUG_PROPERTY_CLEAR_MEMORY_ENABLED) != 0);
263 }