]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - SourceLevelDebugPkg/Library/DebugAgent/DxeDebugAgent/DxeDebugAgentLib.c
SourceLevelDebugPkg: Use CPU Local APIC timer to handle timeout.
[mirror_edk2.git] / SourceLevelDebugPkg / Library / DebugAgent / DxeDebugAgent / DxeDebugAgentLib.c
... / ...
CommitLineData
1/** @file\r
2 Debug Agent library implementition for Dxe Core and Dxr modules.\r
3\r
4 Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved.<BR>\r
5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php.\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "DxeDebugAgentLib.h"\r
16\r
17DEBUG_AGENT_MAILBOX mMailbox;\r
18DEBUG_AGENT_MAILBOX *mMailboxPointer = NULL;\r
19IA32_IDT_GATE_DESCRIPTOR mIdtEntryTable[33];\r
20BOOLEAN mDxeCoreFlag = FALSE;\r
21BOOLEAN mMultiProcessorDebugSupport = FALSE;\r
22VOID *mSavedIdtTable = NULL;\r
23UINTN mSaveIdtTableSize = 0;\r
24BOOLEAN mDebugAgentInitialized = FALSE;\r
25BOOLEAN mSkipBreakpoint = FALSE;\r
26\r
27/**\r
28 Check if debug agent support multi-processor.\r
29\r
30 @retval TRUE Multi-processor is supported.\r
31 @retval FALSE Multi-processor is not supported.\r
32\r
33**/\r
34BOOLEAN\r
35MultiProcessorDebugSupport (\r
36 VOID\r
37 )\r
38{\r
39 return mMultiProcessorDebugSupport;\r
40}\r
41\r
42/**\r
43 Internal constructor worker function.\r
44\r
45 It will register one callback function on EFI PCD Protocol.\r
46 It will allocate the NVS memory to store Mailbox and install configuration table\r
47 in system table to store its pointer.\r
48\r
49**/\r
50VOID\r
51InternalConstructorWorker (\r
52 VOID\r
53 )\r
54{\r
55 EFI_STATUS Status;\r
56 EFI_PHYSICAL_ADDRESS Address;\r
57 BOOLEAN DebugTimerInterruptState;\r
58 DEBUG_AGENT_MAILBOX *Mailbox;\r
59 DEBUG_AGENT_MAILBOX *NewMailbox;\r
60 EFI_HOB_GUID_TYPE *GuidHob;\r
61 EFI_VECTOR_HANDOFF_INFO *VectorHandoffInfo;\r
62\r
63 //\r
64 // Check persisted vector handoff info\r
65 //\r
66 Status = EFI_SUCCESS;\r
67 GuidHob = GetFirstGuidHob (&gEfiVectorHandoffInfoPpiGuid);\r
68 if (GuidHob != NULL && !mDxeCoreFlag) {\r
69 //\r
70 // Check if configuration table is installed or not if GUIDed HOB existed,\r
71 // only when Debug Agent is not linked by DXE Core\r
72 //\r
73 Status = EfiGetSystemConfigurationTable (&gEfiVectorHandoffTableGuid, (VOID **) &VectorHandoffInfo);\r
74 }\r
75 if (GuidHob == NULL || Status != EFI_SUCCESS) {\r
76 //\r
77 // Install configuration table for persisted vector handoff info if GUIDed HOB cannot be found or\r
78 // configuration table does not exist\r
79 //\r
80 Status = gBS->InstallConfigurationTable (&gEfiVectorHandoffTableGuid, (VOID *) &mVectorHandoffInfoDebugAgent[0]);\r
81 if (EFI_ERROR (Status)) {\r
82 DEBUG ((EFI_D_ERROR, "DebugAgent: Cannot install configuration table for persisted vector handoff info!\n"));\r
83 CpuDeadLoop ();\r
84 }\r
85 }\r
86\r
87 //\r
88 // Install EFI Serial IO protocol on debug port\r
89 //\r
90 InstallSerialIo ();\r
91\r
92 Address = 0;\r
93 Status = gBS->AllocatePages (\r
94 AllocateAnyPages,\r
95 EfiACPIMemoryNVS,\r
96 EFI_SIZE_TO_PAGES (sizeof(DEBUG_AGENT_MAILBOX) + PcdGet16(PcdDebugPortHandleBufferSize)),\r
97 &Address\r
98 );\r
99 if (EFI_ERROR (Status)) {\r
100 DEBUG ((EFI_D_ERROR, "DebugAgent: Cannot install configuration table for mailbox!\n"));\r
101 CpuDeadLoop ();\r
102 }\r
103\r
104 DebugTimerInterruptState = SaveAndSetDebugTimerInterrupt (FALSE);\r
105\r
106 NewMailbox = (DEBUG_AGENT_MAILBOX *) (UINTN) Address;\r
107 //\r
108 // Copy Mailbox and Debug Port Handle buffer to new location in ACPI NVS memory, because original Mailbox\r
109 // and Debug Port Handle buffer may be free at runtime, SMM debug agent needs to access them\r
110 //\r
111 Mailbox = GetMailboxPointer ();\r
112 CopyMem (NewMailbox, Mailbox, sizeof (DEBUG_AGENT_MAILBOX));\r
113 CopyMem (NewMailbox + 1, (VOID *)(UINTN)Mailbox->DebugPortHandle, PcdGet16(PcdDebugPortHandleBufferSize));\r
114 //\r
115 // Update Debug Port Handle in new Mailbox\r
116 //\r
117 UpdateMailboxContent (NewMailbox, DEBUG_MAILBOX_DEBUG_PORT_HANDLE_INDEX, (UINT64)(UINTN)(NewMailbox + 1));\r
118 mMailboxPointer = NewMailbox;\r
119\r
120 DebugTimerInterruptState = SaveAndSetDebugTimerInterrupt (DebugTimerInterruptState);\r
121\r
122 Status = gBS->InstallConfigurationTable (&gEfiDebugAgentGuid, (VOID *) mMailboxPointer);\r
123 if (EFI_ERROR (Status)) {\r
124 DEBUG ((EFI_D_ERROR, "DebugAgent: Failed to install configuration for mailbox!\n"));\r
125 CpuDeadLoop ();\r
126 }\r
127}\r
128\r
129/**\r
130 Debug Agent constructor function.\r
131\r
132 @param[in] ImageHandle The firmware allocated handle for the EFI image.\r
133 @param[in] SystemTable A pointer to the EFI System Table.\r
134\r
135 @retval RETURN_SUCCESS When this function completed.\r
136\r
137**/\r
138RETURN_STATUS\r
139EFIAPI\r
140DxeDebugAgentLibConstructor (\r
141 IN EFI_HANDLE ImageHandle,\r
142 IN EFI_SYSTEM_TABLE *SystemTable\r
143 )\r
144{\r
145 if (mDxeCoreFlag) {\r
146 //\r
147 // Invoke internal constructor function only when DXE core links this library instance\r
148 //\r
149 InternalConstructorWorker ();\r
150 }\r
151\r
152 return RETURN_SUCCESS;\r
153}\r
154\r
155/**\r
156 Get the pointer to Mailbox from the configuration table.\r
157\r
158 @return Pointer to Mailbox.\r
159\r
160**/\r
161DEBUG_AGENT_MAILBOX *\r
162GetMailboxFromConfigurationTable (\r
163 VOID\r
164 )\r
165{\r
166 EFI_STATUS Status;\r
167 DEBUG_AGENT_MAILBOX *Mailbox;\r
168\r
169 Status = EfiGetSystemConfigurationTable (&gEfiDebugAgentGuid, (VOID **) &Mailbox);\r
170 if (Status == EFI_SUCCESS && Mailbox != NULL) {\r
171 VerifyMailboxChecksum (Mailbox);\r
172 return Mailbox;\r
173 } else {\r
174 return NULL;\r
175 }\r
176}\r
177\r
178/**\r
179 Get the pointer to Mailbox from the GUIDed HOB.\r
180\r
181 @param[in] HobStart The starting HOB pointer to search from.\r
182\r
183 @return Pointer to Mailbox.\r
184\r
185**/\r
186DEBUG_AGENT_MAILBOX *\r
187GetMailboxFromHob (\r
188 IN VOID *HobStart\r
189 )\r
190{\r
191 EFI_HOB_GUID_TYPE *GuidHob;\r
192 UINT64 *MailboxLocation;\r
193 DEBUG_AGENT_MAILBOX *Mailbox;\r
194\r
195 GuidHob = GetNextGuidHob (&gEfiDebugAgentGuid, HobStart);\r
196 if (GuidHob == NULL) {\r
197 return NULL;\r
198 }\r
199 MailboxLocation = (UINT64 *) (GET_GUID_HOB_DATA(GuidHob));\r
200 Mailbox = (DEBUG_AGENT_MAILBOX *)(UINTN)(*MailboxLocation);\r
201 VerifyMailboxChecksum (Mailbox);\r
202\r
203 return Mailbox;\r
204}\r
205\r
206/**\r
207 Get Debug Agent Mailbox pointer.\r
208\r
209 @return Mailbox pointer.\r
210\r
211**/\r
212DEBUG_AGENT_MAILBOX *\r
213GetMailboxPointer (\r
214 VOID\r
215 )\r
216{\r
217 AcquireMpSpinLock (&mDebugMpContext.MailboxSpinLock);\r
218 VerifyMailboxChecksum (mMailboxPointer);\r
219 ReleaseMpSpinLock (&mDebugMpContext.MailboxSpinLock);\r
220 return mMailboxPointer;\r
221}\r
222\r
223/**\r
224 Get debug port handle.\r
225\r
226 @return Debug port handle.\r
227\r
228**/\r
229DEBUG_PORT_HANDLE\r
230GetDebugPortHandle (\r
231 VOID\r
232 )\r
233{\r
234 return (DEBUG_PORT_HANDLE) (UINTN)(GetMailboxPointer ()->DebugPortHandle);\r
235}\r
236\r
237/**\r
238 Worker function to setup IDT table and initialize the IDT entries.\r
239\r
240 @param[in] Mailbox Pointer to Mailbox.\r
241\r
242**/\r
243VOID\r
244SetupDebugAgentEnviroment (\r
245 IN DEBUG_AGENT_MAILBOX *Mailbox\r
246 )\r
247{\r
248 IA32_DESCRIPTOR Idtr;\r
249 UINT16 IdtEntryCount;\r
250 UINT64 DebugPortHandle;\r
251\r
252 if (mMultiProcessorDebugSupport) {\r
253 InitializeSpinLock (&mDebugMpContext.MpContextSpinLock);\r
254 InitializeSpinLock (&mDebugMpContext.DebugPortSpinLock);\r
255 InitializeSpinLock (&mDebugMpContext.MailboxSpinLock);\r
256 //\r
257 // Clear Break CPU index value\r
258 //\r
259 mDebugMpContext.BreakAtCpuIndex = (UINT32) -1;\r
260 }\r
261\r
262 //\r
263 // Get original IDT address and size.\r
264 //\r
265 AsmReadIdtr ((IA32_DESCRIPTOR *) &Idtr);\r
266 IdtEntryCount = (UINT16) ((Idtr.Limit + 1) / sizeof (IA32_IDT_GATE_DESCRIPTOR));\r
267 if (IdtEntryCount < 33) {\r
268 ZeroMem (&mIdtEntryTable, sizeof (IA32_IDT_GATE_DESCRIPTOR) * 33);\r
269 //\r
270 // Copy original IDT table into new one\r
271 //\r
272 CopyMem (&mIdtEntryTable, (VOID *) Idtr.Base, Idtr.Limit + 1);\r
273 //\r
274 // Load new IDT table\r
275 //\r
276 Idtr.Limit = (UINT16) (sizeof (IA32_IDT_GATE_DESCRIPTOR) * 33 - 1);\r
277 Idtr.Base = (UINTN) &mIdtEntryTable;\r
278 AsmWriteIdtr ((IA32_DESCRIPTOR *) &Idtr);\r
279 }\r
280\r
281 //\r
282 // Initialize the IDT table entries to support source level debug.\r
283 //\r
284 InitializeDebugIdt ();\r
285\r
286 //\r
287 // If mMailboxPointer is not set before, set it\r
288 //\r
289 if (mMailboxPointer == NULL) {\r
290 if (Mailbox != NULL) {\r
291 //\r
292 // If Mailbox exists, copy it into one global variable\r
293 //\r
294 CopyMem (&mMailbox, Mailbox, sizeof (DEBUG_AGENT_MAILBOX));\r
295 } else {\r
296 ZeroMem (&mMailbox, sizeof (DEBUG_AGENT_MAILBOX));\r
297 }\r
298 mMailboxPointer = &mMailbox;\r
299 }\r
300\r
301 //\r
302 // Initialize debug communication port\r
303 //\r
304 DebugPortHandle = (UINT64) (UINTN)DebugPortInitialize ((VOID *)(UINTN)mMailboxPointer->DebugPortHandle, NULL);\r
305 UpdateMailboxContent (mMailboxPointer, DEBUG_MAILBOX_DEBUG_PORT_HANDLE_INDEX, DebugPortHandle);\r
306\r
307 if (Mailbox == NULL) {\r
308 //\r
309 // Trigger one software interrupt to inform HOST\r
310 //\r
311 TriggerSoftInterrupt (SYSTEM_RESET_SIGNATURE);\r
312 SetDebugFlag (DEBUG_AGENT_FLAG_MEMORY_READY, 1);\r
313 //\r
314 // Memory has been ready\r
315 //\r
316 if (IsHostAttached ()) {\r
317 //\r
318 // Trigger one software interrupt to inform HOST\r
319 //\r
320 TriggerSoftInterrupt (MEMORY_READY_SIGNATURE);\r
321 }\r
322 }\r
323}\r
324\r
325\r
326/**\r
327 Initialize debug agent.\r
328\r
329 This function is used to set up debug enviroment for DXE phase.\r
330\r
331 If this function is called by DXE Core, Context must be the pointer\r
332 to HOB list which will be used to get GUIDed HOB. It will enable\r
333 interrupt to support break-in feature.\r
334 If this function is called by DXE module, Context must be NULL. It\r
335 will enable interrupt to support break-in feature.\r
336\r
337 @param[in] InitFlag Init flag is used to decide initialize process.\r
338 @param[in] Context Context needed according to InitFlag.\r
339 @param[in] Function Continue function called by debug agent library; it was\r
340 optional.\r
341\r
342**/\r
343VOID\r
344EFIAPI\r
345InitializeDebugAgent (\r
346 IN UINT32 InitFlag,\r
347 IN VOID *Context, OPTIONAL\r
348 IN DEBUG_AGENT_CONTINUE Function OPTIONAL\r
349 )\r
350{\r
351 UINT64 *MailboxLocation;\r
352 DEBUG_AGENT_MAILBOX *Mailbox;\r
353 BOOLEAN InterruptStatus;\r
354 VOID *HobList;\r
355 IA32_DESCRIPTOR IdtDescriptor;\r
356 IA32_DESCRIPTOR *Ia32Idtr;\r
357 IA32_IDT_ENTRY *Ia32IdtEntry;\r
358 UINT32 DebugTimerFrequency;\r
359\r
360 if (InitFlag == DEBUG_AGENT_INIT_DXE_AP) {\r
361 //\r
362 // Invoked by AP, enable interrupt to let AP could receive IPI from other processors\r
363 //\r
364 EnableInterrupts ();\r
365 return ;\r
366 }\r
367\r
368 //\r
369 // Disable Debug Timer interrupt\r
370 //\r
371 SaveAndSetDebugTimerInterrupt (FALSE);\r
372 //\r
373 // Save and disable original interrupt status\r
374 //\r
375 InterruptStatus = SaveAndDisableInterrupts ();\r
376\r
377 //\r
378 // Try to get mailbox firstly\r
379 //\r
380 HobList = NULL;\r
381 Mailbox = NULL;\r
382 MailboxLocation = NULL;\r
383\r
384 switch (InitFlag) {\r
385\r
386 case DEBUG_AGENT_INIT_DXE_LOAD:\r
387 //\r
388 // Check if Debug Agent has been initialized before\r
389 //\r
390 if (IsDebugAgentInitialzed ()) {\r
391 DEBUG ((EFI_D_INFO, "Debug Agent: The former agent will be overwritten by the new one!\n"));\r
392 }\r
393\r
394 mMultiProcessorDebugSupport = TRUE;\r
395 //\r
396 // Save original IDT table\r
397 //\r
398 AsmReadIdtr (&IdtDescriptor);\r
399 mSaveIdtTableSize = IdtDescriptor.Limit + 1;\r
400 mSavedIdtTable = AllocateCopyPool (mSaveIdtTableSize, (VOID *) IdtDescriptor.Base);\r
401 //\r
402 // Check if Debug Agent initialized in DXE phase\r
403 //\r
404 Mailbox = GetMailboxFromConfigurationTable ();\r
405 if (Mailbox == NULL) {\r
406 //\r
407 // Try to get mailbox from GUIDed HOB build in PEI\r
408 //\r
409 HobList = GetHobList ();\r
410 Mailbox = GetMailboxFromHob (HobList);\r
411 }\r
412 //\r
413 // Set up IDT table and prepare for IDT entries\r
414 //\r
415 SetupDebugAgentEnviroment (Mailbox);\r
416 //\r
417 // Initialize Debug Timer hardware and save its initial count and frequency\r
418 //\r
419 mDebugMpContext.DebugTimerInitCount = InitializeDebugTimer (&DebugTimerFrequency);\r
420 UpdateMailboxContent (mMailboxPointer, DEBUG_MAILBOX_DEBUG_TIMER_FREQUENCY, DebugTimerFrequency);\r
421 //\r
422 // For DEBUG_AGENT_INIT_S3, needn't to install configuration table and EFI Serial IO protocol\r
423 // For DEBUG_AGENT_INIT_DXE_CORE, InternalConstructorWorker() will invoked in Constructor()\r
424 //\r
425 InternalConstructorWorker ();\r
426 //\r
427 // Enable interrupt to receive Debug Timer interrupt\r
428 //\r
429 EnableInterrupts ();\r
430\r
431 mDebugAgentInitialized = TRUE;\r
432 FindAndReportModuleImageInfo (SIZE_4KB);\r
433\r
434 *(EFI_STATUS *)Context = EFI_SUCCESS;\r
435\r
436 if (gST->ConOut != NULL) {\r
437 Print (L"Debug Agent: Initialized successfully!\r\n");\r
438 Print (L"If the Debug Port is serial port, please make sure this serial port isn't connected by ISA Serial driver\r\n");\r
439 Print (L"You could do the following steps to disconnect the serial port:\r\n");\r
440 Print (L"1: Shell> drivers\r\n");\r
441 Print (L" ...\r\n");\r
442 Print (L" V VERSION E G G #D #C DRIVER NAME IMAGE NAME\r\n");\r
443 Print (L" == ======== = = = == == =================================== ===================\r\n");\r
444 Print (L" 8F 0000000A B - - 1 14 PCI Bus Driver PciBusDxe\r\n");\r
445 Print (L" 91 00000010 ? - - - - ATA Bus Driver AtaBusDxe\r\n");\r
446 Print (L" ...\r\n");\r
447 Print (L" A7 0000000A B - - 1 1 ISA Serial Driver IsaSerialDxe\r\n");\r
448 Print (L" ...\r\n");\r
449 Print (L"2: Shell> dh -d A7\r\n");\r
450 Print (L" A7: Image(IsaSerialDxe) ImageDevPath (..9FB3-11D4-9A3A-0090273FC14D))DriverBinding ComponentName ComponentName2\r\n");\r
451 Print (L" Driver Name : ISA Serial Driver\r\n");\r
452 Print (L" Image Name : FvFile(93B80003-9FB3-11D4-9A3A-0090273FC14D)\r\n");\r
453 Print (L" Driver Version : 0000000A\r\n");\r
454 Print (L" Driver Type : BUS\r\n");\r
455 Print (L" Configuration : NO\r\n");\r
456 Print (L" Diagnostics : NO\r\n");\r
457 Print (L" Managing :\r\n");\r
458 Print (L" Ctrl[EA] : PciRoot(0x0)/Pci(0x1F,0x0)/Serial(0x0)\r\n");\r
459 Print (L" Child[EB] : PciRoot(0x0)/Pci(0x1F,0x0)/Serial(0x0)/Uart(115200,8,N,1)\r\n");\r
460 Print (L"3: Shell> disconnect EA\r\n");\r
461 Print (L"4: Shell> load -nc DebugAgentDxe.efi\r\n\r\n");\r
462 }\r
463 break;\r
464\r
465 case DEBUG_AGENT_INIT_DXE_UNLOAD:\r
466 if (mDebugAgentInitialized) {\r
467 if (IsHostAttached ()) {\r
468 Print (L"Debug Agent: Host is still connected, please de-attach TARGET firstly!\r\n");\r
469 *(EFI_STATUS *)Context = EFI_ACCESS_DENIED;\r
470 //\r
471 // Enable Debug Timer interrupt again\r
472 //\r
473 SaveAndSetDebugTimerInterrupt (TRUE);\r
474 } else {\r
475 //\r
476 // Restore original IDT table\r
477 //\r
478 AsmReadIdtr (&IdtDescriptor);\r
479 IdtDescriptor.Limit = (UINT16) (mSaveIdtTableSize - 1);\r
480 CopyMem ((VOID *) IdtDescriptor.Base, mSavedIdtTable, mSaveIdtTableSize);\r
481 AsmWriteIdtr (&IdtDescriptor);\r
482 FreePool (mSavedIdtTable);\r
483 mDebugAgentInitialized = FALSE;\r
484 *(EFI_STATUS *)Context = EFI_SUCCESS;\r
485 }\r
486 } else {\r
487 Print (L"Debug Agent: It hasn't been initialized, cannot unload it!\r\n");\r
488 *(EFI_STATUS *)Context = EFI_NOT_STARTED;\r
489 }\r
490\r
491 //\r
492 // Restore interrupt state.\r
493 //\r
494 SetInterruptState (InterruptStatus);\r
495 break;\r
496\r
497 case DEBUG_AGENT_INIT_DXE_CORE:\r
498 mDxeCoreFlag = TRUE;\r
499 mMultiProcessorDebugSupport = TRUE;\r
500 //\r
501 // Try to get mailbox from GUIDed HOB build in PEI\r
502 //\r
503 HobList = Context;\r
504 Mailbox = GetMailboxFromHob (HobList);\r
505 //\r
506 // Set up IDT table and prepare for IDT entries\r
507 //\r
508 SetupDebugAgentEnviroment (Mailbox);\r
509 //\r
510 // Initialize Debug Timer hardware and save its initial count and frequency\r
511 //\r
512 mDebugMpContext.DebugTimerInitCount = InitializeDebugTimer (&DebugTimerFrequency);\r
513 UpdateMailboxContent (mMailboxPointer, DEBUG_MAILBOX_DEBUG_TIMER_FREQUENCY, DebugTimerFrequency);\r
514 //\r
515 // Enable interrupt to receive Debug Timer interrupt\r
516 //\r
517 EnableInterrupts ();\r
518\r
519 break;\r
520\r
521 case DEBUG_AGENT_INIT_S3:\r
522\r
523 if (Context != NULL) {\r
524 Ia32Idtr = (IA32_DESCRIPTOR *) Context;\r
525 Ia32IdtEntry = (IA32_IDT_ENTRY *)(Ia32Idtr->Base);\r
526 MailboxLocation = (UINT64 *) (UINTN) (Ia32IdtEntry[DEBUG_MAILBOX_VECTOR].Bits.OffsetLow +\r
527 (Ia32IdtEntry[DEBUG_MAILBOX_VECTOR].Bits.OffsetHigh << 16));\r
528 Mailbox = (DEBUG_AGENT_MAILBOX *)(UINTN)(*MailboxLocation);\r
529 VerifyMailboxChecksum (Mailbox);\r
530 }\r
531 //\r
532 // Save Mailbox pointer in global variable\r
533 //\r
534 mMailboxPointer = Mailbox;\r
535 //\r
536 // Set up IDT table and prepare for IDT entries\r
537 //\r
538 SetupDebugAgentEnviroment (Mailbox);\r
539 //\r
540 // Disable interrupt\r
541 //\r
542 DisableInterrupts ();\r
543 FindAndReportModuleImageInfo (SIZE_4KB);\r
544 if (GetDebugFlag (DEBUG_AGENT_FLAG_BREAK_BOOT_SCRIPT) == 1) {\r
545 //\r
546 // If Boot Script entry break is set, code will be break at here.\r
547 //\r
548 CpuBreakpoint ();\r
549 }\r
550 break;\r
551\r
552 default:\r
553 //\r
554 // Only DEBUG_AGENT_INIT_PREMEM_SEC and DEBUG_AGENT_INIT_POSTMEM_SEC are allowed for this\r
555 // Debug Agent library instance.\r
556 //\r
557 DEBUG ((EFI_D_ERROR, "Debug Agent: The InitFlag value is not allowed!\n"));\r
558 CpuDeadLoop ();\r
559 break;\r
560 }\r
561}\r