target/i386/tcg: allow VEX in 16-bit protected mode
VEX is only forbidden in real and vm86 mode; 16-bit protected mode supports it for some unfathomable reason. Cc: qemu-stable@nongnu.org Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> (cherry picked from commit ed88bdcfbdcf9d411607cd690f93f915feff6a5b) Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
This commit is contained in:
parent
6594e50e7e
commit
11e286fb93
1 changed files with 3 additions and 7 deletions
|
|
@ -2613,20 +2613,16 @@ static void disas_insn(DisasContext *s, CPUState *cpu)
|
|||
case 0xc5: /* 2-byte VEX */
|
||||
case 0xc4: /* 3-byte VEX */
|
||||
/*
|
||||
* VEX prefixes cannot be used except in 32-bit mode.
|
||||
* Otherwise the instruction is LES or LDS.
|
||||
* Bits 6-7 of the first byte must be set except in 64-bit mode.
|
||||
* Otherwise the instruction is LES or LDS. Not allowed in real mode.
|
||||
*/
|
||||
if (CODE32(s) && !VM86(s)) {
|
||||
if (PE(s) && !VM86(s)) {
|
||||
static const int pp_prefix[4] = {
|
||||
0, PREFIX_DATA, PREFIX_REPZ, PREFIX_REPNZ
|
||||
};
|
||||
int vex3, vex2 = x86_ldub_code(env, s);
|
||||
|
||||
if (!CODE64(s) && (vex2 & 0xc0) != 0xc0) {
|
||||
/*
|
||||
* 4.1.4.6: In 32-bit mode, bits [7:6] must be 11b,
|
||||
* otherwise the instruction is LES or LDS.
|
||||
*/
|
||||
s->pc--; /* rewind the advance_pc() x86_ldub_code() did */
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue