]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SourceLevelDebugPkg/Library/DebugAgent/DxeDebugAgent/DxeDebugAgentLib.c
1. DebugAgentLib will install reserved vector table to persist vectors.
[mirror_edk2.git] / SourceLevelDebugPkg / Library / DebugAgent / DxeDebugAgent / DxeDebugAgentLib.c
index d560b5235993e18a9070a910816537ac09fccc64..71130d8aaaa424f1155aa52e0031dbeeb2e86ad8 100644 (file)
@@ -57,6 +57,32 @@ InternalConstructorWorker (
   BOOLEAN                     DebugTimerInterruptState;\r
   DEBUG_AGENT_MAILBOX         *Mailbox;\r
   DEBUG_AGENT_MAILBOX         *NewMailbox;\r
+  EFI_HOB_GUID_TYPE           *GuidHob;\r
+  EFI_VECTOR_HANDOFF_INFO     *VectorHandoffInfo;\r
+\r
+  //\r
+  // Check persisted vector handoff info\r
+  //\r
+  Status = EFI_SUCCESS;\r
+  GuidHob = GetFirstGuidHob (&gEfiVectorHandoffInfoPpiGuid);\r
+  if (GuidHob != NULL && !mDxeCoreFlag) {\r
+    //\r
+    // Check if configuration table is installed or not if GUIDed HOB existed,\r
+    // only when Debug Agent is not linked by DXE Core\r
+    //\r
+    Status = EfiGetSystemConfigurationTable (&gEfiVectorHandoffTableGuid, (VOID **) &VectorHandoffInfo);\r
+  }\r
+  if (GuidHob == NULL || Status != EFI_SUCCESS) {\r
+    //\r
+    // Install configuration table for persisted vector handoff info if GUIDed HOB cannot be found or\r
+    // configuration table does not exist\r
+    //\r
+    Status = gBS->InstallConfigurationTable (&gEfiVectorHandoffTableGuid, (VOID *) &mVectorHandoffInfoDebugAgent[0]);\r
+    if (EFI_ERROR (Status)) {\r
+      DEBUG ((EFI_D_ERROR, "DebugAgent: Cannot install configuration table for persisted vector handoff info!\n"));\r
+      CpuDeadLoop ();\r
+    }\r
+  }\r
 \r
   //\r
   // Install EFI Serial IO protocol on debug port\r
@@ -70,7 +96,10 @@ InternalConstructorWorker (
                   EFI_SIZE_TO_PAGES (sizeof(DEBUG_AGENT_MAILBOX) + PcdGet16(PcdDebugPortHandleBufferSize)),\r
                   &Address\r
                   );\r
-  ASSERT_EFI_ERROR (Status);\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((EFI_D_ERROR, "DebugAgent: Cannot install configuration table for mailbox!\n"));\r
+    CpuDeadLoop ();\r
+  }\r
 \r
   DebugTimerInterruptState = SaveAndSetDebugTimerInterrupt (FALSE);\r
 \r
@@ -91,7 +120,10 @@ InternalConstructorWorker (
   DebugTimerInterruptState = SaveAndSetDebugTimerInterrupt (DebugTimerInterruptState);\r
 \r
   Status = gBS->InstallConfigurationTable (&gEfiDebugAgentGuid, (VOID *) mMailboxPointer);\r
-  ASSERT_EFI_ERROR (Status);\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((EFI_D_ERROR, "DebugAgent: Failed to install configuration for mailbox!\n"));\r
+    CpuDeadLoop ();\r
+  }\r
 }\r
 \r
 /**\r
@@ -233,9 +265,16 @@ SetupDebugAgentEnviroment (
   AsmReadIdtr ((IA32_DESCRIPTOR *) &Idtr);\r
   IdtEntryCount = (UINT16) ((Idtr.Limit + 1) / sizeof (IA32_IDT_GATE_DESCRIPTOR));\r
   if (IdtEntryCount < 33) {\r
+    ZeroMem (&mIdtEntryTable, sizeof (IA32_IDT_GATE_DESCRIPTOR) * 33);\r
+    //\r
+    // Copy original IDT table into new one\r
+    //\r
+    CopyMem (&mIdtEntryTable, (VOID *) Idtr.Base, Idtr.Limit + 1);\r
+    //\r
+    // Load new IDT table\r
+    //\r
     Idtr.Limit = (UINT16) (sizeof (IA32_IDT_GATE_DESCRIPTOR) * 33 - 1);\r
     Idtr.Base  = (UINTN) &mIdtEntryTable;\r
-    ZeroMem (&mIdtEntryTable, Idtr.Limit + 1);\r
     AsmWriteIdtr ((IA32_DESCRIPTOR *) &Idtr);\r
   }\r
 \r