Revision 997ff0d9 target-i386/op_helper.c

b/target-i386/op_helper.c
51 51
    }
52 52
}
53 53

  
54
static inline uint32_t compute_eflags(void)
54
static inline uint32_t cpu_compute_eflags(CPUX86State *env)
55 55
{
56
    return env->eflags | helper_cc_compute_all(CC_OP) | (DF & DF_MASK);
56
    return env->eflags | cpu_cc_compute_all(env, CC_OP) | (DF & DF_MASK);
57 57
}
58 58

  
59 59
/* NOTE: CC_OP must be modified manually to CC_OP_EFLAGS */
60
static inline void load_eflags(int eflags, int update_mask)
60
static inline void cpu_load_eflags(CPUX86State *env, int eflags,
61
                                   int update_mask)
61 62
{
62 63
    CC_SRC = eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
63 64
    DF = 1 - (2 * ((eflags >> 10) & 1));
......
146 147

  
147 148
void helper_write_eflags(target_ulong t0, uint32_t update_mask)
148 149
{
149
    load_eflags(t0, update_mask);
150
    cpu_load_eflags(env, t0, update_mask);
150 151
}
151 152

  
152 153
target_ulong helper_read_eflags(void)
......
435 436
        e2 &= ~DESC_TSS_BUSY_MASK;
436 437
        stl_kernel(ptr + 4, e2);
437 438
    }
438
    old_eflags = compute_eflags();
439
    old_eflags = cpu_compute_eflags(env);
439 440
    if (source == SWITCH_TSS_IRET) {
440 441
        old_eflags &= ~NT_MASK;
441 442
    }
......
513 514
    if (!(type & 8)) {
514 515
        eflags_mask &= 0xffff;
515 516
    }
516
    load_eflags(new_eflags, eflags_mask);
517
    cpu_load_eflags(env, new_eflags, eflags_mask);
517 518
    /* XXX: what to do in 16 bit case? */
518 519
    EAX = new_regs[0];
519 520
    ECX = new_regs[1];
......
900 901
            PUSHL(ssp, esp, sp_mask, env->segs[R_SS].selector);
901 902
            PUSHL(ssp, esp, sp_mask, ESP);
902 903
        }
903
        PUSHL(ssp, esp, sp_mask, compute_eflags());
904
        PUSHL(ssp, esp, sp_mask, cpu_compute_eflags(env));
904 905
        PUSHL(ssp, esp, sp_mask, env->segs[R_CS].selector);
905 906
        PUSHL(ssp, esp, sp_mask, old_eip);
906 907
        if (has_error_code) {
......
917 918
            PUSHW(ssp, esp, sp_mask, env->segs[R_SS].selector);
918 919
            PUSHW(ssp, esp, sp_mask, ESP);
919 920
        }
920
        PUSHW(ssp, esp, sp_mask, compute_eflags());
921
        PUSHW(ssp, esp, sp_mask, cpu_compute_eflags(env));
921 922
        PUSHW(ssp, esp, sp_mask, env->segs[R_CS].selector);
922 923
        PUSHW(ssp, esp, sp_mask, old_eip);
923 924
        if (has_error_code) {
......
1089 1090

  
1090 1091
    PUSHQ(esp, env->segs[R_SS].selector);
1091 1092
    PUSHQ(esp, ESP);
1092
    PUSHQ(esp, compute_eflags());
1093
    PUSHQ(esp, cpu_compute_eflags(env));
1093 1094
    PUSHQ(esp, env->segs[R_CS].selector);
1094 1095
    PUSHQ(esp, old_eip);
1095 1096
    if (has_error_code) {
......
1139 1140
        int code64;
1140 1141

  
1141 1142
        ECX = env->eip + next_eip_addend;
1142
        env->regs[11] = compute_eflags();
1143
        env->regs[11] = cpu_compute_eflags(env);
1143 1144

  
1144 1145
        code64 = env->hflags & HF_CS64_MASK;
1145 1146

  
......
1156 1157
                               DESC_S_MASK |
1157 1158
                               DESC_W_MASK | DESC_A_MASK);
1158 1159
        env->eflags &= ~env->fmask;
1159
        load_eflags(env->eflags, 0);
1160
        cpu_load_eflags(env, env->eflags, 0);
1160 1161
        if (code64) {
1161 1162
            env->eip = env->lstar;
1162 1163
        } else {
......
1218 1219
                               DESC_G_MASK | DESC_B_MASK | DESC_P_MASK |
1219 1220
                               DESC_S_MASK | (3 << DESC_DPL_SHIFT) |
1220 1221
                               DESC_W_MASK | DESC_A_MASK);
1221
        load_eflags((uint32_t)(env->regs[11]), TF_MASK | AC_MASK | ID_MASK |
1222
                    IF_MASK | IOPL_MASK | VM_MASK | RF_MASK | NT_MASK);
1222
        cpu_load_eflags(env, (uint32_t)(env->regs[11]), TF_MASK | AC_MASK
1223
                        | ID_MASK | IF_MASK | IOPL_MASK | VM_MASK | RF_MASK |
1224
                        NT_MASK);
1223 1225
        cpu_x86_set_cpl(env, 3);
1224 1226
    } else {
1225 1227
        cpu_x86_load_seg_cache(env, R_CS, selector | 3,
......
1266 1268
    }
1267 1269
    old_cs = env->segs[R_CS].selector;
1268 1270
    /* XXX: use SS segment size? */
1269
    PUSHW(ssp, esp, 0xffff, compute_eflags());
1271
    PUSHW(ssp, esp, 0xffff, cpu_compute_eflags(env));
1270 1272
    PUSHW(ssp, esp, 0xffff, old_cs);
1271 1273
    PUSHW(ssp, esp, 0xffff, old_eip);
1272 1274

  
......
1536 1538
        stq_phys(sm_state + 0x7ff8 - i * 8, env->regs[i]);
1537 1539
    }
1538 1540
    stq_phys(sm_state + 0x7f78, env->eip);
1539
    stl_phys(sm_state + 0x7f70, compute_eflags());
1541
    stl_phys(sm_state + 0x7f70, cpu_compute_eflags(env));
1540 1542
    stl_phys(sm_state + 0x7f68, env->dr[6]);
1541 1543
    stl_phys(sm_state + 0x7f60, env->dr[7]);
1542 1544

  
......
1549 1551
#else
1550 1552
    stl_phys(sm_state + 0x7ffc, env->cr[0]);
1551 1553
    stl_phys(sm_state + 0x7ff8, env->cr[3]);
1552
    stl_phys(sm_state + 0x7ff4, compute_eflags());
1554
    stl_phys(sm_state + 0x7ff4, cpu_compute_eflags(env));
1553 1555
    stl_phys(sm_state + 0x7ff0, env->eip);
1554 1556
    stl_phys(sm_state + 0x7fec, EDI);
1555 1557
    stl_phys(sm_state + 0x7fe8, ESI);
......
1600 1602
#ifdef TARGET_X86_64
1601 1603
    cpu_load_efer(env, 0);
1602 1604
#endif
1603
    load_eflags(0, ~(CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C | DF_MASK));
1605
    cpu_load_eflags(env, 0, ~(CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C |
1606
                              DF_MASK));
1604 1607
    env->eip = 0x00008000;
1605 1608
    cpu_x86_load_seg_cache(env, R_CS, (env->smbase >> 4) & 0xffff, env->smbase,
1606 1609
                           0xffffffff, 0);
......
1667 1670
        env->regs[i] = ldq_phys(sm_state + 0x7ff8 - i * 8);
1668 1671
    }
1669 1672
    env->eip = ldq_phys(sm_state + 0x7f78);
1670
    load_eflags(ldl_phys(sm_state + 0x7f70),
1671
                ~(CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C | DF_MASK));
1673
    cpu_load_eflags(env, ldl_phys(sm_state + 0x7f70),
1674
                    ~(CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C | DF_MASK));
1672 1675
    env->dr[6] = ldl_phys(sm_state + 0x7f68);
1673 1676
    env->dr[7] = ldl_phys(sm_state + 0x7f60);
1674 1677

  
......
1683 1686
#else
1684 1687
    cpu_x86_update_cr0(env, ldl_phys(sm_state + 0x7ffc));
1685 1688
    cpu_x86_update_cr3(env, ldl_phys(sm_state + 0x7ff8));
1686
    load_eflags(ldl_phys(sm_state + 0x7ff4),
1687
                ~(CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C | DF_MASK));
1689
    cpu_load_eflags(env, ldl_phys(sm_state + 0x7ff4),
1690
                    ~(CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C | DF_MASK));
1688 1691
    env->eip = ldl_phys(sm_state + 0x7ff0);
1689 1692
    EDI = ldl_phys(sm_state + 0x7fec);
