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