diff --git a/lib/fast486/common.h b/lib/fast486/common.h index 76ec3f42d11..cc47a72491b 100644 --- a/lib/fast486/common.h +++ b/lib/fast486/common.h @@ -37,6 +37,7 @@ #define GET_SEGMENT_RPL(s) ((s) & 3) #define GET_SEGMENT_INDEX(s) ((s) & 0xFFF8) +#define SEGMENT_TABLE_INDICATOR (1 << 2) #define EXCEPTION_HAS_ERROR_CODE(x) (((x) == 8) || ((x) >= 10 && (x) <= 14)) #define NO_LOCK_PREFIX() if (State->PrefixFlags & FAST486_PREFIX_LOCK)\ diff --git a/lib/fast486/common.inl b/lib/fast486/common.inl index 3883ad900dc..4e845768776 100644 --- a/lib/fast486/common.inl +++ b/lib/fast486/common.inl @@ -399,22 +399,45 @@ Fast486LoadSegment(PFAST486_STATE State, /* Check for protected mode */ if ((State->ControlRegisters[FAST486_REG_CR0] & FAST486_CR0_PE) && !State->Flags.Vm) { - /* Make sure the GDT contains the entry */ - if (GET_SEGMENT_INDEX(Selector) >= (State->Gdtr.Size + 1)) + if (!(Selector & SEGMENT_TABLE_INDICATOR)) { - Fast486Exception(State, FAST486_EXCEPTION_GP); - return FALSE; - } + /* Make sure the GDT contains the entry */ + if (GET_SEGMENT_INDEX(Selector) >= (State->Gdtr.Size + 1)) + { + Fast486ExceptionWithErrorCode(State, FAST486_EXCEPTION_GP, Selector); + return FALSE; + } - /* Read the GDT */ - if (!Fast486ReadLinearMemory(State, - State->Gdtr.Address - + GET_SEGMENT_INDEX(Selector), - &GdtEntry, - sizeof(GdtEntry))) + /* Read the GDT */ + if (!Fast486ReadLinearMemory(State, + State->Gdtr.Address + + GET_SEGMENT_INDEX(Selector), + &GdtEntry, + sizeof(GdtEntry))) + { + /* Exception occurred */ + return FALSE; + } + } + else { - /* Exception occurred */ - return FALSE; + /* Make sure the LDT contains the entry */ + if (GET_SEGMENT_INDEX(Selector) >= (State->Ldtr.Size + 1)) + { + Fast486ExceptionWithErrorCode(State, FAST486_EXCEPTION_GP, Selector); + return FALSE; + } + + /* Read the LDT */ + if (!Fast486ReadLinearMemory(State, + State->Ldtr.Address + + GET_SEGMENT_INDEX(Selector), + &GdtEntry, + sizeof(GdtEntry))) + { + /* Exception occurred */ + return FALSE; + } } if (Segment == FAST486_REG_SS) @@ -503,7 +526,6 @@ Fast486LoadSegment(PFAST486_STATE State, Fast486ExceptionWithErrorCode(State, FAST486_EXCEPTION_GP, Selector); return FALSE; } - } /* Update CPL */