]> git.proxmox.com Git - mirror_edk2.git/commitdiff
SourceLevelDebugPkg/DebugAgent: Disable Debug Timer as early
authorJeff Fan <jeff.fan@intel.com>
Mon, 8 Jun 2015 06:36:41 +0000 (06:36 +0000)
committervanjeff <vanjeff@Edk2>
Mon, 8 Jun 2015 06:36:41 +0000 (06:36 +0000)
InitializeApicTimer() will enable Local APIC timer interrupt. Even though we
disable CPU interrupt at the beginning and enable CPU Interrupt after debug
agent initialized completely, some Boot Service may invoke RestoreTpl () which
may enable CPU interrupt.
We should disable Local APIC timer in InitializeDebugTimer () to avoid Debug
Timer interrupt happens during debug port and debug agent initialization phase.
And enable Debug Timer interrupt after debug agent is initialized.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17572 6f19259b-4bc3-4df7-8a09-765794883524

SourceLevelDebugPkg/Library/DebugAgent/DebugAgentCommon/DebugAgent.c
SourceLevelDebugPkg/Library/DebugAgent/DebugAgentCommon/DebugTimer.c
SourceLevelDebugPkg/Library/DebugAgent/DxeDebugAgent/DxeDebugAgentLib.c
SourceLevelDebugPkg/Library/DebugAgent/SecPeiDebugAgent/SecPeiDebugAgentLib.c
SourceLevelDebugPkg/Library/DebugAgent/SmmDebugAgent/SmmDebugAgentLib.c

index 3eca30497f8bf2896d2b2a8216b9004f77b0bb76..6c32586303314fe511b247577cdff9c381090d34 100644 (file)
@@ -2535,6 +2535,7 @@ InterruptProcess (
         CurrentDebugTimerInitCount = GetApicTimerInitCount ();\r
         if (mDebugMpContext.DebugTimerInitCount != CurrentDebugTimerInitCount) {\r
           InitializeDebugTimer (NULL, FALSE);\r
+          SaveAndSetDebugTimerInterrupt (TRUE);\r
         }\r
       }\r
 \r
index 25d64685889288eb029fe43df27aeda55f3a1969..4a6ccdb7da1f90f62517ce7c0dce58ba24d97754 100644 (file)
@@ -46,6 +46,11 @@ InitializeDebugTimer (
                    );\r
 \r
   InitializeApicTimer (ApicTimerDivisor, InitialCount, TRUE, DEBUG_TIMER_VECTOR);\r
+  //\r
+  // Disable Debug Timer interrupt to avoid it is delivered before Debug Port\r
+  // is initialized\r
+  //\r
+  DisableApicTimerInterrupt ();\r
 \r
   if (DumpFlag) {\r
     DEBUG ((EFI_D_INFO, "Debug Timer: FSB Clock    = %d\n", PcdGet32(PcdFSBClock)));\r
index aaf342e0ba85f9d3bb952e4a2a3d68e3a89824be..56a5e1a170700ebd395872a62d2e93d1ec301616 100644 (file)
@@ -428,6 +428,10 @@ InitializeDebugAgent (
     //\r
     InternalConstructorWorker ();\r
     //\r
+    // Enable Debug Timer interrupt\r
+    //\r
+    SaveAndSetDebugTimerInterrupt (TRUE);\r
+    //\r
     // Enable interrupt to receive Debug Timer interrupt\r
     //\r
     EnableInterrupts ();\r
@@ -482,6 +486,10 @@ InitializeDebugAgent (
     //\r
     SetupDebugAgentEnvironment (Mailbox);\r
     //\r
+    // Enable Debug Timer interrupt\r
+    //\r
+    SaveAndSetDebugTimerInterrupt (TRUE);\r
+    //\r
     // Enable interrupt to receive Debug Timer interrupt\r
     //\r
     EnableInterrupts ();\r
index 20b6a370d6bb104aabd1849ea1c0818812567cca..e77ff723e3fd91d7bff7e629d55027b7cd992124 100644 (file)
@@ -611,6 +611,10 @@ InitializeDebugAgent (
     break;\r
   }\r
 \r
+  //\r
+  // Enable Debug Timer interrupt\r
+  //\r
+  SaveAndSetDebugTimerInterrupt (TRUE);\r
   //\r
   // Enable CPU interrupts so debug timer interrupts can be delivered\r
   //\r
index 4e4e1f536cdf0c0144c76156fb499a862c9870d9..6ac5f88deaa9bdf808ce997b99c5aef850782086 100644 (file)
@@ -284,7 +284,6 @@ InitializeDebugAgent (
     TimerCycle = GetApicTimerInitCount ();\r
     if (!PeriodicMode || TimerCycle == 0) {\r
       InitializeDebugTimer (NULL, FALSE);\r
-      DisableApicTimerInterrupt ();\r
     }\r
     Mailbox = GetMailboxPointer ();\r
     if (GetDebugFlag (DEBUG_AGENT_FLAG_AGENT_IN_PROGRESS) == 1) {\r
@@ -350,6 +349,10 @@ InitializeDebugAgent (
       //\r
       InitializeDebugTimer (&DebugTimerFrequency, TRUE);\r
       UpdateMailboxContent (mMailboxPointer, DEBUG_MAILBOX_DEBUG_TIMER_FREQUENCY, DebugTimerFrequency);\r
+      //\r
+      // Enable Debug Timer interrupt and CPU interrupt\r
+      //\r
+      SaveAndSetDebugTimerInterrupt (TRUE);\r
       EnableInterrupts ();\r
 \r
       FindAndReportModuleImageInfo (SIZE_4KB);\r