}\r
\r
/**\r
- Exectue Stepping command.\r
+ Execute Stepping command.\r
\r
@param[in] CpuContext Pointer to saved CPU context.\r
\r
Eflags = (IA32_EFLAGS32 *) &CpuContext->Eflags;\r
Eflags->Bits.TF = 1;\r
Eflags->Bits.RF = 1;\r
+ //\r
+ // Save and clear EFLAGS.IF to avoid interrupt happen when executing Stepping\r
+ //\r
+ SetDebugFlag (DEBUG_AGENT_FLAG_INTERRUPT_FLAG, Eflags->Bits.IF);\r
+ Eflags->Bits.IF = 0;\r
+ //\r
+ // Set Stepping Flag\r
+ //\r
+ SetDebugFlag (DEBUG_AGENT_FLAG_STEPPING, 1);\r
+}\r
+\r
+/**\r
+ Do some cleanup after Stepping command done.\r
+\r
+ @param[in] CpuContext Pointer to saved CPU context.\r
+\r
+**/\r
+VOID\r
+CommandSteppingCleanup (\r
+ IN DEBUG_CPU_CONTEXT *CpuContext\r
+ )\r
+{\r
+ IA32_EFLAGS32 *Eflags;\r
+\r
+ Eflags = (IA32_EFLAGS32 *) &CpuContext->Eflags;\r
+ //\r
+ // Restore EFLAGS.IF\r
+ //\r
+ Eflags->Bits.IF = GetDebugFlag (DEBUG_AGENT_FLAG_INTERRUPT_FLAG);\r
+ //\r
+ // Clear Stepping flag\r
+ //\r
+ SetDebugFlag (DEBUG_AGENT_FLAG_STEPPING, 0);\r
}\r
\r
/**\r
}\r
\r
mDebugMpContext.BreakAtCpuIndex = (UINT32) (-1);\r
- //\r
- // Set Stepping Flag\r
- //\r
- SetDebugFlag (DEBUG_AGENT_FLAG_STEPPING, 1);\r
ReleaseMpSpinLock (&mDebugMpContext.DebugPortSpinLock);\r
//\r
// Executing stepping command directly without sending ACK packet,\r
if (MultiProcessorDebugSupport()) {\r
mDebugMpContext.BreakAtCpuIndex = ProcessorIndex;\r
}\r
- SendAckPacket (DEBUG_COMMAND_OK);\r
//\r
- // Clear Stepping Flag\r
+ // Clear Stepping Flag and restore EFLAGS.IF\r
//\r
- SetDebugFlag (DEBUG_AGENT_FLAG_STEPPING, 0);\r
+ CommandSteppingCleanup (CpuContext);\r
+ SendAckPacket (DEBUG_COMMAND_OK);\r
CommandCommunication (Vector, CpuContext, BreakReceived);\r
break;\r
\r
if (MultiProcessorDebugSupport()) {\r
mDebugMpContext.BreakAtCpuIndex = ProcessorIndex;\r
}\r
+ //\r
+ // Clear Stepping flag and restore EFLAGS.IF\r
+ //\r
+ CommandSteppingCleanup (CpuContext);\r
SendAckPacket (DEBUG_COMMAND_OK);\r
} else {\r
//\r