From 1e5192c2b41a06bc85a5af161080af5a29acb2f6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sat, 11 Oct 2014 15:28:21 +0000 Subject: [PATCH] [FAST486]: group Fast486GetIntVector and Fast486InterruptInternal calls into Fast486PerformInterrupt and use it in the code. svn path=/trunk/; revision=64672 --- reactos/lib/fast486/common.c | 92 ++++++++++++++++++++++++++++------ reactos/lib/fast486/common.h | 6 +-- reactos/lib/fast486/common.inl | 47 ----------------- reactos/lib/fast486/fast486.c | 13 +---- reactos/lib/fast486/opcodes.c | 19 +------ 5 files changed, 82 insertions(+), 95 deletions(-) diff --git a/reactos/lib/fast486/common.c b/reactos/lib/fast486/common.c index 83c11e2da51..09a9c72f282 100644 --- a/reactos/lib/fast486/common.c +++ b/reactos/lib/fast486/common.c @@ -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 diff --git a/reactos/lib/fast486/common.h b/reactos/lib/fast486/common.h index 764dbbc664b..917db66a50e 100644 --- a/reactos/lib/fast486/common.h +++ b/reactos/lib/fast486/common.h @@ -154,12 +154,10 @@ Fast486WriteMemory ); BOOLEAN -Fast486InterruptInternal +Fast486PerformInterrupt ( PFAST486_STATE State, - USHORT SegmentSelector, - ULONG Offset, - ULONG GateType + UCHAR Number ); VOID diff --git a/reactos/lib/fast486/common.inl b/reactos/lib/fast486/common.inl index 7a28f9df99a..a2186edd7de 100644 --- a/reactos/lib/fast486/common.inl +++ b/reactos/lib/fast486/common.inl @@ -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) diff --git a/reactos/lib/fast486/fast486.c b/reactos/lib/fast486/fast486.c index 5195befb8e5..ccce63bec9a 100644 --- a/reactos/lib/fast486/fast486.c +++ b/reactos/lib/fast486/fast486.c @@ -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; diff --git a/reactos/lib/fast486/opcodes.c b/reactos/lib/fast486/opcodes.c index c4934c47d53..3202574b7ff 100644 --- a/reactos/lib/fast486/opcodes.c +++ b/reactos/lib/fast486/opcodes.c @@ -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) -- 2.17.1