[FAST486]

Read the LDT instead of the GDT when the table indicator is set.


svn path=/branches/ntvdm/; revision=61057
This commit is contained in:
Aleksandar Andrejevic 2013-11-20 10:48:26 +00:00
parent e2fb91925e
commit 459e3a6f48
2 changed files with 37 additions and 14 deletions

View file

@ -37,6 +37,7 @@
#define GET_SEGMENT_RPL(s) ((s) & 3) #define GET_SEGMENT_RPL(s) ((s) & 3)
#define GET_SEGMENT_INDEX(s) ((s) & 0xFFF8) #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 EXCEPTION_HAS_ERROR_CODE(x) (((x) == 8) || ((x) >= 10 && (x) <= 14))
#define NO_LOCK_PREFIX() if (State->PrefixFlags & FAST486_PREFIX_LOCK)\ #define NO_LOCK_PREFIX() if (State->PrefixFlags & FAST486_PREFIX_LOCK)\

View file

@ -399,22 +399,45 @@ Fast486LoadSegment(PFAST486_STATE State,
/* Check for protected mode */ /* Check for protected mode */
if ((State->ControlRegisters[FAST486_REG_CR0] & FAST486_CR0_PE) && !State->Flags.Vm) if ((State->ControlRegisters[FAST486_REG_CR0] & FAST486_CR0_PE) && !State->Flags.Vm)
{ {
/* Make sure the GDT contains the entry */ if (!(Selector & SEGMENT_TABLE_INDICATOR))
if (GET_SEGMENT_INDEX(Selector) >= (State->Gdtr.Size + 1))
{ {
Fast486Exception(State, FAST486_EXCEPTION_GP); /* Make sure the GDT contains the entry */
return FALSE; if (GET_SEGMENT_INDEX(Selector) >= (State->Gdtr.Size + 1))
} {
Fast486ExceptionWithErrorCode(State, FAST486_EXCEPTION_GP, Selector);
return FALSE;
}
/* Read the GDT */ /* Read the GDT */
if (!Fast486ReadLinearMemory(State, if (!Fast486ReadLinearMemory(State,
State->Gdtr.Address State->Gdtr.Address
+ GET_SEGMENT_INDEX(Selector), + GET_SEGMENT_INDEX(Selector),
&GdtEntry, &GdtEntry,
sizeof(GdtEntry))) sizeof(GdtEntry)))
{
/* Exception occurred */
return FALSE;
}
}
else
{ {
/* Exception occurred */ /* Make sure the LDT contains the entry */
return FALSE; 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) if (Segment == FAST486_REG_SS)
@ -503,7 +526,6 @@ Fast486LoadSegment(PFAST486_STATE State,
Fast486ExceptionWithErrorCode(State, FAST486_EXCEPTION_GP, Selector); Fast486ExceptionWithErrorCode(State, FAST486_EXCEPTION_GP, Selector);
return FALSE; return FALSE;
} }
} }
/* Update CPL */ /* Update CPL */