mirror of
https://github.com/reactos/reactos.git
synced 2024-10-05 17:06:29 +00:00
[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:
parent
e2fb91925e
commit
459e3a6f48
|
@ -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)\
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in a new issue