]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SourceLevelDebugPkg/Library/DebugAgent/SmmDebugAgent/SmmDebugAgentLib.c
SourceLevelDebugPkg: Update SmmDebugAgentLib to restore APIC timer
[mirror_edk2.git] / SourceLevelDebugPkg / Library / DebugAgent / SmmDebugAgent / SmmDebugAgentLib.c
index 11afd329fad334c6f572fe0b9f5725dd4158ca54..6be8c544255dae06387794000aec9fc8c681bcf8 100644 (file)
@@ -20,6 +20,11 @@ UINTN                       mSavedDebugRegisters[6];
 IA32_IDT_GATE_DESCRIPTOR    mIdtEntryTable[33];\r
 BOOLEAN                     mSkipBreakpoint = FALSE;\r
 BOOLEAN                     mSmmDebugIdtInitFlag = FALSE;\r
+BOOLEAN                     mApicTimerRestore = FALSE;\r
+BOOLEAN                     mPeriodicMode;\r
+UINT32                      mTimerCycle;\r
+UINTN                       mApicTimerDivisor;\r
+UINT8                       mVector;\r
 \r
 CHAR8 mWarningMsgIgnoreSmmEntryBreak[] = "Ignore smmentrybreak setting for SMI issued during DXE debugging!\r\n";\r
 \r
@@ -191,8 +196,6 @@ InitializeDebugAgent (
   DEBUG_AGENT_MAILBOX           *Mailbox;\r
   UINT64                        *MailboxLocation;\r
   UINT32                        DebugTimerFrequency;\r
-  BOOLEAN                       PeriodicMode;\r
-  UINTN                         TimerCycle;\r
 \r
   switch (InitFlag) {\r
   case DEBUG_AGENT_INIT_SMM:\r
@@ -289,9 +292,10 @@ InitializeDebugAgent (
     // Check if CPU APIC Timer is working, otherwise initialize it.\r
     //\r
     InitializeLocalApicSoftwareEnable (TRUE);\r
-    GetApicTimerState (NULL, &PeriodicMode, NULL);\r
-    TimerCycle = GetApicTimerInitCount ();\r
-    if (!PeriodicMode || TimerCycle == 0) {\r
+    GetApicTimerState (&mApicTimerDivisor, &mPeriodicMode, &mVector);\r
+    mTimerCycle = GetApicTimerInitCount ();\r
+    if (!mPeriodicMode || mTimerCycle == 0) {\r
+      mApicTimerRestore = TRUE;\r
       InitializeDebugTimer (NULL, FALSE);\r
     }\r
     Mailbox = GetMailboxPointer ();\r
@@ -327,6 +331,13 @@ InitializeDebugAgent (
     //\r
     mSkipBreakpoint = FALSE;\r
     RestoreDebugRegister ();\r
+    //\r
+    // Restore APIC Timer\r
+    //\r
+    if (mApicTimerRestore) {\r
+      InitializeApicTimer (mApicTimerDivisor, mTimerCycle, mPeriodicMode, mVector);\r
+      mApicTimerRestore = FALSE;\r
+    }\r
     break;\r
 \r
   case DEBUG_AGENT_INIT_THUNK_PEI_IA32TOX64:\r