[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_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)\

View file

@ -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 */