TianoCore EDK2 master
Loading...
Searching...
No Matches
Edb.c
Go to the documentation of this file.
1
8#include <Uefi.h>
9#include "Edb.h"
10
11EFI_DEBUGGER_PRIVATE_DATA mDebuggerPrivate = {
12 EFI_DEBUGGER_SIGNATURE, // Signature
13 IsaEbc, // Isa
14 (EBC_DEBUGGER_MAJOR_VERSION << 16) |
15 EBC_DEBUGGER_MINOR_VERSION, // EfiDebuggerRevision
16 (VM_MAJOR_VERSION << 16) |
17 VM_MINOR_VERSION, // EbcVmRevision
18 {
19 EFI_DEBUGGER_CONFIGURATION_VERSION,
20 &mDebuggerPrivate,
21 }, // DebuggerConfiguration
22 NULL, // DebugImageInfoTableHeader
23 NULL, // Vol
24 NULL, // PciRootBridgeIo
25 mDebuggerCommandSet, // DebuggerCommandSet
26 { 0 }, // DebuggerSymbolContext
27 0, // DebuggerBreakpointCount
28 {
29 { 0 }
30 }, // DebuggerBreakpointContext
31 0, // CallStackEntryCount
32 {
33 { 0 }
34 }, // CallStackEntry
35 0, // TraceEntryCount
36 {
37 { 0 }
38 }, // TraceEntry
39 { 0 }, // StepContext
40 { 0 }, // GoTilContext
41 0, // InstructionScope
42 EFI_DEBUG_DEFAULT_INSTRUCTION_NUMBER, // InstructionNumber
43 EFI_DEBUG_FLAG_EBC_BOE | EFI_DEBUG_FLAG_EBC_BOT, // FeatureFlags
44 0, // StatusFlags
45 FALSE, // EnablePageBreak
46 NULL // BreakEvent
47};
48
49CHAR16 *mExceptionStr[] = {
50 L"EXCEPT_EBC_UNDEFINED",
51 L"EXCEPT_EBC_DIVIDE_ERROR",
52 L"EXCEPT_EBC_DEBUG",
53 L"EXCEPT_EBC_BREAKPOINT",
54 L"EXCEPT_EBC_OVERFLOW",
55 L"EXCEPT_EBC_INVALID_OPCODE",
56 L"EXCEPT_EBC_STACK_FAULT",
57 L"EXCEPT_EBC_ALIGNMENT_CHECK",
58 L"EXCEPT_EBC_INSTRUCTION_ENCODING",
59 L"EXCEPT_EBC_BAD_BREAK",
60 L"EXCEPT_EBC_SINGLE_STEP",
61};
62
71VOID
73 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
74 IN BOOLEAN NeedRemove
75 )
76{
77 UINTN Index;
78
79 //
80 // Patch all the breakpoint
81 //
82 for (Index = 0; (Index < DebuggerPrivate->DebuggerBreakpointCount) && (Index < EFI_DEBUGGER_BREAKPOINT_MAX); Index++) {
83 if (DebuggerPrivate->DebuggerBreakpointContext[Index].State) {
84 CopyMem (
85 (VOID *)(UINTN)DebuggerPrivate->DebuggerBreakpointContext[Index].BreakpointAddress,
86 &DebuggerPrivate->DebuggerBreakpointContext[Index].OldInstruction,
87 sizeof (UINT16)
88 );
89 }
90 }
91
92 //
93 // Zero Breakpoint context, if need to remove all breakpoint
94 //
95 if (NeedRemove) {
96 DebuggerPrivate->DebuggerBreakpointCount = 0;
97 ZeroMem (DebuggerPrivate->DebuggerBreakpointContext, sizeof (DebuggerPrivate->DebuggerBreakpointContext));
98 }
99
100 //
101 // Done
102 //
103 return;
104}
105
113VOID
115 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate
116 )
117{
118 UINTN Index;
119 UINT16 Data16;
120
121 //
122 // Set all the breakpoint (BREAK(3) : 0x0300)
123 //
124 Data16 = 0x0300;
125 for (Index = 0; (Index < DebuggerPrivate->DebuggerBreakpointCount) && (Index < EFI_DEBUGGER_BREAKPOINT_MAX); Index++) {
126 if (DebuggerPrivate->DebuggerBreakpointContext[Index].State) {
127 CopyMem (
128 (VOID *)(UINTN)DebuggerPrivate->DebuggerBreakpointContext[Index].BreakpointAddress,
129 &Data16,
130 sizeof (UINT16)
131 );
132 }
133 }
134
135 //
136 // Check if current break is caused by breakpoint set.
137 // If so, we need to patch memory back to let user see the real memory.
138 //
139 if (DebuggerPrivate->DebuggerBreakpointContext[EFI_DEBUGGER_BREAKPOINT_MAX].BreakpointAddress != 0) {
140 CopyMem (
141 (VOID *)(UINTN)DebuggerPrivate->DebuggerBreakpointContext[EFI_DEBUGGER_BREAKPOINT_MAX].BreakpointAddress,
142 &DebuggerPrivate->DebuggerBreakpointContext[EFI_DEBUGGER_BREAKPOINT_MAX].OldInstruction,
143 sizeof (UINT16)
144 );
145 DebuggerPrivate->StatusFlags &= ~EFI_DEBUG_FLAG_EBC_B_BP;
146 }
147
148 //
149 // Done
150 //
151 return;
152}
153
163VOID
165 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
166 IN EFI_SYSTEM_CONTEXT SystemContext
167 )
168{
169 UINT64 Address;
170 UINTN Index;
171 BOOLEAN IsHitBreakpoint;
172
173 //
174 // Roll back IP for breakpoint instruction (BREAK(3) : 0x0300)
175 //
176 Address = SystemContext.SystemContextEbc->Ip - sizeof (UINT16);
177
178 //
179 // Check if the breakpoint is hit
180 //
181 IsHitBreakpoint = FALSE;
182 for (Index = 0; (Index < DebuggerPrivate->DebuggerBreakpointCount) && (Index < EFI_DEBUGGER_BREAKPOINT_MAX); Index++) {
183 if ((DebuggerPrivate->DebuggerBreakpointContext[Index].BreakpointAddress == Address) &&
184 (DebuggerPrivate->DebuggerBreakpointContext[Index].State))
185 {
186 IsHitBreakpoint = TRUE;
187 break;
188 }
189 }
190
191 if (IsHitBreakpoint) {
192 //
193 // If hit, record current breakpoint
194 //
195 DebuggerPrivate->DebuggerBreakpointContext[EFI_DEBUGGER_BREAKPOINT_MAX] = DebuggerPrivate->DebuggerBreakpointContext[Index];
196 DebuggerPrivate->DebuggerBreakpointContext[EFI_DEBUGGER_BREAKPOINT_MAX].State = TRUE;
197 //
198 // Update: IP and Instruction (NOTE: Since we not allow set breakpoint to BREAK 3, this update is safe)
199 //
200 SystemContext.SystemContextEbc->Ip = Address;
201 //
202 // Set Flags
203 //
204 DebuggerPrivate->StatusFlags |= EFI_DEBUG_FLAG_EBC_BP;
205 } else {
206 //
207 // If not hit, check whether current IP is in breakpoint list,
208 // because STEP will be triggered before execute the instruction.
209 // We should not patch it in de-init.
210 //
211 Address = SystemContext.SystemContextEbc->Ip;
212
213 //
214 // Check if the breakpoint is hit
215 //
216 IsHitBreakpoint = FALSE;
217 for (Index = 0; (Index < DebuggerPrivate->DebuggerBreakpointCount) && (Index < EFI_DEBUGGER_BREAKPOINT_MAX); Index++) {
218 if ((DebuggerPrivate->DebuggerBreakpointContext[Index].BreakpointAddress == Address) &&
219 (DebuggerPrivate->DebuggerBreakpointContext[Index].State))
220 {
221 IsHitBreakpoint = TRUE;
222 break;
223 }
224 }
225
226 if (IsHitBreakpoint) {
227 //
228 // If hit, record current breakpoint
229 //
230 CopyMem (
231 &DebuggerPrivate->DebuggerBreakpointContext[EFI_DEBUGGER_BREAKPOINT_MAX],
232 &DebuggerPrivate->DebuggerBreakpointContext[Index],
233 sizeof (DebuggerPrivate->DebuggerBreakpointContext[EFI_DEBUGGER_BREAKPOINT_MAX])
234 );
235 DebuggerPrivate->DebuggerBreakpointContext[EFI_DEBUGGER_BREAKPOINT_MAX].State = TRUE;
236 //
237 // Do not set Breakpoint flag. We record the address here just let it not patch breakpoint address when de-init.
238 //
239 } else {
240 //
241 // Zero current breakpoint
242 //
243 ZeroMem (
244 &DebuggerPrivate->DebuggerBreakpointContext[EFI_DEBUGGER_BREAKPOINT_MAX],
245 sizeof (DebuggerPrivate->DebuggerBreakpointContext[EFI_DEBUGGER_BREAKPOINT_MAX])
246 );
247 }
248 }
249
250 //
251 // Done
252 //
253 return;
254}
255
262VOID
264 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate
265 )
266{
267 EFI_DEBUGGER_SYMBOL_CONTEXT *DebuggerSymbolContext;
269 UINTN ObjectIndex;
270 UINTN Index;
271
272 //
273 // Go throuth each object
274 //
275 DebuggerSymbolContext = &DebuggerPrivate->DebuggerSymbolContext;
276 for (ObjectIndex = 0; ObjectIndex < DebuggerSymbolContext->ObjectCount; ObjectIndex++) {
277 Object = &DebuggerSymbolContext->Object[ObjectIndex];
278 //
279 // Go throuth each entry
280 //
281 for (Index = 0; Index < Object->EntryCount; Index++) {
282 ZeroMem (&Object->Entry[Index], sizeof (Object->Entry[Index]));
283 }
284
285 ZeroMem (Object->Name, sizeof (Object->Name));
286 Object->EntryCount = 0;
287 Object->BaseAddress = 0;
288 Object->StartEntrypointRVA = 0;
289 Object->MainEntrypointRVA = 0;
290 //
291 // Free source buffer
292 //
293 for (Index = 0; Object->SourceBuffer[Index] != NULL; Index++) {
294 gBS->FreePool (Object->SourceBuffer[Index]);
295 Object->SourceBuffer[Index] = NULL;
296 }
297 }
298
299 DebuggerSymbolContext->ObjectCount = 0;
300
301 return;
302}
303
316 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
317 IN EFI_EXCEPTION_TYPE ExceptionType,
318 IN EFI_SYSTEM_CONTEXT SystemContext,
319 IN BOOLEAN Initialized
320 )
321{
322 //
323 // clear STEP flag in any condition.
324 //
325 if (SystemContext.SystemContextEbc->Flags & ((UINT64)VMFLAGS_STEP)) {
326 SystemContext.SystemContextEbc->Flags &= ~((UINT64)VMFLAGS_STEP);
327 }
328
329 if (!Initialized) {
330 //
331 // Initialize everything
332 //
333 DebuggerPrivate->InstructionNumber = EFI_DEBUG_DEFAULT_INSTRUCTION_NUMBER;
334
335 DebuggerPrivate->DebuggerBreakpointCount = 0;
336 ZeroMem (DebuggerPrivate->DebuggerBreakpointContext, sizeof (DebuggerPrivate->DebuggerBreakpointContext));
337
338 // DebuggerPrivate->StatusFlags = 0;
339
340 DebuggerPrivate->DebuggerSymbolContext.DisplaySymbol = TRUE;
341 DebuggerPrivate->DebuggerSymbolContext.DisplayCodeOnly = FALSE;
342 DebuggerPrivate->DebuggerSymbolContext.ObjectCount = 0;
343 } else {
344 //
345 // Already initialized, just check Breakpoint here.
346 //
347 if (ExceptionType == EXCEPT_EBC_BREAKPOINT) {
348 EdbCheckBreakpoint (DebuggerPrivate, SystemContext);
349 }
350
351 //
352 // Clear all breakpoint
353 //
354 EdbClearAllBreakpoint (DebuggerPrivate, FALSE);
355 }
356
357 //
358 // Set Scope to currentl IP. (Note: Check Breakpoint may change Ip)
359 //
360 DebuggerPrivate->InstructionScope = SystemContext.SystemContextEbc->Ip;
361
362 //
363 // Done
364 //
365 return EFI_SUCCESS;
366}
367
380 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
381 IN EFI_EXCEPTION_TYPE ExceptionType,
382 IN EFI_SYSTEM_CONTEXT SystemContext,
383 IN BOOLEAN Initialized
384 )
385{
386 if (!Initialized) {
387 //
388 // If it does not want initialized state, de-init everything
389 //
390 DebuggerPrivate->FeatureFlags = EFI_DEBUG_FLAG_EBC_BOE | EFI_DEBUG_FLAG_EBC_BOT;
391 DebuggerPrivate->CallStackEntryCount = 0;
392 DebuggerPrivate->TraceEntryCount = 0;
393 ZeroMem (DebuggerPrivate->CallStackEntry, sizeof (DebuggerPrivate->CallStackEntry));
394 ZeroMem (DebuggerPrivate->TraceEntry, sizeof (DebuggerPrivate->TraceEntry));
395
396 //
397 // Clear all breakpoint
398 //
399 EdbClearAllBreakpoint (DebuggerPrivate, TRUE);
400
401 //
402 // Clear symbol
403 //
404 EdbClearSymbol (DebuggerPrivate);
405 } else {
406 //
407 // If it wants to keep initialized state, just set breakpoint.
408 //
409 EdbSetAllBreakpoint (DebuggerPrivate);
410 }
411
412 //
413 // Clear Step context
414 //
415 ZeroMem (&mDebuggerPrivate.StepContext, sizeof (mDebuggerPrivate.StepContext));
416 DebuggerPrivate->StatusFlags = 0;
417
418 //
419 // Done
420 //
421 return EFI_SUCCESS;
422}
423
434VOID
436 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,
437 IN EFI_EXCEPTION_TYPE ExceptionType,
438 IN EFI_SYSTEM_CONTEXT SystemContext,
439 IN BOOLEAN Initialized
440 )
441{
442 //
443 // Print break status
444 //
445 if ((DebuggerPrivate->StatusFlags & EFI_DEBUG_FLAG_EBC_GT) == EFI_DEBUG_FLAG_EBC_GT) {
446 EDBPrint (L"Break on GoTil\n");
447 } else if ((DebuggerPrivate->StatusFlags & EFI_DEBUG_FLAG_EBC_BOC) == EFI_DEBUG_FLAG_EBC_BOC) {
448 EDBPrint (L"Break on CALL\n");
449 } else if ((DebuggerPrivate->StatusFlags & EFI_DEBUG_FLAG_EBC_BOCX) == EFI_DEBUG_FLAG_EBC_BOCX) {
450 EDBPrint (L"Break on CALLEX\n");
451 } else if ((DebuggerPrivate->StatusFlags & EFI_DEBUG_FLAG_EBC_BOR) == EFI_DEBUG_FLAG_EBC_BOR) {
452 EDBPrint (L"Break on RET\n");
453 } else if ((DebuggerPrivate->StatusFlags & EFI_DEBUG_FLAG_EBC_BOE) == EFI_DEBUG_FLAG_EBC_BOE) {
454 EDBPrint (L"Break on Entrypoint\n");
455 } else if ((DebuggerPrivate->StatusFlags & EFI_DEBUG_FLAG_EBC_BOT) == EFI_DEBUG_FLAG_EBC_BOT) {
456 EDBPrint (L"Break on Thunk\n");
457 } else if ((DebuggerPrivate->StatusFlags & EFI_DEBUG_FLAG_EBC_STEPOVER) == EFI_DEBUG_FLAG_EBC_STEPOVER) {
458 EDBPrint (L"Break on StepOver\n");
459 } else if ((DebuggerPrivate->StatusFlags & EFI_DEBUG_FLAG_EBC_STEPOUT) == EFI_DEBUG_FLAG_EBC_STEPOUT) {
460 EDBPrint (L"Break on StepOut\n");
461 } else if ((DebuggerPrivate->StatusFlags & EFI_DEBUG_FLAG_EBC_BP) == EFI_DEBUG_FLAG_EBC_BP) {
462 EDBPrint (L"Break on Breakpoint\n");
463 } else if ((DebuggerPrivate->StatusFlags & EFI_DEBUG_FLAG_EBC_BOK) == EFI_DEBUG_FLAG_EBC_BOK) {
464 EDBPrint (L"Break on Key\n");
465 } else {
466 EDBPrint (L"Exception Type - %x", (UINTN)ExceptionType);
467 if ((ExceptionType >= EXCEPT_EBC_UNDEFINED) && (ExceptionType <= EXCEPT_EBC_STEP)) {
468 EDBPrint (L" (%s)\n", mExceptionStr[ExceptionType]);
469 } else {
470 EDBPrint (L"\n");
471 }
472 }
473
474 return;
475}
476
487VOID
488EFIAPI
490 IN EFI_EXCEPTION_TYPE ExceptionType,
491 IN OUT EFI_SYSTEM_CONTEXT SystemContext
492 )
493{
494 CHAR16 InputBuffer[EFI_DEBUG_INPUS_BUFFER_SIZE];
495 CHAR16 *CommandArg;
496 EFI_DEBUGGER_COMMAND DebuggerCommand;
497 EFI_DEBUG_STATUS DebugStatus;
498 STATIC BOOLEAN mInitialized;
499
500 mInitialized = FALSE;
501
502 DEBUG ((DEBUG_ERROR, "Hello EBC Debugger!\n"));
503
504 if (!mInitialized) {
505 //
506 // Print version
507 //
508 EDBPrint (
509 L"EBC Interpreter Version - %d.%d\n",
510 (UINTN)VM_MAJOR_VERSION,
511 (UINTN)VM_MINOR_VERSION
512 );
513 EDBPrint (
514 L"EBC Debugger Version - %d.%d\n",
515 (UINTN)EBC_DEBUGGER_MAJOR_VERSION,
516 (UINTN)EBC_DEBUGGER_MINOR_VERSION
517 );
518 }
519
520 //
521 // Init Private Data
522 //
523 InitDebuggerPrivateData (&mDebuggerPrivate, ExceptionType, SystemContext, mInitialized);
524
525 //
526 // EDBPrint basic info
527 //
528 PrintExceptionReason (&mDebuggerPrivate, ExceptionType, SystemContext, mInitialized);
529
530 EdbShowDisasm (&mDebuggerPrivate, SystemContext);
531 // EFI_BREAKPOINT ();
532
533 if (!mInitialized) {
534 //
535 // Interactive with user
536 //
537 EDBPrint (L"\nPlease enter command now, \'h\' for help.\n");
538 EDBPrint (L"(Using <Command> -b <...> to enable page break.)\n");
539 }
540
541 mInitialized = TRUE;
542
543 //
544 // Dispatch each command
545 //
546 while (TRUE) {
547 //
548 // Get user input
549 //
550 Input (L"\n\r" EFI_DEBUG_PROMPT_STRING, InputBuffer, EFI_DEBUG_INPUS_BUFFER_SIZE);
551 EDBPrint (L"\n");
552
553 //
554 // Get command
555 //
556 DebuggerCommand = MatchDebuggerCommand (InputBuffer, &CommandArg);
557 if (DebuggerCommand == NULL) {
558 EDBPrint (L"ERROR: Command not found!\n");
559 continue;
560 }
561
562 //
563 // Check PageBreak;
564 //
565 if (CommandArg != NULL) {
566 if (StriCmp (CommandArg, L"-b") == 0) {
567 CommandArg = StrGetNextTokenLine (L" ");
568 mDebuggerPrivate.EnablePageBreak = TRUE;
569 }
570 }
571
572 //
573 // Dispatch command
574 //
575 DebugStatus = DebuggerCommand (CommandArg, &mDebuggerPrivate, ExceptionType, SystemContext);
576 mDebuggerPrivate.EnablePageBreak = FALSE;
577
578 //
579 // Check command return status
580 //
581 if (DebugStatus == EFI_DEBUG_RETURN) {
582 mInitialized = FALSE;
583 break;
584 } else if (DebugStatus == EFI_DEBUG_BREAK) {
585 break;
586 } else if (DebugStatus == EFI_DEBUG_CONTINUE) {
587 continue;
588 } else {
589 ASSERT (FALSE);
590 }
591 }
592
593 //
594 // Deinit Private Data
595 //
596 DeinitDebuggerPrivateData (&mDebuggerPrivate, ExceptionType, SystemContext, mInitialized);
597
598 DEBUG ((DEBUG_ERROR, "Goodbye EBC Debugger!\n"));
599
600 return;
601}
UINT64 UINTN
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
VOID PrintExceptionReason(IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate, IN EFI_EXCEPTION_TYPE ExceptionType, IN EFI_SYSTEM_CONTEXT SystemContext, IN BOOLEAN Initialized)
Definition: Edb.c:435
VOID EdbClearSymbol(IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate)
Definition: Edb.c:263
EFI_STATUS InitDebuggerPrivateData(IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate, IN EFI_EXCEPTION_TYPE ExceptionType, IN EFI_SYSTEM_CONTEXT SystemContext, IN BOOLEAN Initialized)
Definition: Edb.c:315
VOID EdbClearAllBreakpoint(IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate, IN BOOLEAN NeedRemove)
Definition: Edb.c:72
EFI_STATUS DeinitDebuggerPrivateData(IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate, IN EFI_EXCEPTION_TYPE ExceptionType, IN EFI_SYSTEM_CONTEXT SystemContext, IN BOOLEAN Initialized)
Definition: Edb.c:379
VOID EdbCheckBreakpoint(IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate, IN EFI_SYSTEM_CONTEXT SystemContext)
Definition: Edb.c:164
VOID EdbSetAllBreakpoint(IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate)
Definition: Edb.c:114
VOID EFIAPI EdbExceptionHandler(IN EFI_EXCEPTION_TYPE ExceptionType, IN OUT EFI_SYSTEM_CONTEXT SystemContext)
Definition: Edb.c:489
EFI_DEBUGGER_COMMAND MatchDebuggerCommand(IN CHAR16 *CommandName, IN CHAR16 **CommandArg)
Definition: EdbCommand.c:582
EFI_STATUS EdbShowDisasm(IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate, IN EFI_SYSTEM_CONTEXT SystemContext)
CHAR16 *EFIAPI StrGetNextTokenLine(IN CHAR16 *CharSet)
VOID EFIAPI Input(IN CHAR16 *Prompt OPTIONAL, OUT CHAR16 *InStr, IN UINTN StrLen)
Definition: EdbSupportUI.c:187
UINTN EFIAPI EDBPrint(IN CONST CHAR16 *Format,...)
Definition: EdbSupportUI.c:683
INTN EFIAPI StriCmp(IN CHAR16 *String, IN CHAR16 *String2)
#define NULL
Definition: Base.h:319
#define STATIC
Definition: Base.h:264
#define TRUE
Definition: Base.h:301
#define FALSE
Definition: Base.h:307
#define IN
Definition: Base.h:279
#define OUT
Definition: Base.h:284
#define DEBUG(Expression)
Definition: DebugLib.h:434
#define EXCEPT_EBC_UNDEFINED
Definition: DebugSupport.h:437
INTN EFI_EXCEPTION_TYPE
Definition: DebugSupport.h:35
#define EXCEPT_EBC_STEP
Definition: DebugSupport.h:447
@ IsaEbc
0x0EBC
Definition: DebugSupport.h:840
RETURN_STATUS EFI_STATUS
Definition: UefiBaseType.h:29
#define EFI_SUCCESS
Definition: UefiBaseType.h:112
EFI_BOOT_SERVICES * gBS