UINT64 *MailboxLocationPointer;\r
EFI_PHYSICAL_ADDRESS Address;\r
UINT32 DebugTimerFrequency;\r
+ BOOLEAN CpuInterruptState;\r
\r
- DisableInterrupts ();\r
+ //\r
+ // Disable interrupts and save current interrupt state\r
+ //\r
+ CpuInterruptState = SaveAndDisableInterrupts();\r
\r
switch (InitFlag) {\r
\r
Ia32Idtr = (IA32_DESCRIPTOR *) Context;\r
Ia32IdtEntry = (IA32_IDT_ENTRY *)(Ia32Idtr->Base);\r
MailboxLocationPointer = (UINT64 *) (UINTN) (Ia32IdtEntry[DEBUG_MAILBOX_VECTOR].Bits.OffsetLow +\r
- (Ia32IdtEntry[DEBUG_MAILBOX_VECTOR].Bits.OffsetHigh << 16));\r
+ (UINT32) (Ia32IdtEntry[DEBUG_MAILBOX_VECTOR].Bits.OffsetHigh << 16));\r
Mailbox = (DEBUG_AGENT_MAILBOX *) (UINTN)(*MailboxLocationPointer);\r
//\r
// Mailbox should valid and setup before executing thunk code\r
break;\r
}\r
\r
- //\r
- // Enable CPU interrupts so debug timer interrupts can be delivered\r
- //\r
- EnableInterrupts ();\r
-\r
+ if (InitFlag == DEBUG_AGENT_INIT_POSTMEM_SEC) {\r
+ //\r
+ // Restore CPU Interrupt state and keep debug timer interrupt state as is\r
+ // in DEBUG_AGENT_INIT_POSTMEM_SEC case\r
+ //\r
+ SetInterruptState (CpuInterruptState);\r
+ } else {\r
+ //\r
+ // Enable Debug Timer interrupt\r
+ //\r
+ SaveAndSetDebugTimerInterrupt (TRUE);\r
+ //\r
+ // Enable CPU interrupts so debug timer interrupts can be delivered\r
+ //\r
+ EnableInterrupts ();\r
+ }\r
//\r
// If Function is not NULL, invoke it always whatever debug agent was initialized sucesssfully or not.\r
//\r
TriggerSoftInterrupt (MEMORY_READY_SIGNATURE);\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
EnableInterrupts ();\r