mirror of
https://github.com/qemu/qemu.git
synced 2024-12-04 01:03:38 +08:00
target/i386: implement undocumented "smsw r32" behavior
In 32-bit mode, the higher 16 bits of the destination register are undefined. In practice CR0[31:0] is stored, just like in 64-bit mode, so just remove the "if" that currently differentiates the behavior. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Reported-by: Roman Bolshakov <r.bolshakov@yadro.com> Reviewed-by: Roman Bolshakov <r.bolshakov@yadro.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
6c9cce1ff3
commit
c0c8445255
@ -7579,12 +7579,13 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
|
||||
CASE_MODRM_OP(4): /* smsw */
|
||||
gen_svm_check_intercept(s, pc_start, SVM_EXIT_READ_CR0);
|
||||
tcg_gen_ld_tl(s->T0, cpu_env, offsetof(CPUX86State, cr[0]));
|
||||
if (CODE64(s)) {
|
||||
mod = (modrm >> 6) & 3;
|
||||
ot = (mod != 3 ? MO_16 : s->dflag);
|
||||
} else {
|
||||
ot = MO_16;
|
||||
}
|
||||
/*
|
||||
* In 32-bit mode, the higher 16 bits of the destination
|
||||
* register are undefined. In practice CR0[31:0] is stored
|
||||
* just like in 64-bit mode.
|
||||
*/
|
||||
mod = (modrm >> 6) & 3;
|
||||
ot = (mod != 3 ? MO_16 : s->dflag);
|
||||
gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 1);
|
||||
break;
|
||||
case 0xee: /* rdpkru */
|
||||
|
Loading…
Reference in New Issue
Block a user