]> git.proxmox.com Git - mirror_edk2.git/blame - SourceLevelDebugPkg/Library/DebugAgent/DxeDebugAgent/DxeDebugAgentLib.c
SourceLevelDebugPkg: DebugAgent: Set Local APIC SoftwareEnable
[mirror_edk2.git] / SourceLevelDebugPkg / Library / DebugAgent / DxeDebugAgent / DxeDebugAgentLib.c
CommitLineData
18b144ea 1/** @file\r
2 Debug Agent library implementition for Dxe Core and Dxr modules.\r
3\r
08021523 4 Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved.<BR>\r
18b144ea 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
b422b62c 18DEBUG_AGENT_MAILBOX *mMailboxPointer = NULL;\r
18b144ea 19IA32_IDT_GATE_DESCRIPTOR mIdtEntryTable[33];\r
b422b62c 20BOOLEAN mDxeCoreFlag = FALSE;\r
21BOOLEAN mMultiProcessorDebugSupport = FALSE;\r
22VOID *mSavedIdtTable = NULL;\r
23UINTN mSaveIdtTableSize = 0;\r
24BOOLEAN mDebugAgentInitialized = FALSE;\r
25BOOLEAN mSkipBreakpoint = FALSE;\r
18b144ea 26\r
27/**\r
b422b62c 28 Check if debug agent support multi-processor.\r
18b144ea 29\r
b422b62c 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
18b144ea 41\r
b422b62c 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
18b144ea 48\r
49**/\r
b422b62c 50VOID\r
51InternalConstructorWorker (\r
52 VOID\r
18b144ea 53 )\r
54{\r
55 EFI_STATUS Status;\r
56 EFI_PHYSICAL_ADDRESS Address;\r
b422b62c 57 BOOLEAN DebugTimerInterruptState;\r
0a488765 58 DEBUG_AGENT_MAILBOX *Mailbox;\r
59 DEBUG_AGENT_MAILBOX *NewMailbox;\r
8cc26df4
JF
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
93c0bdec 86\r
87 //\r
b422b62c 88 // Install EFI Serial IO protocol on debug port\r
93c0bdec 89 //\r
b422b62c 90 InstallSerialIo ();\r
93c0bdec 91\r
18b144ea 92 Address = 0;\r
93 Status = gBS->AllocatePages (\r
94 AllocateAnyPages,\r
95 EfiACPIMemoryNVS,\r
0a488765 96 EFI_SIZE_TO_PAGES (sizeof(DEBUG_AGENT_MAILBOX) + PcdGet16(PcdDebugPortHandleBufferSize)),\r
18b144ea 97 &Address\r
98 );\r
8cc26df4
JF
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
18b144ea 103\r
b422b62c 104 DebugTimerInterruptState = SaveAndSetDebugTimerInterrupt (FALSE);\r
18b144ea 105\r
0a488765 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
18b144ea 121\r
93c0bdec 122 Status = gBS->InstallConfigurationTable (&gEfiDebugAgentGuid, (VOID *) mMailboxPointer);\r
8cc26df4
JF
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
b422b62c 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
4fe43eb3 168\r
b422b62c 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
18b144ea 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
b422b62c 192 UINT64 *MailboxLocation;\r
193 DEBUG_AGENT_MAILBOX *Mailbox;\r
18b144ea 194\r
195 GuidHob = GetNextGuidHob (&gEfiDebugAgentGuid, HobStart);\r
196 if (GuidHob == NULL) {\r
197 return NULL;\r
198 }\r
b422b62c 199 MailboxLocation = (UINT64 *) (GET_GUID_HOB_DATA(GuidHob));\r
200 Mailbox = (DEBUG_AGENT_MAILBOX *)(UINTN)(*MailboxLocation);\r
201 VerifyMailboxChecksum (Mailbox);\r
18b144ea 202\r
b422b62c 203 return Mailbox;\r
18b144ea 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
b422b62c 217 AcquireMpSpinLock (&mDebugMpContext.MailboxSpinLock);\r
218 VerifyMailboxChecksum (mMailboxPointer);\r
219 ReleaseMpSpinLock (&mDebugMpContext.MailboxSpinLock);\r
18b144ea 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
b422b62c 234 return (DEBUG_PORT_HANDLE) (UINTN)(GetMailboxPointer ()->DebugPortHandle);\r
235}\r
236\r
237/**\r
adcc2727
JF
238 Worker function to set up Debug Agent environment.\r
239\r
240 This function will set up IDT table and initialize the IDT entries and \r
241 initialize CPU LOCAL APIC timer.\r
242 It also tries to connect HOST if Debug Agent was not initialized before.\r
b422b62c 243\r
244 @param[in] Mailbox Pointer to Mailbox.\r
245\r
246**/\r
247VOID\r
adcc2727 248SetupDebugAgentEnvironment (\r
b422b62c 249 IN DEBUG_AGENT_MAILBOX *Mailbox\r
250 )\r
251{\r
252 IA32_DESCRIPTOR Idtr;\r
253 UINT16 IdtEntryCount;\r
254 UINT64 DebugPortHandle;\r
adcc2727 255 UINT32 DebugTimerFrequency;\r
b422b62c 256\r
257 if (mMultiProcessorDebugSupport) {\r
258 InitializeSpinLock (&mDebugMpContext.MpContextSpinLock);\r
259 InitializeSpinLock (&mDebugMpContext.DebugPortSpinLock);\r
260 InitializeSpinLock (&mDebugMpContext.MailboxSpinLock);\r
261 //\r
262 // Clear Break CPU index value\r
263 //\r
264 mDebugMpContext.BreakAtCpuIndex = (UINT32) -1;\r
265 }\r
266\r
267 //\r
268 // Get original IDT address and size.\r
269 //\r
270 AsmReadIdtr ((IA32_DESCRIPTOR *) &Idtr);\r
271 IdtEntryCount = (UINT16) ((Idtr.Limit + 1) / sizeof (IA32_IDT_GATE_DESCRIPTOR));\r
272 if (IdtEntryCount < 33) {\r
8cc26df4
JF
273 ZeroMem (&mIdtEntryTable, sizeof (IA32_IDT_GATE_DESCRIPTOR) * 33);\r
274 //\r
275 // Copy original IDT table into new one\r
276 //\r
277 CopyMem (&mIdtEntryTable, (VOID *) Idtr.Base, Idtr.Limit + 1);\r
278 //\r
279 // Load new IDT table\r
280 //\r
b422b62c 281 Idtr.Limit = (UINT16) (sizeof (IA32_IDT_GATE_DESCRIPTOR) * 33 - 1);\r
282 Idtr.Base = (UINTN) &mIdtEntryTable;\r
b422b62c 283 AsmWriteIdtr ((IA32_DESCRIPTOR *) &Idtr);\r
284 }\r
285\r
286 //\r
287 // Initialize the IDT table entries to support source level debug.\r
288 //\r
289 InitializeDebugIdt ();\r
290\r
3bf04a71
JF
291 //\r
292 // If mMailboxPointer is not set before, set it\r
293 //\r
294 if (mMailboxPointer == NULL) {\r
295 if (Mailbox != NULL) {\r
296 //\r
297 // If Mailbox exists, copy it into one global variable\r
298 //\r
299 CopyMem (&mMailbox, Mailbox, sizeof (DEBUG_AGENT_MAILBOX));\r
300 } else {\r
301 ZeroMem (&mMailbox, sizeof (DEBUG_AGENT_MAILBOX));\r
302 }\r
303 mMailboxPointer = &mMailbox;\r
304 }\r
b422b62c 305\r
adcc2727
JF
306 //\r
307 // Initialize Debug Timer hardware and save its initial count and frequency\r
308 //\r
86d13652 309 mDebugMpContext.DebugTimerInitCount = InitializeDebugTimer (&DebugTimerFrequency, TRUE);\r
adcc2727 310 UpdateMailboxContent (mMailboxPointer, DEBUG_MAILBOX_DEBUG_TIMER_FREQUENCY, DebugTimerFrequency);\r
b422b62c 311 //\r
312 // Initialize debug communication port\r
313 //\r
314 DebugPortHandle = (UINT64) (UINTN)DebugPortInitialize ((VOID *)(UINTN)mMailboxPointer->DebugPortHandle, NULL);\r
315 UpdateMailboxContent (mMailboxPointer, DEBUG_MAILBOX_DEBUG_PORT_HANDLE_INDEX, DebugPortHandle);\r
316\r
317 if (Mailbox == NULL) {\r
318 //\r
319 // Trigger one software interrupt to inform HOST\r
320 //\r
321 TriggerSoftInterrupt (SYSTEM_RESET_SIGNATURE);\r
322 SetDebugFlag (DEBUG_AGENT_FLAG_MEMORY_READY, 1);\r
323 //\r
324 // Memory has been ready\r
325 //\r
326 if (IsHostAttached ()) {\r
327 //\r
328 // Trigger one software interrupt to inform HOST\r
329 //\r
330 TriggerSoftInterrupt (MEMORY_READY_SIGNATURE);\r
331 }\r
332 }\r
18b144ea 333}\r
334\r
b422b62c 335\r
18b144ea 336/**\r
337 Initialize debug agent.\r
338\r
adcc2727 339 This function is used to set up debug environment for DXE phase.\r
18b144ea 340\r
341 If this function is called by DXE Core, Context must be the pointer\r
342 to HOB list which will be used to get GUIDed HOB. It will enable\r
343 interrupt to support break-in feature.\r
344 If this function is called by DXE module, Context must be NULL. It\r
345 will enable interrupt to support break-in feature.\r
346\r
347 @param[in] InitFlag Init flag is used to decide initialize process.\r
348 @param[in] Context Context needed according to InitFlag.\r
349 @param[in] Function Continue function called by debug agent library; it was\r
350 optional.\r
351\r
352**/\r
353VOID\r
354EFIAPI\r
355InitializeDebugAgent (\r
356 IN UINT32 InitFlag,\r
357 IN VOID *Context, OPTIONAL\r
358 IN DEBUG_AGENT_CONTINUE Function OPTIONAL\r
359 )\r
360{\r
b422b62c 361 UINT64 *MailboxLocation;\r
18b144ea 362 DEBUG_AGENT_MAILBOX *Mailbox;\r
18b144ea 363 BOOLEAN InterruptStatus;\r
b422b62c 364 VOID *HobList;\r
365 IA32_DESCRIPTOR IdtDescriptor;\r
366 IA32_DESCRIPTOR *Ia32Idtr;\r
367 IA32_IDT_ENTRY *Ia32IdtEntry;\r
e2c8d3cf
JF
368 BOOLEAN PeriodicMode;\r
369 UINTN TimerCycle;\r
18b144ea 370\r
b422b62c 371 if (InitFlag == DEBUG_AGENT_INIT_DXE_AP) {\r
e2c8d3cf
JF
372 //\r
373 // Check if CPU APIC Timer is working, otherwise initialize it.\r
374 //\r
df60fb4c 375 InitializeLocalApicSoftwareEnable (TRUE);\r
e2c8d3cf
JF
376 GetApicTimerState (NULL, &PeriodicMode, NULL);\r
377 TimerCycle = GetApicTimerInitCount ();\r
378 if (!PeriodicMode || TimerCycle == 0) {\r
379 InitializeDebugTimer (NULL, FALSE);\r
380 }\r
b422b62c 381 //\r
382 // Invoked by AP, enable interrupt to let AP could receive IPI from other processors\r
383 //\r
384 EnableInterrupts ();\r
385 return ;\r
18b144ea 386 }\r
387\r
4fe43eb3 388 //\r
b422b62c 389 // Disable Debug Timer interrupt\r
390 //\r
391 SaveAndSetDebugTimerInterrupt (FALSE);\r
18b144ea 392 //\r
393 // Save and disable original interrupt status\r
394 //\r
395 InterruptStatus = SaveAndDisableInterrupts ();\r
396\r
b422b62c 397 //\r
398 // Try to get mailbox firstly\r
399 //\r
400 HobList = NULL;\r
401 Mailbox = NULL;\r
402 MailboxLocation = NULL;\r
403\r
404 switch (InitFlag) {\r
405\r
406 case DEBUG_AGENT_INIT_DXE_LOAD:\r
18b144ea 407 //\r
b422b62c 408 // Check if Debug Agent has been initialized before\r
18b144ea 409 //\r
b422b62c 410 if (IsDebugAgentInitialzed ()) {\r
411 DEBUG ((EFI_D_INFO, "Debug Agent: The former agent will be overwritten by the new one!\n"));\r
412 }\r
413\r
414 mMultiProcessorDebugSupport = TRUE;\r
93c0bdec 415 //\r
b422b62c 416 // Save original IDT table\r
417 //\r
418 AsmReadIdtr (&IdtDescriptor);\r
419 mSaveIdtTableSize = IdtDescriptor.Limit + 1;\r
420 mSavedIdtTable = AllocateCopyPool (mSaveIdtTableSize, (VOID *) IdtDescriptor.Base);\r
421 //\r
b422b62c 422 // Check if Debug Agent initialized in DXE phase\r
423 //\r
424 Mailbox = GetMailboxFromConfigurationTable ();\r
425 if (Mailbox == NULL) {\r
426 //\r
4fe43eb3 427 // Try to get mailbox from GUIDed HOB build in PEI\r
b422b62c 428 //\r
429 HobList = GetHobList ();\r
430 Mailbox = GetMailboxFromHob (HobList);\r
431 }\r
432 //\r
adcc2727 433 // Set up Debug Agent Environment and try to connect HOST if required\r
b422b62c 434 //\r
adcc2727 435 SetupDebugAgentEnvironment (Mailbox);\r
08021523 436 //\r
b422b62c 437 // For DEBUG_AGENT_INIT_S3, needn't to install configuration table and EFI Serial IO protocol\r
438 // For DEBUG_AGENT_INIT_DXE_CORE, InternalConstructorWorker() will invoked in Constructor()\r
439 //\r
440 InternalConstructorWorker ();\r
441 //\r
2befbc82
JF
442 // Enable Debug Timer interrupt\r
443 //\r
444 SaveAndSetDebugTimerInterrupt (TRUE);\r
445 //\r
b422b62c 446 // Enable interrupt to receive Debug Timer interrupt\r
93c0bdec 447 //\r
18b144ea 448 EnableInterrupts ();\r
449\r
b422b62c 450 mDebugAgentInitialized = TRUE;\r
451 FindAndReportModuleImageInfo (SIZE_4KB);\r
452\r
453 *(EFI_STATUS *)Context = EFI_SUCCESS;\r
454\r
b422b62c 455 break;\r
456\r
457 case DEBUG_AGENT_INIT_DXE_UNLOAD:\r
458 if (mDebugAgentInitialized) {\r
459 if (IsHostAttached ()) {\r
b422b62c 460 *(EFI_STATUS *)Context = EFI_ACCESS_DENIED;\r
4fe43eb3 461 //\r
b422b62c 462 // Enable Debug Timer interrupt again\r
463 //\r
464 SaveAndSetDebugTimerInterrupt (TRUE);\r
465 } else {\r
466 //\r
467 // Restore original IDT table\r
468 //\r
469 AsmReadIdtr (&IdtDescriptor);\r
470 IdtDescriptor.Limit = (UINT16) (mSaveIdtTableSize - 1);\r
471 CopyMem ((VOID *) IdtDescriptor.Base, mSavedIdtTable, mSaveIdtTableSize);\r
472 AsmWriteIdtr (&IdtDescriptor);\r
473 FreePool (mSavedIdtTable);\r
474 mDebugAgentInitialized = FALSE;\r
475 *(EFI_STATUS *)Context = EFI_SUCCESS;\r
476 }\r
477 } else {\r
b422b62c 478 *(EFI_STATUS *)Context = EFI_NOT_STARTED;\r
479 }\r
18b144ea 480\r
18b144ea 481 //\r
b422b62c 482 // Restore interrupt state.\r
18b144ea 483 //\r
b422b62c 484 SetInterruptState (InterruptStatus);\r
485 break;\r
18b144ea 486\r
b422b62c 487 case DEBUG_AGENT_INIT_DXE_CORE:\r
488 mDxeCoreFlag = TRUE;\r
489 mMultiProcessorDebugSupport = TRUE;\r
18b144ea 490 //\r
4fe43eb3 491 // Try to get mailbox from GUIDed HOB build in PEI\r
18b144ea 492 //\r
b422b62c 493 HobList = Context;\r
494 Mailbox = GetMailboxFromHob (HobList);\r
495 //\r
adcc2727 496 // Set up Debug Agent Environment and try to connect HOST if required\r
08021523 497 //\r
adcc2727 498 SetupDebugAgentEnvironment (Mailbox);\r
08021523 499 //\r
2befbc82
JF
500 // Enable Debug Timer interrupt\r
501 //\r
502 SaveAndSetDebugTimerInterrupt (TRUE);\r
503 //\r
b422b62c 504 // Enable interrupt to receive Debug Timer interrupt\r
505 //\r
506 EnableInterrupts ();\r
18b144ea 507\r
b422b62c 508 break;\r
18b144ea 509\r
b422b62c 510 case DEBUG_AGENT_INIT_S3:\r
18b144ea 511\r
b422b62c 512 if (Context != NULL) {\r
513 Ia32Idtr = (IA32_DESCRIPTOR *) Context;\r
514 Ia32IdtEntry = (IA32_IDT_ENTRY *)(Ia32Idtr->Base);\r
4fe43eb3 515 MailboxLocation = (UINT64 *) (UINTN) (Ia32IdtEntry[DEBUG_MAILBOX_VECTOR].Bits.OffsetLow +\r
fe0c434e 516 (UINT32) (Ia32IdtEntry[DEBUG_MAILBOX_VECTOR].Bits.OffsetHigh << 16));\r
b422b62c 517 Mailbox = (DEBUG_AGENT_MAILBOX *)(UINTN)(*MailboxLocation);\r
518 VerifyMailboxChecksum (Mailbox);\r
519 }\r
18b144ea 520 //\r
3bf04a71
JF
521 // Save Mailbox pointer in global variable\r
522 //\r
523 mMailboxPointer = Mailbox;\r
524 //\r
adcc2727 525 // Set up Debug Agent Environment and try to connect HOST if required\r
18b144ea 526 //\r
adcc2727 527 SetupDebugAgentEnvironment (Mailbox);\r
18b144ea 528 //\r
b422b62c 529 // Disable interrupt\r
18b144ea 530 //\r
b422b62c 531 DisableInterrupts ();\r
532 FindAndReportModuleImageInfo (SIZE_4KB);\r
533 if (GetDebugFlag (DEBUG_AGENT_FLAG_BREAK_BOOT_SCRIPT) == 1) {\r
534 //\r
535 // If Boot Script entry break is set, code will be break at here.\r
536 //\r
537 CpuBreakpoint ();\r
538 }\r
539 break;\r
540\r
541 default:\r
18b144ea 542 //\r
4fe43eb3 543 // Only DEBUG_AGENT_INIT_PREMEM_SEC and DEBUG_AGENT_INIT_POSTMEM_SEC are allowed for this\r
b422b62c 544 // Debug Agent library instance.\r
18b144ea 545 //\r
b422b62c 546 DEBUG ((EFI_D_ERROR, "Debug Agent: The InitFlag value is not allowed!\n"));\r
547 CpuDeadLoop ();\r
548 break;\r
18b144ea 549 }\r
18b144ea 550}\r