From e2c8d3cff7538db66931e32fc76f91b116b00bee Mon Sep 17 00:00:00 2001 From: Jeff Fan Date: Wed, 10 Jun 2015 01:45:18 +0000 Subject: SourceLevelDebugPkg/DxeDebugAgent: Initialize Local APIC Timer Now Debug Agent library uses Local APIC Timer to implement time-out mechanism. For AP, its local APIC timer may not work. This fix is to initialize Local APIC timer if it doesn't work as expected when debugging AP function. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jeff Fan Reviewed-by: Ruiyu Ni git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17604 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Library/DebugAgent/DxeDebugAgent/DxeDebugAgentLib.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'SourceLevelDebugPkg/Library') diff --git a/SourceLevelDebugPkg/Library/DebugAgent/DxeDebugAgent/DxeDebugAgentLib.c b/SourceLevelDebugPkg/Library/DebugAgent/DxeDebugAgent/DxeDebugAgentLib.c index 56a5e1a170..f7fbb3ccfa 100644 --- a/SourceLevelDebugPkg/Library/DebugAgent/DxeDebugAgent/DxeDebugAgentLib.c +++ b/SourceLevelDebugPkg/Library/DebugAgent/DxeDebugAgent/DxeDebugAgentLib.c @@ -365,8 +365,18 @@ InitializeDebugAgent ( IA32_DESCRIPTOR IdtDescriptor; IA32_DESCRIPTOR *Ia32Idtr; IA32_IDT_ENTRY *Ia32IdtEntry; + BOOLEAN PeriodicMode; + UINTN TimerCycle; if (InitFlag == DEBUG_AGENT_INIT_DXE_AP) { + // + // Check if CPU APIC Timer is working, otherwise initialize it. + // + GetApicTimerState (NULL, &PeriodicMode, NULL); + TimerCycle = GetApicTimerInitCount (); + if (!PeriodicMode || TimerCycle == 0) { + InitializeDebugTimer (NULL, FALSE); + } // // Invoked by AP, enable interrupt to let AP could receive IPI from other processors // -- cgit v1.2.3