[FAST486]: group Fast486GetIntVector and Fast486InterruptInternal calls into Fast486PerformInterrupt and use it in the code.

svn path=/trunk/; revision=64672
This commit is contained in:
Hermès Bélusca-Maïto 2014-10-11 15:28:21 +00:00
parent beb08f639d
commit 1e5192c2b4
5 changed files with 82 additions and 95 deletions

View file

@ -160,6 +160,56 @@ Fast486WriteMemory(PFAST486_STATE State,
return Fast486WriteLinearMemory(State, LinearAddress, Buffer, Size);
}
static
inline
BOOLEAN
Fast486GetIntVector(PFAST486_STATE State,
UCHAR Number,
PFAST486_IDT_ENTRY IdtEntry)
{
ULONG FarPointer;
/* Check for protected mode */
if (State->ControlRegisters[FAST486_REG_CR0] & FAST486_CR0_PE)
{
/* Read from the IDT */
if (!Fast486ReadLinearMemory(State,
State->Idtr.Address
+ Number * sizeof(*IdtEntry),
IdtEntry,
sizeof(*IdtEntry)))
{
/* Exception occurred */
return FALSE;
}
}
else
{
/* Read from the real-mode IVT */
/* Paging is always disabled in real mode */
State->MemReadCallback(State,
State->Idtr.Address
+ Number * sizeof(FarPointer),
&FarPointer,
sizeof(FarPointer));
/* Fill a fake IDT entry */
IdtEntry->Offset = LOWORD(FarPointer);
IdtEntry->Selector = HIWORD(FarPointer);
IdtEntry->Zero = 0;
IdtEntry->Type = FAST486_IDT_INT_GATE;
IdtEntry->Storage = FALSE;
IdtEntry->Dpl = 0;
IdtEntry->Present = TRUE;
IdtEntry->OffsetHigh = 0;
}
return TRUE;
}
static
inline
BOOLEAN
Fast486InterruptInternal(PFAST486_STATE State,
USHORT SegmentSelector,
@ -304,14 +354,38 @@ Cleanup:
return Success;
}
BOOLEAN
Fast486PerformInterrupt(PFAST486_STATE State,
UCHAR Number)
{
FAST486_IDT_ENTRY IdtEntry;
/* Get the interrupt vector */
if (!Fast486GetIntVector(State, Number, &IdtEntry))
{
/* Exception occurred */
return FALSE;
}
/* Perform the interrupt */
if (!Fast486InterruptInternal(State,
IdtEntry.Selector,
MAKELONG(IdtEntry.Offset, IdtEntry.OffsetHigh),
IdtEntry.Type))
{
/* Exception occurred */
return FALSE;
}
return TRUE;
}
VOID
FASTCALL
Fast486ExceptionWithErrorCode(PFAST486_STATE State,
FAST486_EXCEPTIONS ExceptionCode,
ULONG ErrorCode)
{
FAST486_IDT_ENTRY IdtEntry;
/* Increment the exception count */
State->ExceptionCount++;
@ -337,20 +411,8 @@ Fast486ExceptionWithErrorCode(PFAST486_STATE State,
/* Restore the IP to the saved IP */
State->InstPtr = State->SavedInstPtr;
if (!Fast486GetIntVector(State, ExceptionCode, &IdtEntry))
{
/*
* If this function failed, that means Fast486Exception
* was called again, so just return in this case.
*/
return;
}
/* Perform the interrupt */
if (!Fast486InterruptInternal(State,
IdtEntry.Selector,
MAKELONG(IdtEntry.Offset, IdtEntry.OffsetHigh),
IdtEntry.Type))
if (!Fast486PerformInterrupt(State, ExceptionCode))
{
/*
* If this function failed, that means Fast486Exception

View file

@ -154,12 +154,10 @@ Fast486WriteMemory
);
BOOLEAN
Fast486InterruptInternal
Fast486PerformInterrupt
(
PFAST486_STATE State,
USHORT SegmentSelector,
ULONG Offset,
ULONG GateType
UCHAR Number
);
VOID

View file

@ -691,53 +691,6 @@ Fast486FetchDword(PFAST486_STATE State,
return TRUE;
}
FORCEINLINE
BOOLEAN
Fast486GetIntVector(PFAST486_STATE State,
UCHAR Number,
PFAST486_IDT_ENTRY IdtEntry)
{
ULONG FarPointer;
/* Check for protected mode */
if (State->ControlRegisters[FAST486_REG_CR0] & FAST486_CR0_PE)
{
/* Read from the IDT */
if (!Fast486ReadLinearMemory(State,
State->Idtr.Address
+ Number * sizeof(*IdtEntry),
IdtEntry,
sizeof(*IdtEntry)))
{
/* Exception occurred */
return FALSE;
}
}
else
{
/* Read from the real-mode IVT */
/* Paging is always disabled in real mode */
State->MemReadCallback(State,
State->Idtr.Address
+ Number * sizeof(FarPointer),
&FarPointer,
sizeof(FarPointer));
/* Fill a fake IDT entry */
IdtEntry->Offset = LOWORD(FarPointer);
IdtEntry->Selector = HIWORD(FarPointer);
IdtEntry->Zero = 0;
IdtEntry->Type = FAST486_IDT_INT_GATE;
IdtEntry->Storage = FALSE;
IdtEntry->Dpl = 0;
IdtEntry->Present = TRUE;
IdtEntry->OffsetHigh = 0;
}
return TRUE;
}
FORCEINLINE
BOOLEAN
Fast486CalculateParity(UCHAR Number)

View file

@ -93,17 +93,8 @@ Fast486ExecutionControl(PFAST486_STATE State, FAST486_EXEC_CMD Command)
*/
if (State->IntStatus == FAST486_INT_EXECUTE)
{
FAST486_IDT_ENTRY IdtEntry;
/* Get the interrupt vector */
if (Fast486GetIntVector(State, State->PendingIntNum, &IdtEntry))
{
/* Perform the interrupt */
Fast486InterruptInternal(State,
IdtEntry.Selector,
MAKELONG(IdtEntry.Offset, IdtEntry.OffsetHigh),
IdtEntry.Type);
}
/* Perform the interrupt */
Fast486PerformInterrupt(State, State->PendingIntNum);
/* Clear the interrupt status */
State->IntStatus = FAST486_INT_NONE;

View file

@ -4615,7 +4615,6 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeRetFar)
FAST486_OPCODE_HANDLER(Fast486OpcodeInt)
{
UCHAR IntNum;
FAST486_IDT_ENTRY IdtEntry;
switch (Opcode)
{
@ -4656,24 +4655,8 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeInt)
}
}
/* Get the interrupt vector */
if (!Fast486GetIntVector(State, IntNum, &IdtEntry))
{
/* Exception occurred */
return FALSE;
}
/* Perform the interrupt */
if (!Fast486InterruptInternal(State,
IdtEntry.Selector,
MAKELONG(IdtEntry.Offset, IdtEntry.OffsetHigh),
IdtEntry.Type))
{
/* Exception occurred */
return FALSE;
}
return TRUE;
return Fast486PerformInterrupt(State, IntNum);
}
FAST486_OPCODE_HANDLER(Fast486OpcodeIret)