mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 00:45:24 +00:00
[FAST486]: group Fast486GetIntVector and Fast486InterruptInternal calls into Fast486PerformInterrupt and use it in the code.
svn path=/trunk/; revision=64672
This commit is contained in:
parent
beb08f639d
commit
1e5192c2b4
5 changed files with 82 additions and 95 deletions
|
@ -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
|
||||
|
|
|
@ -154,12 +154,10 @@ Fast486WriteMemory
|
|||
);
|
||||
|
||||
BOOLEAN
|
||||
Fast486InterruptInternal
|
||||
Fast486PerformInterrupt
|
||||
(
|
||||
PFAST486_STATE State,
|
||||
USHORT SegmentSelector,
|
||||
ULONG Offset,
|
||||
ULONG GateType
|
||||
UCHAR Number
|
||||
);
|
||||
|
||||
VOID
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue