{
/* We can't prefetch without possibly violating page permissions */
State->PrefetchValid = FALSE;
- return Fast486ReadLinearMemory(State, LinearAddress, Buffer, Size);
+ return Fast486ReadLinearMemory(State, LinearAddress, Buffer, Size, TRUE);
}
}
if (Fast486ReadLinearMemory(State,
State->PrefetchAddress,
State->PrefetchCache,
- FAST486_CACHE_SIZE))
+ FAST486_CACHE_SIZE,
+ TRUE))
{
State->PrefetchValid = TRUE;
#endif
{
/* Read from the linear address */
- return Fast486ReadLinearMemory(State, LinearAddress, Buffer, Size);
+ return Fast486ReadLinearMemory(State, LinearAddress, Buffer, Size, TRUE);
}
}
#endif
/* Write to the linear address */
- return Fast486WriteLinearMemory(State, LinearAddress, Buffer, Size);
+ return Fast486WriteLinearMemory(State, LinearAddress, Buffer, Size, TRUE);
}
static inline BOOLEAN
State->Idtr.Address
+ Number * sizeof(*IdtEntry),
IdtEntry,
- sizeof(*IdtEntry)))
+ sizeof(*IdtEntry),
+ FALSE))
{
/* Exception occurred */
return FALSE;
State->TaskReg.Base,
&Tss,
State->TaskReg.Limit >= sizeof(FAST486_TSS)
- ? sizeof(FAST486_TSS) : sizeof(FAST486_LEGACY_TSS)))
+ ? sizeof(FAST486_TSS) : sizeof(FAST486_LEGACY_TSS),
+ FALSE))
{
/* Exception occurred */
return FALSE;
State->TaskReg.Base,
&OldTss,
State->TaskReg.Limit >= sizeof(FAST486_TSS)
- ? sizeof(FAST486_TSS) : sizeof(FAST486_LEGACY_TSS)))
+ ? sizeof(FAST486_TSS) : sizeof(FAST486_LEGACY_TSS),
+ FALSE))
{
/* Exception occurred */
return FALSE;
if (!Fast486ReadLinearMemory(State,
State->Gdtr.Address + GET_SEGMENT_INDEX(Selector),
&NewTssDescriptor,
- sizeof(NewTssDescriptor)))
+ sizeof(NewTssDescriptor),
+ FALSE))
{
/* Exception occurred */
return FALSE;
NewTssAddress,
&NewTss,
NewTssLimit >= sizeof(FAST486_TSS)
- ? sizeof(FAST486_TSS) : sizeof(FAST486_LEGACY_TSS)))
+ ? sizeof(FAST486_TSS) : sizeof(FAST486_LEGACY_TSS),
+ FALSE))
{
/* Exception occurred */
return FALSE;
State->Gdtr.Address
+ GET_SEGMENT_INDEX(State->TaskReg.Selector),
&OldTssDescriptor,
- sizeof(OldTssDescriptor)))
+ sizeof(OldTssDescriptor),
+ FALSE))
{
/* Exception occurred */
return FALSE;
State->Gdtr.Address
+ GET_SEGMENT_INDEX(State->TaskReg.Selector),
&OldTssDescriptor,
- sizeof(OldTssDescriptor)))
+ sizeof(OldTssDescriptor),
+ FALSE))
{
/* Exception occurred */
return FALSE;
State->TaskReg.Base,
&OldTss,
State->TaskReg.Limit >= sizeof(FAST486_TSS)
- ? sizeof(FAST486_TSS) : sizeof(FAST486_LEGACY_TSS)))
+ ? sizeof(FAST486_TSS) : sizeof(FAST486_LEGACY_TSS),
+ FALSE))
{
/* Exception occurred */
return FALSE;
if (!Fast486WriteLinearMemory(State,
State->Gdtr.Address + GET_SEGMENT_INDEX(Selector),
&NewTssDescriptor,
- sizeof(NewTssDescriptor)))
+ sizeof(NewTssDescriptor),
+ FALSE))
{
/* Exception occurred */
return FALSE;
State->TaskReg.Base,
&Tss,
State->TaskReg.Limit >= sizeof(FAST486_TSS)
- ? sizeof(FAST486_TSS) : sizeof(FAST486_LEGACY_TSS)))
+ ? sizeof(FAST486_TSS) : sizeof(FAST486_LEGACY_TSS),
+ FALSE))
{
/* Exception occurred */
return FALSE;
Fast486ReadLinearMemory(PFAST486_STATE State,
ULONG LinearAddress,
PVOID Buffer,
- ULONG Size)
+ ULONG Size,
+ BOOLEAN CheckPrivilege)
{
/* Check if paging is enabled */
if (State->ControlRegisters[FAST486_REG_CR0] & FAST486_CR0_PG)
PageLength -= PageOffset;
}
- if (!TableEntry.Present || (!TableEntry.Usermode && (Cpl > 0)))
+ if (CheckPrivilege && (!TableEntry.Present || (!TableEntry.Usermode && (Cpl > 0))))
{
State->ControlRegisters[FAST486_REG_CR2] = Page + PageOffset;
Fast486WriteLinearMemory(PFAST486_STATE State,
ULONG LinearAddress,
PVOID Buffer,
- ULONG Size)
+ ULONG Size,
+ BOOLEAN CheckPrivilege)
{
/* Check if paging is enabled */
if (State->ControlRegisters[FAST486_REG_CR0] & FAST486_CR0_PG)
PageLength -= PageOffset;
}
- if ((!TableEntry.Present || (!TableEntry.Usermode && (Cpl > 0)))
+ if (CheckPrivilege
+ && ((!TableEntry.Present || (!TableEntry.Usermode && (Cpl > 0)))
|| ((State->ControlRegisters[FAST486_REG_CR0] & FAST486_CR0_WP)
- && !TableEntry.Writeable))
+ && !TableEntry.Writeable)))
{
State->ControlRegisters[FAST486_REG_CR2] = Page + PageOffset;
State->Gdtr.Address
+ GET_SEGMENT_INDEX(Selector),
Entry,
- sizeof(*Entry)))
+ sizeof(*Entry),
+ FALSE))
{
/* Exception occurred */
*EntryValid = FALSE;
State->Ldtr.Base
+ GET_SEGMENT_INDEX(Selector),
Entry,
- sizeof(*Entry)))
+ sizeof(*Entry),
+ FALSE))
{
/* Exception occurred */
*EntryValid = FALSE;