Commit e771edab0d9aaa7925dc26aec3e0c6eac27f19c3

Authored by aurel32
1 parent 27985df9

Check for 3DNow! CPUID at translation time


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4184 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 13 additions and 2 deletions
target-i386/translate.c
@@ -100,6 +100,7 @@ typedef struct DisasContext { @@ -100,6 +100,7 @@ typedef struct DisasContext {
100 int rip_offset; /* only used in x86_64, but left for simplicity */ 100 int rip_offset; /* only used in x86_64, but left for simplicity */
101 int cpuid_features; 101 int cpuid_features;
102 int cpuid_ext_features; 102 int cpuid_ext_features;
  103 + int cpuid_ext2_features;
103 } DisasContext; 104 } DisasContext;
104 105
105 static void gen_eob(DisasContext *s); 106 static void gen_eob(DisasContext *s);
@@ -2649,8 +2650,15 @@ static void gen_sse(DisasContext *s, int b, target_ulong pc_start, int rex_r) @@ -2649,8 +2650,15 @@ static void gen_sse(DisasContext *s, int b, target_ulong pc_start, int rex_r)
2649 } 2650 }
2650 if (is_xmm && !(s->flags & HF_OSFXSR_MASK)) 2651 if (is_xmm && !(s->flags & HF_OSFXSR_MASK))
2651 goto illegal_op; 2652 goto illegal_op;
2652 - if (b == 0x77 || b == 0x0e) {  
2653 - /* emms or femms */ 2653 + if (b == 0x0e) {
  2654 + if (!(s->cpuid_ext2_features & CPUID_EXT2_3DNOW))
  2655 + goto illegal_op;
  2656 + /* femms */
  2657 + gen_op_emms();
  2658 + return;
  2659 + }
  2660 + if (b == 0x77) {
  2661 + /* emms */
2654 gen_op_emms(); 2662 gen_op_emms();
2655 return; 2663 return;
2656 } 2664 }
@@ -3183,6 +3191,8 @@ static void gen_sse(DisasContext *s, int b, target_ulong pc_start, int rex_r) @@ -3183,6 +3191,8 @@ static void gen_sse(DisasContext *s, int b, target_ulong pc_start, int rex_r)
3183 } 3191 }
3184 switch(b) { 3192 switch(b) {
3185 case 0x0f: /* 3DNow! data insns */ 3193 case 0x0f: /* 3DNow! data insns */
  3194 + if (!(s->cpuid_ext2_features & CPUID_EXT2_3DNOW))
  3195 + goto illegal_op;
3186 val = ldub_code(s->pc++); 3196 val = ldub_code(s->pc++);
3187 sse_op2 = sse_op_table5[val]; 3197 sse_op2 = sse_op_table5[val];
3188 if (!sse_op2) 3198 if (!sse_op2)
@@ -6757,6 +6767,7 @@ static inline int gen_intermediate_code_internal(CPUState *env, @@ -6757,6 +6767,7 @@ static inline int gen_intermediate_code_internal(CPUState *env,
6757 } 6767 }
6758 dc->cpuid_features = env->cpuid_features; 6768 dc->cpuid_features = env->cpuid_features;
6759 dc->cpuid_ext_features = env->cpuid_ext_features; 6769 dc->cpuid_ext_features = env->cpuid_ext_features;
  6770 + dc->cpuid_ext2_features = env->cpuid_ext2_features;
6760 #ifdef TARGET_X86_64 6771 #ifdef TARGET_X86_64
6761 dc->lma = (flags >> HF_LMA_SHIFT) & 1; 6772 dc->lma = (flags >> HF_LMA_SHIFT) & 1;
6762 dc->code64 = (flags >> HF_CS64_SHIFT) & 1; 6773 dc->code64 = (flags >> HF_CS64_SHIFT) & 1;