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:
parent
3372ab3cf2
commit
222c49300d
@ -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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user