]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Allocate ACPImemoryNVS type memory to save mailbox and debug port handle buffer since...
authorvanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 18 Apr 2013 05:08:50 +0000 (05:08 +0000)
committervanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 18 Apr 2013 05:08:50 +0000 (05:08 +0000)
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14285 6f19259b-4bc3-4df7-8a09-765794883524

SourceLevelDebugPkg/Library/DebugAgent/SecPeiDebugAgent/SecPeiDebugAgentLib.c

index 49c8268e09439a8fee9a56ca5545c5d06f64d8c3..828407304f2c090df8c54fab2ae66f8896aaefe7 100644 (file)
@@ -244,23 +244,51 @@ DebugAgentCallbackMemoryDiscoveredPpi (
   IN VOID                                 *Ppi\r
   )\r
 {\r
+  EFI_STATUS                     Status;\r
   DEBUG_AGENT_MAILBOX            *Mailbox;\r
   BOOLEAN                        InterruptStatus;\r
-  \r
+  EFI_PHYSICAL_ADDRESS           Memory; \r
+  DEBUG_AGENT_MAILBOX            *NewMailbox;\r
+  UINT64                         *MailboxLocationInHob;\r
+\r
   //\r
   // Save and disable original interrupt status\r
   //\r
   InterruptStatus = SaveAndDisableInterrupts ();\r
-  \r
+\r
   //\r
-  // Set physical memory ready flag\r
+  // Allocate ACPI NVS memory for new Mailbox and Debug Port Handle buffer\r
+  //\r
+  Status = PeiServicesAllocatePages (\r
+             EfiACPIMemoryNVS,\r
+             EFI_SIZE_TO_PAGES (sizeof(DEBUG_AGENT_MAILBOX) + PcdGet16(PcdDebugPortHandleBufferSize)),\r
+             &Memory\r
+             );\r
+  ASSERT_EFI_ERROR (Status);\r
+  NewMailbox = (DEBUG_AGENT_MAILBOX *) (UINTN) Memory;\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 in the allocated pool that may be marked as free by DXE Core after DXE Core\r
+  // reallocates the HOB.\r
   //\r
   Mailbox = GetMailboxPointer ();\r
-  SetDebugFlag (DEBUG_AGENT_FLAG_MEMORY_READY, 1);\r
-\r
+  CopyMem (NewMailbox, Mailbox, sizeof (DEBUG_AGENT_MAILBOX));\r
+  CopyMem (NewMailbox + 1, (VOID *)(UINTN)Mailbox->DebugPortHandle, PcdGet16(PcdDebugPortHandleBufferSize));\r
   //\r
-  // Memory has been ready\r
+  // Update Mailbox Location pointer in GUIDed HOB and IDT entry with new one\r
   //\r
+  MailboxLocationInHob = GetMailboxLocationFromHob ();\r
+  *MailboxLocationInHob = (UINT64)(UINTN)NewMailbox;\r
+  SetLocationSavedMailboxPointerInIdtEntry (MailboxLocationInHob);\r
+  //\r
+  // Update Debug Port Handle in new Mailbox\r
+  //\r
+  UpdateMailboxContent (NewMailbox, DEBUG_MAILBOX_DEBUG_PORT_HANDLE_INDEX, (UINT64)(UINTN)(NewMailbox + 1));\r
+  //\r
+  // Set physical memory ready flag\r
+  //\r
+  SetDebugFlag (DEBUG_AGENT_FLAG_MEMORY_READY, 1);\r
+\r
   if (IsHostAttached ()) {\r
     //\r
     // Trigger one software interrupt to inform HOST\r