mirror of
https://github.com/reactos/reactos.git
synced 2024-10-19 15:41:31 +00:00
[SOFT386]
Implement the hardware interrupt system. Modify Soft386Interrupt to assume hardware interrupts, because software interrupts from outside the emulator may cause race conditions. svn path=/branches/ntvdm/; revision=60696
This commit is contained in:
parent
3041ad0330
commit
0e8be812b0
|
@ -342,6 +342,7 @@ struct _SOFT386_STATE
|
|||
ULONG PrefixFlags;
|
||||
SOFT386_SEG_REGS SegmentOverride;
|
||||
BOOLEAN HardwareInt;
|
||||
UCHAR PendingIntNum;
|
||||
};
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
|
@ -372,7 +373,7 @@ Soft386Reset(PSOFT386_STATE State);
|
|||
|
||||
VOID
|
||||
NTAPI
|
||||
Soft386Interrupt(PSOFT386_STATE State, UCHAR Number, BOOLEAN Hardware);
|
||||
Soft386Interrupt(PSOFT386_STATE State, UCHAR Number);
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
|
|
|
@ -56,8 +56,30 @@ Soft386ExecutionControl(PSOFT386_STATE State, INT Command)
|
|||
/* Main execution loop */
|
||||
do
|
||||
{
|
||||
/* If this is a new instruction, save the IP */
|
||||
if (State->PrefixFlags == 0) State->SavedInstPtr = State->InstPtr;
|
||||
/* Check if this is a new instruction */
|
||||
if (State->PrefixFlags == 0)
|
||||
{
|
||||
State->SavedInstPtr = State->InstPtr;
|
||||
|
||||
/* Check if interrupts are enabled and there is an interrupt pending */
|
||||
if (State->Flags.If && State->HardwareInt)
|
||||
{
|
||||
SOFT386_IDT_ENTRY IdtEntry;
|
||||
|
||||
/* Get the interrupt vector */
|
||||
if (Soft386GetIntVector(State, State->PendingIntNum, &IdtEntry))
|
||||
{
|
||||
/* Perform the interrupt */
|
||||
Soft386InterruptInternal(State,
|
||||
IdtEntry.Selector,
|
||||
MAKELONG(IdtEntry.Offset, IdtEntry.OffsetHigh),
|
||||
IdtEntry.Type);
|
||||
}
|
||||
|
||||
/* Clear the interrupt pending flag */
|
||||
State->HardwareInt = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/* Perform an instruction fetch */
|
||||
if (!Soft386FetchByte(State, &Opcode)) continue;
|
||||
|
@ -273,27 +295,11 @@ Soft386Reset(PSOFT386_STATE State)
|
|||
|
||||
VOID
|
||||
NTAPI
|
||||
Soft386Interrupt(PSOFT386_STATE State, UCHAR Number, BOOLEAN Hardware)
|
||||
Soft386Interrupt(PSOFT386_STATE State, UCHAR Number)
|
||||
{
|
||||
SOFT386_IDT_ENTRY IdtEntry;
|
||||
|
||||
if (Hardware)
|
||||
{
|
||||
/* Set the hardware interrupt flag */
|
||||
State->HardwareInt = TRUE;
|
||||
}
|
||||
|
||||
if (!Soft386GetIntVector(State, Number, &IdtEntry))
|
||||
{
|
||||
/* An exception occurred, let the handler execute */
|
||||
return;
|
||||
}
|
||||
|
||||
/* Perform the interrupt */
|
||||
Soft386InterruptInternal(State,
|
||||
IdtEntry.Selector,
|
||||
MAKELONG(IdtEntry.Offset, IdtEntry.OffsetHigh),
|
||||
IdtEntry.Type);
|
||||
/* Set the hardware interrupt flag */
|
||||
State->HardwareInt = TRUE;
|
||||
State->PendingIntNum = Number;
|
||||
}
|
||||
|
||||
VOID
|
||||
|
|
|
@ -473,7 +473,7 @@ VOID EmulatorInterrupt(BYTE Number)
|
|||
softx86_make_simple_interrupt_call(&EmulatorContext, &Segment, &Offset);
|
||||
#else
|
||||
/* Call the Soft386 API */
|
||||
Soft386Interrupt(&EmulatorContext, Number, FALSE);
|
||||
Soft386Interrupt(&EmulatorContext, Number);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -484,7 +484,7 @@ VOID EmulatorExternalInterrupt(BYTE Number)
|
|||
softx86_ext_hw_signal(&EmulatorContext, Number);
|
||||
#else
|
||||
/* Call the Soft386 API */
|
||||
Soft386Interrupt(&EmulatorContext, Number, TRUE);
|
||||
Soft386Interrupt(&EmulatorContext, Number);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue