]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Universal/StatusCode/RuntimeDxe/DebugAssert.c
Initial import.
[mirror_edk2.git] / EdkModulePkg / Universal / StatusCode / RuntimeDxe / DebugAssert.c
CommitLineData
878ddf1f 1/*++\r
2\r
3Copyright (c) 2006, Intel Corporation \r
4All rights reserved. This program and the accompanying materials \r
5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12Module Name:\r
13\r
14 DebugAssert.c\r
15\r
16Abstract:\r
17\r
18 Produce EfiDebugAssertProtocol to enable EfiUtilityLib to function.\r
19 The EfiUtilityLib is used by the EFI shell!\r
20\r
21--*/\r
22\r
23#include "StatusCode.h"\r
24\r
25EFI_STATUS\r
26EFIAPI\r
27StatusCodeDebugAssert (\r
28 IN EFI_DEBUG_ASSERT_PROTOCOL *This,\r
29 IN CHAR8 *FileName,\r
30 IN INTN LineNumber,\r
31 IN CHAR8 *Description\r
32 );\r
33\r
34EFI_STATUS\r
35EFIAPI\r
36StatusCodeDebugPrint (\r
37 IN EFI_DEBUG_ASSERT_PROTOCOL *This,\r
38 IN UINTN ErrorLevel,\r
39 IN CHAR8 *Format,\r
40 IN VA_LIST Marker\r
41 );\r
42\r
43EFI_STATUS\r
44EFIAPI\r
45StatusCodePostCode (\r
46 IN EFI_DEBUG_ASSERT_PROTOCOL * This,\r
47 IN UINT16 PostCode,\r
48 IN CHAR8 *PostCodeString OPTIONAL\r
49 );\r
50\r
51EFI_STATUS\r
52EFIAPI\r
53StatusCodeGetErrorLevel (\r
54 IN EFI_DEBUG_ASSERT_PROTOCOL *This,\r
55 IN UINTN *ErrorLevel\r
56 );\r
57\r
58EFI_STATUS\r
59EFIAPI\r
60StatusCodeSetErrorLevel (\r
61 IN EFI_DEBUG_ASSERT_PROTOCOL *This,\r
62 IN UINTN ErrorLevel\r
63 );\r
64\r
65//\r
66// Protocol instance, there can be only one.\r
67//\r
68EFI_HANDLE mHandle = NULL;\r
69EFI_DEBUG_ASSERT_PROTOCOL mDebugAssertProtocol = {\r
70 StatusCodeDebugAssert,\r
71 StatusCodeDebugPrint,\r
72 StatusCodePostCode,\r
73 StatusCodeGetErrorLevel,\r
74 StatusCodeSetErrorLevel\r
75};\r
76\r
77//\r
78// Function implementations\r
79//\r
80EFI_STATUS\r
81EFIAPI\r
82StatusCodeDebugAssert (\r
83 IN EFI_DEBUG_ASSERT_PROTOCOL *This,\r
84 IN CHAR8 *FileName,\r
85 IN INTN LineNumber,\r
86 IN CHAR8 *Description\r
87 )\r
88/*++\r
89\r
90Routine Description:\r
91\r
92 Worker function for ASSERT (). If Error Logging hub is loaded log ASSERT\r
93 information. If Error Logging hub is not loaded CpuBreakpoint ().\r
94 \r
95Arguments:\r
96\r
97 This - Protocol instance.\r
98 FileName - File name of failing routine.\r
99 LineNumber - Line number of failing ASSERT().\r
100 Description - Description, usually the assertion,\r
101\r
102Returns:\r
103\r
104 EFI_SUCCESS The function always completes successfully.\r
105\r
106--*/\r
107{\r
108 DebugAssert (FileName, LineNumber, Description);\r
109\r
110 return EFI_SUCCESS;\r
111}\r
112\r
113EFI_STATUS\r
114EFIAPI\r
115StatusCodeDebugPrint (\r
116 IN EFI_DEBUG_ASSERT_PROTOCOL *This,\r
117 IN UINTN ErrorLevel,\r
118 IN CHAR8 *Format,\r
119 IN VA_LIST Marker\r
120 )\r
121/*++\r
122\r
123Routine Description:\r
124\r
125 Worker function for DEBUG (). If Error Logging hub is loaded log ASSERT\r
126 information. If Error Logging hub is not loaded do nothing.\r
127 \r
128Arguments:\r
129\r
130 This - Protocol Instance.\r
131 ErrorLevel - If error level is set do the debug print.\r
132 Format - String to use for the print, followed by Print arguments.\r
133\r
134Returns:\r
135\r
136 EFI_SUCCESS The function always completes successfully.\r
137\r
138--*/\r
139{\r
140 CHAR8 Buffer[EFI_STATUS_CODE_DATA_MAX_SIZE];\r
141\r
142 AsciiVSPrint (Buffer, EFI_STATUS_CODE_DATA_MAX_SIZE, Format, Marker);\r
143 DebugPrint (ErrorLevel, Buffer);\r
144\r
145 return EFI_SUCCESS;\r
146}\r
147\r
148EFI_STATUS\r
149EFIAPI\r
150StatusCodeGetErrorLevel (\r
151 IN EFI_DEBUG_ASSERT_PROTOCOL *This,\r
152 IN UINTN *ErrorLevel\r
153 )\r
154{\r
155 *ErrorLevel = PcdGet32(PcdDebugPrintErrorLevel);\r
156 return EFI_SUCCESS;\r
157}\r
158\r
159EFI_STATUS\r
160EFIAPI\r
161StatusCodeSetErrorLevel (\r
162 IN EFI_DEBUG_ASSERT_PROTOCOL *This,\r
163 IN UINTN ErrorLevel\r
164 )\r
165{\r
166 return EFI_UNSUPPORTED;\r
167}\r
168\r
169EFI_STATUS\r
170EFIAPI\r
171StatusCodePostCode (\r
172 IN EFI_DEBUG_ASSERT_PROTOCOL * This,\r
173 IN UINT16 PostCode,\r
174 IN CHAR8 *PostCodeString OPTIONAL\r
175 )\r
176/*++\r
177\r
178Routine Description:\r
179\r
180 Write the code to IO ports 80 and 81.\r
181\r
182Arguments:\r
183\r
184 This - Protocol Instance.\r
185 PostCode - Code to write\r
186 PostCodeString - String, currently ignored.\r
187\r
188Returns:\r
189\r
190 EFI_SUCCESS The function always completes successfully.\r
191\r
192--*/\r
193{\r
194 IoWrite8 (0x80, (UINT8) (PostCode & 0xff));\r
195 IoWrite8 (0x81, (UINT8) (PostCode >> 8));\r
196\r
197 return EFI_SUCCESS;\r
198}\r
199\r
200EFI_STATUS\r
201InstallStatusCodeDebugAssert (\r
202 VOID\r
203 )\r
204/*++\r
205\r
206Routine Description:\r
207\r
208 Install the status code debug assert protocol\r
209\r
210Arguments:\r
211\r
212 None\r
213\r
214Returns:\r
215\r
216 Results of call to InstallProtocolInterface.\r
217\r
218--*/\r
219{\r
220\r
221 DEBUG_CODE (\r
222 gBS->InstallProtocolInterface (\r
223 &mHandle,\r
224 &gEfiDebugAssertProtocolGuid,\r
225 EFI_NATIVE_INTERFACE,\r
226 &mDebugAssertProtocol\r
227 );\r
228 );\r
229\r
230 return EFI_SUCCESS;\r
231}\r