SourceLevelDebugPkg: Update SmmDebugAgentLib to restore APIC timer

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>
This commit is contained in:
Liming Gao 2017-10-10 18:04:12 +08:00
parent 3372ab3cf2
commit 222c49300d

View File

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