]> git.proxmox.com Git - mirror_edk2.git/commitdiff
SourceLevelDebugPkg: Update SmmDebugAgentLib to restore APIC timer
authorLiming Gao <liming.gao@intel.com>
Tue, 10 Oct 2017 10:04:12 +0000 (18:04 +0800)
committerLiming Gao <liming.gao@intel.com>
Mon, 16 Oct 2017 03:23:16 +0000 (11:23 +0800)
In enter SMI, APIC timer may be initialized. After exit SMI, APIC timer
will be restore.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Liming Gao <liming.gao@intel.com>
Cc: Ruiyu Ni <ruiyu.ni@intel.com>
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
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