diff options
author | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2008-05-22 10:13:38 +0000 |
---|---|---|
committer | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2008-05-22 10:13:38 +0000 |
commit | 12e26b75d49adbd69ce5f00659f5c51d19d45304 (patch) | |
tree | b4a9b8cc02ba542677f623eea172377bcb099e05 /target-i386/translate.c | |
parent | 1b9d9ebb8a2efb780365214313625b7d717bca83 (diff) |
lahf/sahf cpuid test
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4523 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'target-i386/translate.c')
-rw-r--r-- | target-i386/translate.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/target-i386/translate.c b/target-i386/translate.c index 6e55930131..04db898b49 100644 --- a/target-i386/translate.c +++ b/target-i386/translate.c @@ -103,6 +103,7 @@ typedef struct DisasContext { int cpuid_features; int cpuid_ext_features; int cpuid_ext2_features; + int cpuid_ext3_features; } DisasContext; static void gen_eob(DisasContext *s); @@ -5829,7 +5830,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) } break; case 0x9e: /* sahf */ - if (CODE64(s)) + if (CODE64(s) && !(s->cpuid_ext3_features & CPUID_EXT3_LAHF_LM)) goto illegal_op; gen_op_mov_TN_reg(OT_BYTE, 0, R_AH); if (s->cc_op != CC_OP_DYNAMIC) @@ -5841,7 +5842,7 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) s->cc_op = CC_OP_EFLAGS; break; case 0x9f: /* lahf */ - if (CODE64(s)) + if (CODE64(s) && !(s->cpuid_ext3_features & CPUID_EXT3_LAHF_LM)) goto illegal_op; if (s->cc_op != CC_OP_DYNAMIC) gen_op_set_cc_op(s->cc_op); @@ -7058,6 +7059,7 @@ static inline int gen_intermediate_code_internal(CPUState *env, dc->cpuid_features = env->cpuid_features; dc->cpuid_ext_features = env->cpuid_ext_features; dc->cpuid_ext2_features = env->cpuid_ext2_features; + dc->cpuid_ext3_features = env->cpuid_ext3_features; #ifdef TARGET_X86_64 dc->lma = (flags >> HF_LMA_SHIFT) & 1; dc->code64 = (flags >> HF_CS64_SHIFT) & 1; |