Reviewed-by: Ruiyu Ni <ruiyu...@intel.com>

> -----Original Message-----
> From: Fan, Jeff
> Sent: Friday, June 5, 2015 4:27 PM
> To: edk2-devel@lists.sourceforge.net
> Cc: Ni, Ruiyu
> Subject: [Patch] SourceLevelDebugPkg/DebugAgent: Disable Debug Timer as
> early
> 
> 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....@intel.com>
> CC: Ruiyu Ni <ruiyu...@intel.com>
> ---
>  .../Library/DebugAgent/DebugAgentCommon/DebugAgent.c
> | 1 +
>  .../Library/DebugAgent/DebugAgentCommon/DebugTimer.c
> | 5 +++++
>  .../Library/DebugAgent/DxeDebugAgent/DxeDebugAgentLib.c
> | 8 ++++++++
>  .../Library/DebugAgent/SecPeiDebugAgent/SecPeiDebugAgentLib.c     |
> 4 ++++
>  .../Library/DebugAgent/SmmDebugAgent/SmmDebugAgentLib.c
> | 5 ++++-
>  5 files changed, 22 insertions(+), 1 deletion(-)
> 
> diff --git
> a/SourceLevelDebugPkg/Library/DebugAgent/DebugAgentCommon/DebugA
> gent.c
> b/SourceLevelDebugPkg/Library/DebugAgent/DebugAgentCommon/DebugA
> gent.c
> index 3eca304..6c32586 100644
> ---
> a/SourceLevelDebugPkg/Library/DebugAgent/DebugAgentCommon/DebugA
> gent.c
> +++
> b/SourceLevelDebugPkg/Library/DebugAgent/DebugAgentCommon/DebugA
> gent.c
> @@ -2535,6 +2535,7 @@ InterruptProcess (
>          CurrentDebugTimerInitCount = GetApicTimerInitCount ();
>          if (mDebugMpContext.DebugTimerInitCount !=
> CurrentDebugTimerInitCount) {
>            InitializeDebugTimer (NULL, FALSE);
> +          SaveAndSetDebugTimerInterrupt (TRUE);
>          }
>        }
> 
> diff --git
> a/SourceLevelDebugPkg/Library/DebugAgent/DebugAgentCommon/DebugT
> imer.c
> b/SourceLevelDebugPkg/Library/DebugAgent/DebugAgentCommon/DebugT
> imer.c
> index 25d6468..4a6ccdb 100644
> ---
> a/SourceLevelDebugPkg/Library/DebugAgent/DebugAgentCommon/DebugT
> imer.c
> +++
> b/SourceLevelDebugPkg/Library/DebugAgent/DebugAgentCommon/DebugT
> imer.c
> @@ -46,6 +46,11 @@ InitializeDebugTimer (
>                     );
> 
>    InitializeApicTimer (ApicTimerDivisor, InitialCount, TRUE,
> DEBUG_TIMER_VECTOR);
> +  //
> +  // Disable Debug Timer interrupt to avoid it is delivered before Debug
> Port
> +  // is initialized
> +  //
> +  DisableApicTimerInterrupt ();
> 
>    if (DumpFlag) {
>      DEBUG ((EFI_D_INFO, "Debug Timer: FSB Clock    = %d\n",
> PcdGet32(PcdFSBClock)));
> diff --git
> a/SourceLevelDebugPkg/Library/DebugAgent/DxeDebugAgent/DxeDebugAg
> entLib.c
> b/SourceLevelDebugPkg/Library/DebugAgent/DxeDebugAgent/DxeDebugAg
> entLib.c
> index aaf342e..56a5e1a 100644
> ---
> a/SourceLevelDebugPkg/Library/DebugAgent/DxeDebugAgent/DxeDebugAg
> entLib.c
> +++
> b/SourceLevelDebugPkg/Library/DebugAgent/DxeDebugAgent/DxeDebugAg
> entLib.c
> @@ -428,6 +428,10 @@ InitializeDebugAgent (
>      //
>      InternalConstructorWorker ();
>      //
> +    // Enable Debug Timer interrupt
> +    //
> +    SaveAndSetDebugTimerInterrupt (TRUE);
> +    //
>      // Enable interrupt to receive Debug Timer interrupt
>      //
>      EnableInterrupts ();
> @@ -482,6 +486,10 @@ InitializeDebugAgent (
>      //
>      SetupDebugAgentEnvironment (Mailbox);
>      //
> +    // Enable Debug Timer interrupt
> +    //
> +    SaveAndSetDebugTimerInterrupt (TRUE);
> +    //
>      // Enable interrupt to receive Debug Timer interrupt
>      //
>      EnableInterrupts ();
> diff --git
> a/SourceLevelDebugPkg/Library/DebugAgent/SecPeiDebugAgent/SecPeiDeb
> ugAgentLib.c
> b/SourceLevelDebugPkg/Library/DebugAgent/SecPeiDebugAgent/SecPeiDeb
> ugAgentLib.c
> index 20b6a37..e77ff72 100644
> ---
> a/SourceLevelDebugPkg/Library/DebugAgent/SecPeiDebugAgent/SecPeiDeb
> ugAgentLib.c
> +++
> b/SourceLevelDebugPkg/Library/DebugAgent/SecPeiDebugAgent/SecPeiDeb
> ugAgentLib.c
> @@ -612,6 +612,10 @@ InitializeDebugAgent (
>    }
> 
>    //
> +  // Enable Debug Timer interrupt
> +  //
> +  SaveAndSetDebugTimerInterrupt (TRUE);
> +  //
>    // Enable CPU interrupts so debug timer interrupts can be delivered
>    //
>    EnableInterrupts ();
> diff --git
> a/SourceLevelDebugPkg/Library/DebugAgent/SmmDebugAgent/SmmDebug
> AgentLib.c
> b/SourceLevelDebugPkg/Library/DebugAgent/SmmDebugAgent/SmmDebug
> AgentLib.c
> index 4e4e1f5..6ac5f88 100644
> ---
> a/SourceLevelDebugPkg/Library/DebugAgent/SmmDebugAgent/SmmDebug
> AgentLib.c
> +++
> b/SourceLevelDebugPkg/Library/DebugAgent/SmmDebugAgent/SmmDebug
> AgentLib.c
> @@ -284,7 +284,6 @@ InitializeDebugAgent (
>      TimerCycle = GetApicTimerInitCount ();
>      if (!PeriodicMode || TimerCycle == 0) {
>        InitializeDebugTimer (NULL, FALSE);
> -      DisableApicTimerInterrupt ();
>      }
>      Mailbox = GetMailboxPointer ();
>      if (GetDebugFlag (DEBUG_AGENT_FLAG_AGENT_IN_PROGRESS) == 1)
> {
> @@ -350,6 +349,10 @@ InitializeDebugAgent (
>        //
>        InitializeDebugTimer (&DebugTimerFrequency, TRUE);
>        UpdateMailboxContent (mMailboxPointer,
> DEBUG_MAILBOX_DEBUG_TIMER_FREQUENCY, DebugTimerFrequency);
> +      //
> +      // Enable Debug Timer interrupt and CPU interrupt
> +      //
> +      SaveAndSetDebugTimerInterrupt (TRUE);
>        EnableInterrupts ();
> 
>        FindAndReportModuleImageInfo (SIZE_4KB);
> --
> 1.9.5.msysgit.0


------------------------------------------------------------------------------
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to