1690 1693
    ESI = ldl_phys(sm_state + 0x7fe8);
......
2731 2734
    if (shift == 0) {
2732 2735
        eflags_mask &= 0xffff;
2733 2736
    }
2734
    load_eflags(new_eflags, eflags_mask);
2737
    cpu_load_eflags(env, new_eflags, eflags_mask);
2735 2738
    env->hflags2 &= ~HF2_NMI_MASK;
2736 2739
}
2737 2740

  
......
2951 2954
        if (shift == 0) {
2952 2955
            eflags_mask &= 0xffff;
2953 2956
        }
2954
        load_eflags(new_eflags, eflags_mask);
2957
        cpu_load_eflags(env, new_eflags, eflags_mask);
2955 2958
    }
2956 2959
    return;
2957 2960

  
......
2964 2967
    POPL(ssp, sp, sp_mask, new_gs);
2965 2968

  
2966 2969
    /* modify processor state */
2967
    load_eflags(new_eflags, TF_MASK | AC_MASK | ID_MASK |
2968
                IF_MASK | IOPL_MASK | VM_MASK | NT_MASK | VIF_MASK | VIP_MASK);
2970
    cpu_load_eflags(env, new_eflags, TF_MASK | AC_MASK | ID_MASK |
2971
                    IF_MASK | IOPL_MASK | VM_MASK | NT_MASK | VIF_MASK |
2972
                    VIP_MASK);
2969 2973
    load_seg_vm(R_CS, new_cs & 0xffff);
2970 2974
    cpu_x86_set_cpl(env, 3);
2971 2975
    load_seg_vm(R_SS, new_ss & 0xffff);
......
4153 4157

  
4154 4158
    stq_phys(env->vm_hsave + offsetof(struct vmcb, save.efer), env->efer);
4155 4159
    stq_phys(env->vm_hsave + offsetof(struct vmcb, save.rflags),
4156
             compute_eflags());
4160
             cpu_compute_eflags(env));
4157 4161

  
4158 4162
    svm_save_seg(env->vm_hsave + offsetof(struct vmcb, save.es),
4159 4163
                 &env->segs[R_ES]);
......
4229 4233
    cpu_load_efer(env,
4230 4234
                  ldq_phys(env->vm_vmcb + offsetof(struct vmcb, save.efer)));
4231 4235
    env->eflags = 0;
4232
    load_eflags(ldq_phys(env->vm_vmcb + offsetof(struct vmcb, save.rflags)),
4233
                ~(CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C | DF_MASK));
4236
    cpu_load_eflags(env, ldq_phys(env->vm_vmcb + offsetof(struct vmcb,
4237
                                                          save.rflags)),
4238
                    ~(CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C | DF_MASK));
4234 4239
    CC_OP = CC_OP_EFLAGS;
4235 4240

  
4236 4241
    svm_load_seg_cache(env->vm_vmcb + offsetof(struct vmcb, save.es),
......
4601 4606
    stl_phys(env->vm_vmcb + offsetof(struct vmcb, control.int_ctl), int_ctl);
4602 4607

  
4603 4608
    stq_phys(env->vm_vmcb + offsetof(struct vmcb, save.rflags),
4604
             compute_eflags());
4609
             cpu_compute_eflags(env));
4605 4610
    stq_phys(env->vm_vmcb + offsetof(struct vmcb, save.rip), env->eip);
4606 4611
    stq_phys(env->vm_vmcb + offsetof(struct vmcb, save.rsp), ESP);
4607 4612
    stq_phys(env->vm_vmcb + offsetof(struct vmcb, save.rax), EAX);
......
4640 4645
    cpu_load_efer(env, ldq_phys(env->vm_hsave + offsetof(struct vmcb,
4641 4646
                                                         save.efer)));
4642 4647
    env->eflags = 0;
4643
    load_eflags(ldq_phys(env->vm_hsave + offsetof(struct vmcb, save.rflags)),
4644
                ~(CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C | DF_MASK));
4648
    cpu_load_eflags(env, ldq_phys(env->vm_hsave + offsetof(struct vmcb,
4649
                                                           save.rflags)),
4650
                    ~(CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C | DF_MASK));
4645 4651
    CC_OP = CC_OP_EFLAGS;
4646 4652

  
4647 4653
    svm_load_seg_cache(env->vm_hsave + offsetof(struct vmcb, save.es),

Also available in: Unified diff