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