Author: aandrejevic Date: Mon May 11 18:49:10 2015 New Revision: 67669
URL: http://svn.reactos.org/svn/reactos?rev=67669&view=rev Log: [FAST486] Duplicate prefixes don't generate #UD. Multiple segment overrides override each other, and so do REP and REPNZ.
Modified: trunk/reactos/lib/fast486/opcodes.c
Modified: trunk/reactos/lib/fast486/opcodes.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/fast486/opcodes.c?rev=6... ============================================================================== --- trunk/reactos/lib/fast486/opcodes.c [iso-8859-1] (original) +++ trunk/reactos/lib/fast486/opcodes.c [iso-8859-1] Mon May 11 18:49:10 2015 @@ -311,120 +311,74 @@
FAST486_OPCODE_HANDLER(Fast486OpcodePrefix) { - BOOLEAN Valid = FALSE; - switch (Opcode) { /* ES: */ case 0x26: { - if (!(State->PrefixFlags & FAST486_PREFIX_SEG)) - { - State->PrefixFlags |= FAST486_PREFIX_SEG; - State->SegmentOverride = FAST486_REG_ES; - Valid = TRUE; - } - + State->PrefixFlags |= FAST486_PREFIX_SEG; + State->SegmentOverride = FAST486_REG_ES; break; }
/* CS: */ case 0x2E: { - if (!(State->PrefixFlags & FAST486_PREFIX_SEG)) - { - State->PrefixFlags |= FAST486_PREFIX_SEG; - State->SegmentOverride = FAST486_REG_CS; - Valid = TRUE; - } - + State->PrefixFlags |= FAST486_PREFIX_SEG; + State->SegmentOverride = FAST486_REG_CS; break; }
/* SS: */ case 0x36: { - if (!(State->PrefixFlags & FAST486_PREFIX_SEG)) - { - State->PrefixFlags |= FAST486_PREFIX_SEG; - State->SegmentOverride = FAST486_REG_SS; - Valid = TRUE; - } - + State->PrefixFlags |= FAST486_PREFIX_SEG; + State->SegmentOverride = FAST486_REG_SS; break; }
/* DS: */ case 0x3E: { - if (!(State->PrefixFlags & FAST486_PREFIX_SEG)) - { - State->PrefixFlags |= FAST486_PREFIX_SEG; - State->SegmentOverride = FAST486_REG_DS; - Valid = TRUE; - } - + State->PrefixFlags |= FAST486_PREFIX_SEG; + State->SegmentOverride = FAST486_REG_DS; break; }
/* FS: */ case 0x64: { - if (!(State->PrefixFlags & FAST486_PREFIX_SEG)) - { - State->PrefixFlags |= FAST486_PREFIX_SEG; - State->SegmentOverride = FAST486_REG_FS; - Valid = TRUE; - } - + State->PrefixFlags |= FAST486_PREFIX_SEG; + State->SegmentOverride = FAST486_REG_FS; break; }
/* GS: */ case 0x65: { - if (!(State->PrefixFlags & FAST486_PREFIX_SEG)) - { - State->PrefixFlags |= FAST486_PREFIX_SEG; - State->SegmentOverride = FAST486_REG_GS; - Valid = TRUE; - } - + State->PrefixFlags |= FAST486_PREFIX_SEG; + State->SegmentOverride = FAST486_REG_GS; break; }
/* OPSIZE */ case 0x66: { - if (!(State->PrefixFlags & FAST486_PREFIX_OPSIZE)) - { - State->PrefixFlags |= FAST486_PREFIX_OPSIZE; - Valid = TRUE; - } - + State->PrefixFlags |= FAST486_PREFIX_OPSIZE; break; }
/* ADSIZE */ case 0x67: { - if (!(State->PrefixFlags & FAST486_PREFIX_ADSIZE)) - { - State->PrefixFlags |= FAST486_PREFIX_ADSIZE; - Valid = TRUE; - } + State->PrefixFlags |= FAST486_PREFIX_ADSIZE; break; }
/* LOCK */ case 0xF0: { - if (!(State->PrefixFlags & FAST486_PREFIX_LOCK)) - { - State->PrefixFlags |= FAST486_PREFIX_LOCK; - Valid = TRUE; - } - + State->PrefixFlags |= FAST486_PREFIX_LOCK; break; }
@@ -432,13 +386,8 @@ case 0xF2: { /* Mutually exclusive with REP */ - if (!(State->PrefixFlags - & (FAST486_PREFIX_REPNZ | FAST486_PREFIX_REP))) - { - State->PrefixFlags |= FAST486_PREFIX_REPNZ; - Valid = TRUE; - } - + State->PrefixFlags |= FAST486_PREFIX_REPNZ; + State->PrefixFlags &= ~FAST486_PREFIX_REP; break; }
@@ -446,24 +395,16 @@ case 0xF3: { /* Mutually exclusive with REPNZ */ - if (!(State->PrefixFlags - & (FAST486_PREFIX_REPNZ | FAST486_PREFIX_REP))) - { - State->PrefixFlags |= FAST486_PREFIX_REP; - Valid = TRUE; - } - + State->PrefixFlags |= FAST486_PREFIX_REP; + State->PrefixFlags &= ~FAST486_PREFIX_REPNZ; break; } - } - - if (!Valid) - { - /* Clear all prefixes */ - State->PrefixFlags = 0; - - /* Throw an exception */ - Fast486Exception(State, FAST486_EXCEPTION_UD); + + default: + { + /* Shouldn't happen */ + ASSERT(FALSE); + } } }