From 4cd5fa3811315ac5df1f20d42d628a180eafce15 Mon Sep 17 00:00:00 2001 From: mothran Date: Sun, 30 Aug 2015 18:56:55 -0700 Subject: [PATCH] fpip x64 fxsave working with using hflags to check CPU mode --- qemu/target-i386/fpu_helper.c | 44 ++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/qemu/target-i386/fpu_helper.c b/qemu/target-i386/fpu_helper.c index ea0c1fca..12d7710c 100644 --- a/qemu/target-i386/fpu_helper.c +++ b/qemu/target-i386/fpu_helper.c @@ -986,25 +986,41 @@ void helper_fstenv(CPUX86State *env, target_ulong ptr, int data32) } } } - if (data32) { - /* 32 bit */ +#ifdef TARGET_X86_64 + // DFLAG enum: tcg.h, case here to int + if (env->hflags & HF_CS64_MASK) { + printf("HELLO\n"); cpu_stl_data(env, ptr, env->fpuc); cpu_stl_data(env, ptr + 4, fpus); cpu_stl_data(env, ptr + 8, fptag); cpu_stl_data(env, ptr + 12, env->fpip); /* fpip */ - cpu_stl_data(env, ptr + 16, 0); /* fpcs */ - cpu_stl_data(env, ptr + 20, 0); /* fpoo */ - cpu_stl_data(env, ptr + 24, 0); /* fpos */ - } else { - /* 16 bit */ - cpu_stw_data(env, ptr, env->fpuc); - cpu_stw_data(env, ptr + 2, fpus); - cpu_stw_data(env, ptr + 4, fptag); - cpu_stw_data(env, ptr + 6, env->fpip); - cpu_stw_data(env, ptr + 8, 0); - cpu_stw_data(env, ptr + 10, 0); - cpu_stw_data(env, ptr + 12, 0); + cpu_stl_data(env, ptr + 20, 0); /* fpcs */ + cpu_stl_data(env, ptr + 24, 0); /* fpoo */ + cpu_stl_data(env, ptr + 28, 0); /* fpos */ } +#endif + if (!(env->hflags & HF_CS64_MASK)) + { + if (data32) { + /* 32 bit */ + cpu_stl_data(env, ptr, env->fpuc); + cpu_stl_data(env, ptr + 4, fpus); + cpu_stl_data(env, ptr + 8, fptag); + cpu_stl_data(env, ptr + 12, env->fpip); /* fpip */ + cpu_stl_data(env, ptr + 16, 0); /* fpcs */ + cpu_stl_data(env, ptr + 20, 0); /* fpoo */ + cpu_stl_data(env, ptr + 24, 0); /* fpos */ + } else { + /* 16 bit */ + cpu_stw_data(env, ptr, env->fpuc); + cpu_stw_data(env, ptr + 2, fpus); + cpu_stw_data(env, ptr + 4, fptag); + cpu_stw_data(env, ptr + 6, env->fpip); + cpu_stw_data(env, ptr + 8, 0); + cpu_stw_data(env, ptr + 10, 0); + cpu_stw_data(env, ptr + 12, 0); + } + } void helper_fldenv(CPUX86State *env, target_ulong ptr, int data32)