EFI_STATUS Status;\r
EFI_PHYSICAL_ADDRESS Address;\r
BOOLEAN DebugTimerInterruptState;\r
+ DEBUG_AGENT_MAILBOX *Mailbox;\r
+ DEBUG_AGENT_MAILBOX *NewMailbox;\r
\r
//\r
// Install EFI Serial IO protocol on debug port\r
Status = gBS->AllocatePages (\r
AllocateAnyPages,\r
EfiACPIMemoryNVS,\r
- EFI_SIZE_TO_PAGES (sizeof (DEBUG_AGENT_MAILBOX)),\r
+ EFI_SIZE_TO_PAGES (sizeof(DEBUG_AGENT_MAILBOX) + PcdGet16(PcdDebugPortHandleBufferSize)),\r
&Address\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
DebugTimerInterruptState = SaveAndSetDebugTimerInterrupt (FALSE);\r
- CopyMem (\r
- (UINT8 *) (UINTN) Address,\r
- (UINT8 *) (UINTN) GetMailboxPointer (),\r
- sizeof (DEBUG_AGENT_MAILBOX)\r
- );\r
- DebugTimerInterruptState = SaveAndSetDebugTimerInterrupt (DebugTimerInterruptState);\r
\r
- mMailboxPointer = (DEBUG_AGENT_MAILBOX *) (UINTN) Address;\r
+ NewMailbox = (DEBUG_AGENT_MAILBOX *) (UINTN) Address;\r
+ //\r
+ // Copy Mailbox and Debug Port Handle buffer to new location in ACPI NVS memory, because original Mailbox\r
+ // and Debug Port Handle buffer may be free at runtime, SMM debug agent needs to access them\r
+ //\r
+ Mailbox = GetMailboxPointer ();\r
+ CopyMem (NewMailbox, Mailbox, sizeof (DEBUG_AGENT_MAILBOX));\r
+ CopyMem (NewMailbox + 1, (VOID *)(UINTN)Mailbox->DebugPortHandle, PcdGet16(PcdDebugPortHandleBufferSize));\r
+ //\r
+ // Update Debug Port Handle in new Mailbox\r
+ //\r
+ UpdateMailboxContent (NewMailbox, DEBUG_MAILBOX_DEBUG_PORT_HANDLE_INDEX, (UINT64)(UINTN)(NewMailbox + 1));\r
+ mMailboxPointer = NewMailbox;\r
+\r
+ DebugTimerInterruptState = SaveAndSetDebugTimerInterrupt (DebugTimerInterruptState);\r
\r
Status = gBS->InstallConfigurationTable (&gEfiDebugAgentGuid, (VOID *) mMailboxPointer);\r
ASSERT_EFI_ERROR (Status);\r