mirror of
https://github.com/reactos/reactos.git
synced 2024-10-15 05:37:44 +00:00
[FAST486]
Duplicate prefixes don't generate #UD. Multiple segment overrides override each other, and so do REP and REPNZ. svn path=/trunk/; revision=67669
This commit is contained in:
parent
8d53d6c2bd
commit
07a731ed1c
|
@ -311,120 +311,74 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeInvalid)
|
||||||
|
|
||||||
FAST486_OPCODE_HANDLER(Fast486OpcodePrefix)
|
FAST486_OPCODE_HANDLER(Fast486OpcodePrefix)
|
||||||
{
|
{
|
||||||
BOOLEAN Valid = FALSE;
|
|
||||||
|
|
||||||
switch (Opcode)
|
switch (Opcode)
|
||||||
{
|
{
|
||||||
/* ES: */
|
/* ES: */
|
||||||
case 0x26:
|
case 0x26:
|
||||||
{
|
{
|
||||||
if (!(State->PrefixFlags & FAST486_PREFIX_SEG))
|
State->PrefixFlags |= FAST486_PREFIX_SEG;
|
||||||
{
|
State->SegmentOverride = FAST486_REG_ES;
|
||||||
State->PrefixFlags |= FAST486_PREFIX_SEG;
|
|
||||||
State->SegmentOverride = FAST486_REG_ES;
|
|
||||||
Valid = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* CS: */
|
/* CS: */
|
||||||
case 0x2E:
|
case 0x2E:
|
||||||
{
|
{
|
||||||
if (!(State->PrefixFlags & FAST486_PREFIX_SEG))
|
State->PrefixFlags |= FAST486_PREFIX_SEG;
|
||||||
{
|
State->SegmentOverride = FAST486_REG_CS;
|
||||||
State->PrefixFlags |= FAST486_PREFIX_SEG;
|
|
||||||
State->SegmentOverride = FAST486_REG_CS;
|
|
||||||
Valid = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SS: */
|
/* SS: */
|
||||||
case 0x36:
|
case 0x36:
|
||||||
{
|
{
|
||||||
if (!(State->PrefixFlags & FAST486_PREFIX_SEG))
|
State->PrefixFlags |= FAST486_PREFIX_SEG;
|
||||||
{
|
State->SegmentOverride = FAST486_REG_SS;
|
||||||
State->PrefixFlags |= FAST486_PREFIX_SEG;
|
|
||||||
State->SegmentOverride = FAST486_REG_SS;
|
|
||||||
Valid = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* DS: */
|
/* DS: */
|
||||||
case 0x3E:
|
case 0x3E:
|
||||||
{
|
{
|
||||||
if (!(State->PrefixFlags & FAST486_PREFIX_SEG))
|
State->PrefixFlags |= FAST486_PREFIX_SEG;
|
||||||
{
|
State->SegmentOverride = FAST486_REG_DS;
|
||||||
State->PrefixFlags |= FAST486_PREFIX_SEG;
|
|
||||||
State->SegmentOverride = FAST486_REG_DS;
|
|
||||||
Valid = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FS: */
|
/* FS: */
|
||||||
case 0x64:
|
case 0x64:
|
||||||
{
|
{
|
||||||
if (!(State->PrefixFlags & FAST486_PREFIX_SEG))
|
State->PrefixFlags |= FAST486_PREFIX_SEG;
|
||||||
{
|
State->SegmentOverride = FAST486_REG_FS;
|
||||||
State->PrefixFlags |= FAST486_PREFIX_SEG;
|
|
||||||
State->SegmentOverride = FAST486_REG_FS;
|
|
||||||
Valid = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* GS: */
|
/* GS: */
|
||||||
case 0x65:
|
case 0x65:
|
||||||
{
|
{
|
||||||
if (!(State->PrefixFlags & FAST486_PREFIX_SEG))
|
State->PrefixFlags |= FAST486_PREFIX_SEG;
|
||||||
{
|
State->SegmentOverride = FAST486_REG_GS;
|
||||||
State->PrefixFlags |= FAST486_PREFIX_SEG;
|
|
||||||
State->SegmentOverride = FAST486_REG_GS;
|
|
||||||
Valid = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* OPSIZE */
|
/* OPSIZE */
|
||||||
case 0x66:
|
case 0x66:
|
||||||
{
|
{
|
||||||
if (!(State->PrefixFlags & FAST486_PREFIX_OPSIZE))
|
State->PrefixFlags |= FAST486_PREFIX_OPSIZE;
|
||||||
{
|
|
||||||
State->PrefixFlags |= FAST486_PREFIX_OPSIZE;
|
|
||||||
Valid = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ADSIZE */
|
/* ADSIZE */
|
||||||
case 0x67:
|
case 0x67:
|
||||||
{
|
{
|
||||||
if (!(State->PrefixFlags & FAST486_PREFIX_ADSIZE))
|
State->PrefixFlags |= FAST486_PREFIX_ADSIZE;
|
||||||
{
|
|
||||||
State->PrefixFlags |= FAST486_PREFIX_ADSIZE;
|
|
||||||
Valid = TRUE;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* LOCK */
|
/* LOCK */
|
||||||
case 0xF0:
|
case 0xF0:
|
||||||
{
|
{
|
||||||
if (!(State->PrefixFlags & FAST486_PREFIX_LOCK))
|
State->PrefixFlags |= FAST486_PREFIX_LOCK;
|
||||||
{
|
|
||||||
State->PrefixFlags |= FAST486_PREFIX_LOCK;
|
|
||||||
Valid = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -432,13 +386,8 @@ FAST486_OPCODE_HANDLER(Fast486OpcodePrefix)
|
||||||
case 0xF2:
|
case 0xF2:
|
||||||
{
|
{
|
||||||
/* Mutually exclusive with REP */
|
/* Mutually exclusive with REP */
|
||||||
if (!(State->PrefixFlags
|
State->PrefixFlags |= FAST486_PREFIX_REPNZ;
|
||||||
& (FAST486_PREFIX_REPNZ | FAST486_PREFIX_REP)))
|
State->PrefixFlags &= ~FAST486_PREFIX_REP;
|
||||||
{
|
|
||||||
State->PrefixFlags |= FAST486_PREFIX_REPNZ;
|
|
||||||
Valid = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -446,24 +395,16 @@ FAST486_OPCODE_HANDLER(Fast486OpcodePrefix)
|
||||||
case 0xF3:
|
case 0xF3:
|
||||||
{
|
{
|
||||||
/* Mutually exclusive with REPNZ */
|
/* Mutually exclusive with REPNZ */
|
||||||
if (!(State->PrefixFlags
|
State->PrefixFlags |= FAST486_PREFIX_REP;
|
||||||
& (FAST486_PREFIX_REPNZ | FAST486_PREFIX_REP)))
|
State->PrefixFlags &= ~FAST486_PREFIX_REPNZ;
|
||||||
{
|
|
||||||
State->PrefixFlags |= FAST486_PREFIX_REP;
|
|
||||||
Valid = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (!Valid)
|
default:
|
||||||
{
|
{
|
||||||
/* Clear all prefixes */
|
/* Shouldn't happen */
|
||||||
State->PrefixFlags = 0;
|
ASSERT(FALSE);
|
||||||
|
}
|
||||||
/* Throw an exception */
|
|
||||||
Fast486Exception(State, FAST486_EXCEPTION_UD);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue