2 SEC Core Debug Agent Library instance implementition.
4 Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.<BR>
5 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.
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.
15 #include "SecPeiDebugAgentLib.h"
17 BOOLEAN mSkipBreakpoint
= FALSE
;
20 EFI_PEI_VECTOR_HANDOFF_INFO_PPI mVectorHandoffInfoPpi
= {
21 &mVectorHandoffInfoDebugAgent
[0]
25 // Ppis to be installed
27 EFI_PEI_PPI_DESCRIPTOR mVectorHandoffInfoPpiList
[] = {
29 (EFI_PEI_PPI_DESCRIPTOR_PPI
| EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST
),
30 &gEfiVectorHandoffInfoPpiGuid
,
31 &mVectorHandoffInfoPpi
35 EFI_PEI_NOTIFY_DESCRIPTOR mMemoryDiscoveredNotifyList
[1] = {
37 (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK
| EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST
),
38 &gEfiPeiMemoryDiscoveredPpiGuid
,
39 DebugAgentCallbackMemoryDiscoveredPpi
44 Check if debug agent support multi-processor.
46 @retval TRUE Multi-processor is supported.
47 @retval FALSE Multi-processor is not supported.
51 MultiProcessorDebugSupport (
59 Read the Attach/Break-in symbols from the debug port.
61 @param[in] Handle Pointer to Debug Port handle.
62 @param[out] BreakSymbol Returned break symbol.
64 @retval EFI_SUCCESS Read the symbol in BreakSymbol.
65 @retval EFI_NOT_FOUND No read the break symbol.
69 DebugReadBreakSymbol (
70 IN DEBUG_PORT_HANDLE Handle
,
71 OUT UINT8
*BreakSymbol
75 DEBUG_PACKET_HEADER DebugHeader
;
80 // If Debug Port buffer has data, read it till it was break symbol or Debug Port buffer empty.
82 Data8
= (UINT8
*) &DebugHeader
;
85 // If start symbol is not received
87 if (!DebugPortPollBuffer (Handle
)) {
89 // If no data in Debug Port, exit
94 // Try to read the start symbol
96 DebugPortReadBuffer (Handle
, Data8
, 1, 0);
97 if (*Data8
== DEBUG_STARTING_SYMBOL_ATTACH
) {
98 *BreakSymbol
= *Data8
;
99 DebugAgentMsgPrint (DEBUG_AGENT_INFO
, "Debug Timer attach symbol received %x", *BreakSymbol
);
102 if (*Data8
== DEBUG_STARTING_SYMBOL_NORMAL
) {
103 Status
= ReadRemainingBreakPacket (Handle
, &DebugHeader
);
104 if (Status
== EFI_SUCCESS
) {
105 *BreakSymbol
= DebugHeader
.Command
;
106 DebugAgentMsgPrint (DEBUG_AGENT_INFO
, "Debug Timer break symbol received %x", *BreakSymbol
);
109 if (Status
== EFI_TIMEOUT
) {
115 return EFI_NOT_FOUND
;
119 Get the pointer to location saved Mailbox pointer from IDT entry.
123 GetLocationSavedMailboxPointerInIdtEntry (
127 UINTN
*MailboxLocation
;
129 MailboxLocation
= (UINTN
*) GetExceptionHandlerInIdtEntry (DEBUG_MAILBOX_VECTOR
);
131 // *MailboxLocation is the pointer to Mailbox
133 VerifyMailboxChecksum ((DEBUG_AGENT_MAILBOX
*) (*MailboxLocation
));
134 return MailboxLocation
;
138 Set the pointer of Mailbox into IDT entry before memory is ready.
140 @param[in] MailboxLocation Pointer to location saved Mailbox pointer.
144 SetLocationSavedMailboxPointerInIdtEntry (
145 IN VOID
*MailboxLocation
148 SetExceptionHandlerInIdtEntry (DEBUG_MAILBOX_VECTOR
, MailboxLocation
);
152 Get the location of Mailbox pointer from the GUIDed HOB.
154 @return Pointer to the location saved Mailbox pointer.
158 GetMailboxLocationFromHob (
162 EFI_HOB_GUID_TYPE
*GuidHob
;
164 GuidHob
= GetFirstGuidHob (&gEfiDebugAgentGuid
);
165 if (GuidHob
== NULL
) {
168 return (UINT64
*) (GET_GUID_HOB_DATA(GuidHob
));
172 Get Debug Agent Mailbox pointer.
174 @return Mailbox pointer.
177 DEBUG_AGENT_MAILBOX
*
182 UINT64 DebugPortHandle
;
183 UINT64
*MailboxLocationInIdt
;
184 UINT64
*MailboxLocationInHob
;
185 DEBUG_AGENT_MAILBOX
*Mailbox
;
188 // Get mailbox from IDT entry firstly
190 MailboxLocationInIdt
= GetLocationSavedMailboxPointerInIdtEntry ();
191 Mailbox
= (DEBUG_AGENT_MAILBOX
*)(UINTN
)(*MailboxLocationInIdt
);
193 // Cannot used GetDebugFlag() to get Debug Flag to avoid GetMailboxPointer() nested
195 if (Mailbox
->DebugFlag
.Bits
.CheckMailboxInHob
!= 1 ||
196 Mailbox
->DebugFlag
.Bits
.InitArch
!= DEBUG_ARCH_SYMBOL
) {
198 // If mailbox was setup in SEC or the current CPU arch is different from the init arch
199 // Debug Agent initialized, return the mailbox from IDT entry directly.
200 // Otherwise, we need to check the mailbox location saved in GUIDed HOB further.
205 MailboxLocationInHob
= GetMailboxLocationFromHob ();
207 // Compare mailbox in IDT enry with mailbox in HOB,
208 // need to fix mailbox location if HOB moved by PEI CORE
210 if (MailboxLocationInHob
!= MailboxLocationInIdt
&& MailboxLocationInHob
!= NULL
) {
211 Mailbox
= (DEBUG_AGENT_MAILBOX
*)(UINTN
)(*MailboxLocationInHob
);
213 // Fix up Debug Port handler and save new mailbox in IDT entry
215 Mailbox
= (DEBUG_AGENT_MAILBOX
*)((UINTN
)Mailbox
+ ((UINTN
)(MailboxLocationInHob
) - (UINTN
)MailboxLocationInIdt
));
216 DebugPortHandle
= (UINT64
)((UINTN
)Mailbox
->DebugPortHandle
+ ((UINTN
)(MailboxLocationInHob
) - (UINTN
)MailboxLocationInIdt
));
217 UpdateMailboxContent (Mailbox
, DEBUG_MAILBOX_DEBUG_PORT_HANDLE_INDEX
, DebugPortHandle
);
218 *MailboxLocationInHob
= (UINT64
)(UINTN
)Mailbox
;
219 SetLocationSavedMailboxPointerInIdtEntry (MailboxLocationInHob
);
221 // Clean CheckMailboxInHob flag
223 Mailbox
->DebugFlag
.Bits
.CheckMailboxInHob
= 0;
224 UpdateMailboxChecksum (Mailbox
);
231 Get debug port handle.
233 @return Debug port handle.
241 DEBUG_AGENT_MAILBOX
*DebugAgentMailbox
;
243 DebugAgentMailbox
= GetMailboxPointer ();
245 return (DEBUG_PORT_HANDLE
) (UINTN
)(DebugAgentMailbox
->DebugPortHandle
);
249 Debug Agent provided notify callback function on Memory Discovered PPI.
251 @param[in] PeiServices Indirect reference to the PEI Services Table.
252 @param[in] NotifyDescriptor Address of the notification descriptor data structure.
253 @param[in] Ppi Address of the PPI that was installed.
255 @retval EFI_SUCCESS If the function completed successfully.
260 DebugAgentCallbackMemoryDiscoveredPpi (
261 IN EFI_PEI_SERVICES
**PeiServices
,
262 IN EFI_PEI_NOTIFY_DESCRIPTOR
*NotifyDescriptor
,
267 DEBUG_AGENT_MAILBOX
*Mailbox
;
268 BOOLEAN InterruptStatus
;
269 EFI_PHYSICAL_ADDRESS Address
;
270 DEBUG_AGENT_MAILBOX
*NewMailbox
;
271 UINT64
*MailboxLocationInHob
;
274 // Save and disable original interrupt status
276 InterruptStatus
= SaveAndDisableInterrupts ();
279 // Allocate ACPI NVS memory for new Mailbox and Debug Port Handle buffer
281 Status
= PeiServicesAllocatePages (
283 EFI_SIZE_TO_PAGES (sizeof(DEBUG_AGENT_MAILBOX
) + PcdGet16(PcdDebugPortHandleBufferSize
)),
286 ASSERT_EFI_ERROR (Status
);
287 NewMailbox
= (DEBUG_AGENT_MAILBOX
*) (UINTN
) Address
;
289 // Copy Mailbox and Debug Port Handle buffer to new location in ACPI NVS memory, because original Mailbox
290 // and Debug Port Handle buffer in the allocated pool that may be marked as free by DXE Core after DXE Core
291 // reallocates the HOB.
293 Mailbox
= GetMailboxPointer ();
294 CopyMem (NewMailbox
, Mailbox
, sizeof (DEBUG_AGENT_MAILBOX
));
295 CopyMem (NewMailbox
+ 1, (VOID
*)(UINTN
)Mailbox
->DebugPortHandle
, PcdGet16(PcdDebugPortHandleBufferSize
));
297 // Update Mailbox Location pointer in GUIDed HOB and IDT entry with new one
299 MailboxLocationInHob
= GetMailboxLocationFromHob ();
300 ASSERT (MailboxLocationInHob
!= NULL
);
301 *MailboxLocationInHob
= (UINT64
)(UINTN
)NewMailbox
;
302 SetLocationSavedMailboxPointerInIdtEntry (MailboxLocationInHob
);
304 // Update Debug Port Handle in new Mailbox
306 UpdateMailboxContent (NewMailbox
, DEBUG_MAILBOX_DEBUG_PORT_HANDLE_INDEX
, (UINT64
)(UINTN
)(NewMailbox
+ 1));
308 // Set physical memory ready flag
310 SetDebugFlag (DEBUG_AGENT_FLAG_MEMORY_READY
, 1);
312 if (IsHostAttached ()) {
314 // Trigger one software interrupt to inform HOST
316 TriggerSoftInterrupt (MEMORY_READY_SIGNATURE
);
320 // Restore interrupt state.
322 SetInterruptState (InterruptStatus
);
328 Initialize debug agent.
330 This function is used to set up debug environment for SEC and PEI phase.
332 If InitFlag is DEBUG_AGENT_INIT_PREMEM_SEC, it will overirde IDT table entries
333 and initialize debug port. It will enable interrupt to support break-in feature.
334 It will set up debug agent Mailbox in cache-as-ramfrom. It will be called before
335 physical memory is ready.
336 If InitFlag is DEBUG_AGENT_INIT_POSTMEM_SEC, debug agent will build one GUIDed
337 HOB to copy debug agent Mailbox. It will be called after physical memory is ready.
339 This function is used to set up debug environment to support source level debugging.
340 If certain Debug Agent Library instance has to save some private data in the stack,
341 this function must work on the mode that doesn't return to the caller, then
342 the caller needs to wrap up all rest of logic after InitializeDebugAgent() into one
343 function and pass it into InitializeDebugAgent(). InitializeDebugAgent() is
344 responsible to invoke the passing-in function at the end of InitializeDebugAgent().
346 If the parameter Function is not NULL, Debug Agent Libary instance will invoke it by
347 passing in the Context to be its parameter.
349 If Function() is NULL, Debug Agent Library instance will return after setup debug
352 @param[in] InitFlag Init flag is used to decide the initialize process.
353 @param[in] Context Context needed according to InitFlag; it was optional.
354 @param[in] Function Continue function called by debug agent library; it was
360 InitializeDebugAgent (
362 IN VOID
*Context
, OPTIONAL
363 IN DEBUG_AGENT_CONTINUE Function OPTIONAL
366 DEBUG_AGENT_MAILBOX
*Mailbox
;
367 DEBUG_AGENT_MAILBOX
*NewMailbox
;
368 DEBUG_AGENT_MAILBOX MailboxInStack
;
369 DEBUG_AGENT_PHASE2_CONTEXT Phase2Context
;
370 DEBUG_AGENT_CONTEXT_POSTMEM_SEC
*DebugAgentContext
;
372 IA32_DESCRIPTOR
*Ia32Idtr
;
373 IA32_IDT_ENTRY
*Ia32IdtEntry
;
374 UINT64 DebugPortHandle
;
375 UINT64 MailboxLocation
;
376 UINT64
*MailboxLocationPointer
;
377 EFI_PHYSICAL_ADDRESS Address
;
379 DisableInterrupts ();
383 case DEBUG_AGENT_INIT_PREMEM_SEC
:
385 InitializeDebugIdt ();
387 MailboxLocation
= (UINT64
)(UINTN
)&MailboxInStack
;
388 Mailbox
= &MailboxInStack
;
389 ZeroMem ((VOID
*) Mailbox
, sizeof (DEBUG_AGENT_MAILBOX
));
391 // Get and save debug port handle and set the length of memory block.
393 SetLocationSavedMailboxPointerInIdtEntry (&MailboxLocation
);
395 // Force error message could be printed during the first shakehand between Target/HOST.
397 SetDebugFlag (DEBUG_AGENT_FLAG_PRINT_ERROR_LEVEL
, DEBUG_AGENT_ERROR
);
399 // Save init arch type when debug agent initialized
401 SetDebugFlag (DEBUG_AGENT_FLAG_INIT_ARCH
, DEBUG_ARCH_SYMBOL
);
403 InitializeDebugTimer ();
405 Phase2Context
.InitFlag
= InitFlag
;
406 Phase2Context
.Context
= Context
;
407 Phase2Context
.Function
= Function
;
408 DebugPortInitialize ((VOID
*) &Phase2Context
, InitializeDebugAgentPhase2
);
410 // If reaches here, it means Debug Port initialization failed.
412 DEBUG ((EFI_D_ERROR
, "Debug Agent: Debug port initialization failed.\n"));
416 case DEBUG_AGENT_INIT_POSTMEM_SEC
:
417 Mailbox
= GetMailboxPointer ();
419 // Memory has been ready
421 SetDebugFlag (DEBUG_AGENT_FLAG_MEMORY_READY
, 1);
422 if (IsHostAttached ()) {
424 // Trigger one software interrupt to inform HOST
426 TriggerSoftInterrupt (MEMORY_READY_SIGNATURE
);
429 // Install Vector Handoff Info PPI to persist vectors used by Debug Agent
431 Status
= PeiServicesInstallPpi (&mVectorHandoffInfoPpiList
[0]);
432 if (EFI_ERROR (Status
)) {
433 DEBUG ((EFI_D_ERROR
, "DebugAgent: Failed to install Vector Handoff Info PPI!\n"));
437 // Fix up Debug Port handle address and mailbox address
439 DebugAgentContext
= (DEBUG_AGENT_CONTEXT_POSTMEM_SEC
*) Context
;
440 if (DebugAgentContext
!= NULL
) {
441 DebugPortHandle
= (UINT64
)(UINT32
)(Mailbox
->DebugPortHandle
+ DebugAgentContext
->StackMigrateOffset
);
442 UpdateMailboxContent (Mailbox
, DEBUG_MAILBOX_DEBUG_PORT_HANDLE_INDEX
, DebugPortHandle
);
443 Mailbox
= (DEBUG_AGENT_MAILBOX
*) ((UINTN
) Mailbox
+ DebugAgentContext
->StackMigrateOffset
);
444 MailboxLocation
= (UINT64
)(UINTN
)Mailbox
;
446 // Build mailbox location in HOB and fix-up its address
448 MailboxLocationPointer
= BuildGuidDataHob (
453 MailboxLocationPointer
= (UINT64
*) ((UINTN
) MailboxLocationPointer
+ DebugAgentContext
->HeapMigrateOffset
);
456 // DebugAgentContext is NULL. Then, Mailbox can directly be copied into memory.
457 // Allocate ACPI NVS memory for new Mailbox and Debug Port Handle buffer
459 Status
= PeiServicesAllocatePages (
461 EFI_SIZE_TO_PAGES (sizeof(DEBUG_AGENT_MAILBOX
) + PcdGet16(PcdDebugPortHandleBufferSize
)),
464 if (EFI_ERROR (Status
)) {
465 DEBUG ((EFI_D_ERROR
, "DebugAgent: Failed to allocate pages!\n"));
468 NewMailbox
= (DEBUG_AGENT_MAILBOX
*) (UINTN
) Address
;
470 // Copy Mailbox and Debug Port Handle buffer to new location in ACPI NVS memory, because original Mailbox
471 // and Debug Port Handle buffer in the allocated pool that may be marked as free by DXE Core after DXE Core
472 // reallocates the HOB.
474 CopyMem (NewMailbox
, Mailbox
, sizeof (DEBUG_AGENT_MAILBOX
));
475 CopyMem (NewMailbox
+ 1, (VOID
*)(UINTN
)Mailbox
->DebugPortHandle
, PcdGet16(PcdDebugPortHandleBufferSize
));
476 UpdateMailboxContent (NewMailbox
, DEBUG_MAILBOX_DEBUG_PORT_HANDLE_INDEX
, (UINT64
)(UINTN
)(NewMailbox
+ 1));
477 MailboxLocation
= (UINT64
)(UINTN
)NewMailbox
;
479 // Build mailbox location in HOB
481 MailboxLocationPointer
= BuildGuidDataHob (
488 // Update IDT entry to save the location saved mailbox pointer
490 SetLocationSavedMailboxPointerInIdtEntry (MailboxLocationPointer
);
493 case DEBUG_AGENT_INIT_PEI
:
494 if (Context
== NULL
) {
495 DEBUG ((EFI_D_ERROR
, "DebugAgent: Input parameter Context cannot be NULL!\n"));
499 // Check if Debug Agent has initialized before
501 if (IsDebugAgentInitialzed()) {
502 DEBUG ((EFI_D_WARN
, "Debug Agent: It has already initialized in SEC Core!\n"));
506 // Install Vector Handoff Info PPI to persist vectors used by Debug Agent
508 Status
= PeiServicesInstallPpi (&mVectorHandoffInfoPpiList
[0]);
509 if (EFI_ERROR (Status
)) {
510 DEBUG ((EFI_D_ERROR
, "DebugAgent: Failed to install Vector Handoff Info PPI!\n"));
514 // Set up IDT entries
516 InitializeDebugIdt ();
518 // Build mailbox in HOB and setup Mailbox Set In Pei flag
520 Mailbox
= AllocateZeroPool (sizeof (DEBUG_AGENT_MAILBOX
));
521 MailboxLocation
= (UINT64
)(UINTN
)Mailbox
;
522 MailboxLocationPointer
= BuildGuidDataHob (
528 InitializeDebugTimer ();
530 // Update IDT entry to save the location pointer saved mailbox pointer
532 SetLocationSavedMailboxPointerInIdtEntry (MailboxLocationPointer
);
534 // Save init arch type when debug agent initialized
536 SetDebugFlag (DEBUG_AGENT_FLAG_INIT_ARCH
, DEBUG_ARCH_SYMBOL
);
538 // Register for a callback once memory has been initialized.
539 // If memery has been ready, the callback funtion will be invoked immediately
541 Status
= PeiServicesNotifyPpi (&mMemoryDiscoveredNotifyList
[0]);
542 if (EFI_ERROR (Status
)) {
543 DEBUG ((EFI_D_ERROR
, "DebugAgent: Failed to register memory discovered callback function!\n"));
547 // Set HOB check flag if memory has not been ready yet
549 if (GetDebugFlag (DEBUG_AGENT_FLAG_MEMORY_READY
) == 0) {
550 SetDebugFlag (DEBUG_AGENT_FLAG_CHECK_MAILBOX_IN_HOB
, 1);
553 Phase2Context
.InitFlag
= InitFlag
;
554 Phase2Context
.Context
= Context
;
555 Phase2Context
.Function
= Function
;
556 DebugPortInitialize ((VOID
*) &Phase2Context
, InitializeDebugAgentPhase2
);
558 FindAndReportModuleImageInfo (4);
562 case DEBUG_AGENT_INIT_THUNK_PEI_IA32TOX64
:
563 if (Context
== NULL
) {
564 DEBUG ((EFI_D_ERROR
, "DebugAgent: Input parameter Context cannot be NULL!\n"));
567 Ia32Idtr
= (IA32_DESCRIPTOR
*) Context
;
568 Ia32IdtEntry
= (IA32_IDT_ENTRY
*)(Ia32Idtr
->Base
);
569 MailboxLocationPointer
= (UINT64
*) (UINTN
) (Ia32IdtEntry
[DEBUG_MAILBOX_VECTOR
].Bits
.OffsetLow
+
570 (Ia32IdtEntry
[DEBUG_MAILBOX_VECTOR
].Bits
.OffsetHigh
<< 16));
571 Mailbox
= (DEBUG_AGENT_MAILBOX
*) (UINTN
)(*MailboxLocationPointer
);
573 // Mailbox should valid and setup before executing thunk code
575 VerifyMailboxChecksum (Mailbox
);
577 DebugPortHandle
= (UINT64
) (UINTN
)DebugPortInitialize ((VOID
*)(UINTN
)Mailbox
->DebugPortHandle
, NULL
);
578 UpdateMailboxContent (Mailbox
, DEBUG_MAILBOX_DEBUG_PORT_HANDLE_INDEX
, DebugPortHandle
);
580 // Set up IDT entries
582 InitializeDebugIdt ();
584 // Update IDT entry to save location pointer saved the mailbox pointer
586 SetLocationSavedMailboxPointerInIdtEntry (MailboxLocationPointer
);
588 FindAndReportModuleImageInfo (4);
594 // Only DEBUG_AGENT_INIT_PREMEM_SEC and DEBUG_AGENT_INIT_POSTMEM_SEC are allowed for this
595 // Debug Agent library instance.
597 DEBUG ((EFI_D_ERROR
, "Debug Agent: The InitFlag value is not allowed!\n"));
603 // Enable CPU interrupts so debug timer interrupts can be delivered
608 // If Function is not NULL, invoke it always whatever debug agent was initialized sucesssfully or not.
610 if (Function
!= NULL
) {
614 // Set return status for DEBUG_AGENT_INIT_PEI
616 if (InitFlag
== DEBUG_AGENT_INIT_PEI
) {
617 *(EFI_STATUS
*)Context
= EFI_SUCCESS
;
622 Caller provided function to be invoked at the end of DebugPortInitialize().
624 Refer to the descrption for DebugPortInitialize() for more details.
626 @param[in] Context The first input argument of DebugPortInitialize().
627 @param[in] DebugPortHandle Debug port handle created by Debug Communication Libary.
632 InitializeDebugAgentPhase2 (
634 IN DEBUG_PORT_HANDLE DebugPortHandle
637 DEBUG_AGENT_PHASE2_CONTEXT
*Phase2Context
;
638 UINT64
*MailboxLocation
;
639 DEBUG_AGENT_MAILBOX
*Mailbox
;
640 EFI_SEC_PEI_HAND_OFF
*SecCoreData
;
642 UINT64 NewDebugPortHandle
;
644 Phase2Context
= (DEBUG_AGENT_PHASE2_CONTEXT
*) Context
;
645 MailboxLocation
= GetLocationSavedMailboxPointerInIdtEntry ();
646 Mailbox
= (DEBUG_AGENT_MAILBOX
*)(UINTN
)(*MailboxLocation
);
647 BufferSize
= PcdGet16(PcdDebugPortHandleBufferSize
);
648 if (Phase2Context
->InitFlag
== DEBUG_AGENT_INIT_PEI
) {
649 NewDebugPortHandle
= (UINT64
)(UINTN
)AllocateCopyPool (BufferSize
, DebugPortHandle
);
651 NewDebugPortHandle
= (UINT64
)(UINTN
)DebugPortHandle
;
653 UpdateMailboxContent (Mailbox
, DEBUG_MAILBOX_DEBUG_PORT_HANDLE_INDEX
, NewDebugPortHandle
);
656 // Trigger one software interrupt to inform HOST
658 TriggerSoftInterrupt (SYSTEM_RESET_SIGNATURE
);
660 if (Phase2Context
->InitFlag
== DEBUG_AGENT_INIT_PREMEM_SEC
) {
662 // If Temporary RAM region is below 128 MB, then send message to
663 // host to disable low memory filtering.
665 SecCoreData
= (EFI_SEC_PEI_HAND_OFF
*)Phase2Context
->Context
;
666 if ((UINTN
)SecCoreData
->TemporaryRamBase
< BASE_128MB
&& IsHostAttached ()) {
667 SetDebugFlag (DEBUG_AGENT_FLAG_MEMORY_READY
, 1);
668 TriggerSoftInterrupt (MEMORY_READY_SIGNATURE
);
671 // Enable CPU interrupts so debug timer interrupts can be delivered
675 // Call continuation function if it is not NULL.
677 Phase2Context
->Function (Phase2Context
->Context
);