Commit 0fd14b72ac91516a0415f626d632ffa86f1e1a05

Authored by bellard
1 parent 7fb843f8

fxsave/fxrstor fix


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1738 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 12 additions and 2 deletions
target-i386/translate.c
... ... @@ -5803,14 +5803,24 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start)
5803 5803 op = (modrm >> 3) & 7;
5804 5804 switch(op) {
5805 5805 case 0: /* fxsave */
5806   - if (mod == 3 || !(s->cpuid_features & CPUID_FXSR))
  5806 + if (mod == 3 || !(s->cpuid_features & CPUID_FXSR) ||
  5807 + (s->flags & HF_EM_MASK))
5807 5808 goto illegal_op;
  5809 + if (s->flags & HF_TS_MASK) {
  5810 + gen_exception(s, EXCP07_PREX, pc_start - s->cs_base);
  5811 + break;
  5812 + }
5808 5813 gen_lea_modrm(s, modrm, &reg_addr, &offset_addr);
5809 5814 gen_op_fxsave_A0((s->dflag == 2));
5810 5815 break;
5811 5816 case 1: /* fxrstor */
5812   - if (mod == 3 || !(s->cpuid_features & CPUID_FXSR))
  5817 + if (mod == 3 || !(s->cpuid_features & CPUID_FXSR) ||
  5818 + (s->flags & HF_EM_MASK))
5813 5819 goto illegal_op;
  5820 + if (s->flags & HF_TS_MASK) {
  5821 + gen_exception(s, EXCP07_PREX, pc_start - s->cs_base);
  5822 + break;
  5823 + }
5814 5824 gen_lea_modrm(s, modrm, &reg_addr, &offset_addr);
5815 5825 gen_op_fxrstor_A0((s->dflag == 2));
5816 5826 break;
... ...