x86: properly reset prefixPresent for prefix0/1 group
This commit is contained in:
parent
dab17fd0b1
commit
eb2f3fb85a
|
@ -423,42 +423,81 @@ static int readPrefixes(struct InternalInstruction* insn)
|
||||||
switch (byte) {
|
switch (byte) {
|
||||||
case 0xf2: /* REPNE/REPNZ */
|
case 0xf2: /* REPNE/REPNZ */
|
||||||
case 0xf3: /* REP or REPE/REPZ */
|
case 0xf3: /* REP or REPE/REPZ */
|
||||||
|
case 0xf0: /* LOCK */
|
||||||
// only accept the last prefix
|
// only accept the last prefix
|
||||||
insn->prefixPresent[0xf2] = 0;
|
insn->prefixPresent[0xf2] = 0;
|
||||||
insn->prefixPresent[0xf3] = 0;
|
insn->prefixPresent[0xf3] = 0;
|
||||||
case 0xf0: /* LOCK */
|
insn->prefixPresent[0xf0] = 0;
|
||||||
setPrefixPresent(insn, byte, prefixLocation);
|
setPrefixPresent(insn, byte, prefixLocation);
|
||||||
insn->prefix0 = byte;
|
insn->prefix0 = byte;
|
||||||
break;
|
break;
|
||||||
case 0x2e: /* CS segment override -OR- Branch not taken */
|
case 0x2e: /* CS segment override -OR- Branch not taken */
|
||||||
case 0x36: /* SS segment override -OR- Branch taken */
|
|
||||||
case 0x3e: /* DS segment override */
|
|
||||||
case 0x26: /* ES segment override */
|
|
||||||
case 0x64: /* FS segment override */
|
|
||||||
case 0x65: /* GS segment override */
|
|
||||||
switch (byte) {
|
|
||||||
case 0x2e:
|
|
||||||
insn->segmentOverride = SEG_OVERRIDE_CS;
|
insn->segmentOverride = SEG_OVERRIDE_CS;
|
||||||
|
// only accept the last prefix
|
||||||
|
insn->prefixPresent[0x2e] = 0;
|
||||||
|
insn->prefixPresent[0x36] = 0;
|
||||||
|
insn->prefixPresent[0x3e] = 0;
|
||||||
|
insn->prefixPresent[0x26] = 0;
|
||||||
|
insn->prefixPresent[0x64] = 0;
|
||||||
|
insn->prefixPresent[0x65] = 0;
|
||||||
|
|
||||||
|
setPrefixPresent(insn, byte, prefixLocation);
|
||||||
|
insn->prefix1 = byte;
|
||||||
break;
|
break;
|
||||||
case 0x36:
|
case 0x36: /* SS segment override -OR- Branch taken */
|
||||||
insn->segmentOverride = SEG_OVERRIDE_SS;
|
insn->segmentOverride = SEG_OVERRIDE_SS;
|
||||||
|
// only accept the last prefix
|
||||||
|
insn->prefixPresent[0x2e] = 0;
|
||||||
|
insn->prefixPresent[0x36] = 0;
|
||||||
|
insn->prefixPresent[0x3e] = 0;
|
||||||
|
insn->prefixPresent[0x26] = 0;
|
||||||
|
insn->prefixPresent[0x64] = 0;
|
||||||
|
insn->prefixPresent[0x65] = 0;
|
||||||
|
|
||||||
|
setPrefixPresent(insn, byte, prefixLocation);
|
||||||
|
insn->prefix1 = byte;
|
||||||
break;
|
break;
|
||||||
case 0x3e:
|
case 0x3e: /* DS segment override */
|
||||||
insn->segmentOverride = SEG_OVERRIDE_DS;
|
insn->segmentOverride = SEG_OVERRIDE_DS;
|
||||||
|
// only accept the last prefix
|
||||||
|
insn->prefixPresent[0x2e] = 0;
|
||||||
|
insn->prefixPresent[0x36] = 0;
|
||||||
|
insn->prefixPresent[0x3e] = 0;
|
||||||
|
insn->prefixPresent[0x26] = 0;
|
||||||
|
insn->prefixPresent[0x64] = 0;
|
||||||
|
insn->prefixPresent[0x65] = 0;
|
||||||
|
|
||||||
|
setPrefixPresent(insn, byte, prefixLocation);
|
||||||
|
insn->prefix1 = byte;
|
||||||
break;
|
break;
|
||||||
case 0x26:
|
case 0x26: /* ES segment override */
|
||||||
insn->segmentOverride = SEG_OVERRIDE_ES;
|
insn->segmentOverride = SEG_OVERRIDE_ES;
|
||||||
|
// only accept the last prefix
|
||||||
|
insn->prefixPresent[0x2e] = 0;
|
||||||
|
insn->prefixPresent[0x36] = 0;
|
||||||
|
insn->prefixPresent[0x3e] = 0;
|
||||||
|
insn->prefixPresent[0x26] = 0;
|
||||||
|
insn->prefixPresent[0x64] = 0;
|
||||||
|
insn->prefixPresent[0x65] = 0;
|
||||||
|
|
||||||
|
setPrefixPresent(insn, byte, prefixLocation);
|
||||||
|
insn->prefix1 = byte;
|
||||||
break;
|
break;
|
||||||
case 0x64:
|
case 0x64: /* FS segment override */
|
||||||
insn->segmentOverride = SEG_OVERRIDE_FS;
|
insn->segmentOverride = SEG_OVERRIDE_FS;
|
||||||
|
// only accept the last prefix
|
||||||
|
insn->prefixPresent[0x2e] = 0;
|
||||||
|
insn->prefixPresent[0x36] = 0;
|
||||||
|
insn->prefixPresent[0x3e] = 0;
|
||||||
|
insn->prefixPresent[0x26] = 0;
|
||||||
|
insn->prefixPresent[0x64] = 0;
|
||||||
|
insn->prefixPresent[0x65] = 0;
|
||||||
|
|
||||||
|
setPrefixPresent(insn, byte, prefixLocation);
|
||||||
|
insn->prefix1 = byte;
|
||||||
break;
|
break;
|
||||||
case 0x65:
|
case 0x65: /* GS segment override */
|
||||||
insn->segmentOverride = SEG_OVERRIDE_GS;
|
insn->segmentOverride = SEG_OVERRIDE_GS;
|
||||||
break;
|
|
||||||
default:
|
|
||||||
//debug("Unhandled override");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
// only accept the last prefix
|
// only accept the last prefix
|
||||||
insn->prefixPresent[0x2e] = 0;
|
insn->prefixPresent[0x2e] = 0;
|
||||||
insn->prefixPresent[0x36] = 0;
|
insn->prefixPresent[0x36] = 0;
|
||||||
|
|
Loading…
Reference in New Issue