From fd56d45e197bfa72a5d2cd67d67ebd92e6081325 Mon Sep 17 00:00:00 2001 From: Rudolf Marek Date: Sun, 11 Nov 2018 08:41:02 -0500 Subject: [PATCH] target/i386: Clear RF on SYSCALL instruction Fix the SYSCALL instruction in 64-bit (long mode). The RF flag should be cleared in R11 as well as in the RFLAGS. Intel and AMD CPUs behave same. AMD has this documented in the APM vol 3. Backports commit 1a1435dd61e28c1e3b70971107d72a7d05b28d03 from qemu --- qemu/target/i386/seg_helper.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qemu/target/i386/seg_helper.c b/qemu/target/i386/seg_helper.c index ee5f99fa..fa6063b7 100644 --- a/qemu/target/i386/seg_helper.c +++ b/qemu/target/i386/seg_helper.c @@ -990,11 +990,11 @@ void helper_syscall(CPUX86State *env, int next_eip_addend) int code64; env->regs[R_ECX] = env->eip + next_eip_addend; - env->regs[11] = cpu_compute_eflags(env); + env->regs[11] = cpu_compute_eflags(env) & ~RF_MASK; code64 = env->hflags & HF_CS64_MASK; - env->eflags &= ~env->fmask; + env->eflags &= ~(env->fmask | RF_MASK); cpu_load_eflags(env, env->eflags, 0); cpu_x86_load_seg_cache(env, R_CS, selector & 0xfffc, 0, 0xffffffff,