]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SourceLevelDebugPkg/Library/DebugAgent/DxeDebugAgent/DxeDebugAgentLib.c
1. Add CPU arch type in Mailbox, debug agent will not access HOB if CPU arch changed.
[mirror_edk2.git] / SourceLevelDebugPkg / Library / DebugAgent / DxeDebugAgent / DxeDebugAgentLib.c
index 35c6acfd9da5e3c359f07d79f972c5948d2bac9c..d560b5235993e18a9070a910816537ac09fccc64 100644 (file)
@@ -55,6 +55,8 @@ InternalConstructorWorker (
   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
@@ -65,20 +67,28 @@ InternalConstructorWorker (
   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