Don't enable interrupts unless it's necessary in the interrupt handler.
[FAST486]
When handling interrupt signals, make sure at least one instruction is executed,
to prevent the CPU from being completely blocked by interrupt signals.


svn path=/branches/ntvdm/; revision=60910
This commit is contained in:
Aleksandar Andrejevic 2013-11-10 00:53:05 +00:00
parent dd9dafc7ff
commit cc89902e00
2 changed files with 15 additions and 12 deletions

View file

@ -63,19 +63,10 @@ Fast486ExecutionControl(PFAST486_STATE State, INT Command)
* Check if there is an interrupt to execute, or a hardware interrupt signal * Check if there is an interrupt to execute, or a hardware interrupt signal
* while interrupts are enabled. * while interrupts are enabled.
*/ */
if ((State->IntStatus == FAST486_INT_EXECUTE) if (State->IntStatus == FAST486_INT_EXECUTE)
|| (State->Flags.If
&& (State->IntAckCallback != NULL)
&& (State->IntStatus == FAST486_INT_SIGNAL)))
{ {
FAST486_IDT_ENTRY IdtEntry; FAST486_IDT_ENTRY IdtEntry;
if (State->IntStatus == FAST486_INT_SIGNAL)
{
/* Acknowledge the interrupt to get the number */
State->PendingIntNum = State->IntAckCallback(State);
}
/* Get the interrupt vector */ /* Get the interrupt vector */
if (Fast486GetIntVector(State, State->PendingIntNum, &IdtEntry)) if (Fast486GetIntVector(State, State->PendingIntNum, &IdtEntry))
{ {
@ -89,6 +80,16 @@ Fast486ExecutionControl(PFAST486_STATE State, INT Command)
/* Clear the interrupt status */ /* Clear the interrupt status */
State->IntStatus = FAST486_INT_NONE; State->IntStatus = FAST486_INT_NONE;
} }
else if (State->Flags.If
&& (State->IntAckCallback != NULL)
&& (State->IntStatus == FAST486_INT_SIGNAL))
{
/* Acknowledge the interrupt to get the number */
State->PendingIntNum = State->IntAckCallback(State);
/* Set the interrupt status to execute on the next instruction */
State->IntStatus = FAST486_INT_EXECUTE;
}
} }
/* Perform an instruction fetch */ /* Perform an instruction fetch */

View file

@ -139,7 +139,7 @@ VOID WINAPI InitializeInt32(WORD BiosSegment)
{ {
IntVecTable[i] = MAKELONG(Offset, BiosSegment); IntVecTable[i] = MAKELONG(Offset, BiosSegment);
BiosCode[Offset++] = 0xFB; // sti BiosCode[Offset++] = 0xFA; // cli
BiosCode[Offset++] = 0x6A; // push i BiosCode[Offset++] = 0x6A; // push i
BiosCode[Offset++] = (UCHAR)i; BiosCode[Offset++] = (UCHAR)i;
@ -158,11 +158,13 @@ VOID WINAPI InitializeInt32(WORD BiosSegment)
BiosCode[Offset++] = 0x73; // jnc EXIT (offset +3) BiosCode[Offset++] = 0x73; // jnc EXIT (offset +3)
BiosCode[Offset++] = 0x03; BiosCode[Offset++] = 0x03;
BiosCode[Offset++] = 0xFB; // sti
// HACK: The following instruction should be HLT! // HACK: The following instruction should be HLT!
BiosCode[Offset++] = 0x90; // nop BiosCode[Offset++] = 0x90; // nop
BiosCode[Offset++] = 0xEB; // jmp BOP_SEQ (offset -10) BiosCode[Offset++] = 0xEB; // jmp BOP_SEQ (offset -10)
BiosCode[Offset++] = 0xF6; BiosCode[Offset++] = 0xF5;
// EXIT: // EXIT:
BiosCode[Offset++] = 0x83; // add sp, 4 BiosCode[Offset++] = 0x83; // add sp, 4