mirror of
https://github.com/reactos/reactos.git
synced 2025-04-20 20:36:35 +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
2 changed files with 37 additions and 14 deletions
|
@ -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)\
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in a new issue