Revision 1b050077

b/target-i386/cpu.h
322 322
#define MSR_FSBASE                      0xc0000100
323 323
#define MSR_GSBASE                      0xc0000101
324 324
#define MSR_KERNELGSBASE                0xc0000102
325
#define MSR_TSC_AUX                     0xc0000103
325 326

  
326 327
#define MSR_VM_HSAVE_PA                 0xc0010117
327 328

  
......
694 695
    uint64 mcg_status;
695 696
    uint64 mcg_ctl;
696 697
    uint64 *mce_banks;
698

  
699
    uint64_t tsc_aux;
697 700
} CPUX86State;
698 701

  
699 702
CPUX86State *cpu_x86_init(const char *cpu_model);
......
854 857
#define cpu_signal_handler cpu_x86_signal_handler
855 858
#define cpu_list x86_cpu_list
856 859

  
857
#define CPU_SAVE_VERSION 10
860
#define CPU_SAVE_VERSION 11
858 861

  
859 862
/* MMU modes definitions */
860 863
#define MMU_MODE0_SUFFIX _kernel
b/target-i386/helper.h
80 80
DEF_HELPER_0(single_step, void)
81 81
DEF_HELPER_0(cpuid, void)
82 82
DEF_HELPER_0(rdtsc, void)
83
DEF_HELPER_0(rdtscp, void)
83 84
DEF_HELPER_0(rdpmc, void)
84 85
DEF_HELPER_0(rdmsr, void)
85 86
DEF_HELPER_0(wrmsr, void)
b/target-i386/machine.c
171 171
            qemu_put_be64s(f, &env->mce_banks[4*i + 3]);
172 172
        }
173 173
    }
174
    qemu_put_be64s(f, &env->tsc_aux);
174 175
 }
175 176

  
176 177
#ifdef USE_X86LDOUBLE
......
377 378
        }
378 379
    }
379 380

  
381
    if (version_id >= 11) {
382
        qemu_get_be64s(f, &env->tsc_aux);
383
    }
380 384
    /* XXX: ensure compatiblity for halted bit ? */
381 385
    /* XXX: compute redundant hflags bits */
382 386
    env->hflags = hflags;
b/target-i386/op_helper.c
2969 2969
    EDX = (uint32_t)(val >> 32);
2970 2970
}
2971 2971

  
2972
void helper_rdtscp(void)
2973
{
2974
    helper_rdtsc();
2975
    ECX = (uint32_t)(env->tsc_aux);
2976
}
2977

  
2972 2978
void helper_rdpmc(void)
2973 2979
{
2974 2980
    if ((env->cr[4] & CR4_PCE_MASK) && ((env->hflags & HF_CPL_MASK) != 0)) {
......
3107 3113
            && (val == 0 || val == ~(uint64_t)0))
3108 3114
            env->mcg_ctl = val;
3109 3115
        break;
3116
    case MSR_TSC_AUX:
3117
        env->tsc_aux = val;
3118
        break;
3110 3119
    default:
3111 3120
        if ((uint32_t)ECX >= MSR_MC0_CTL
3112 3121
            && (uint32_t)ECX < MSR_MC0_CTL + (4 * env->mcg_cap & 0xff)) {
......
3177 3186
    case MSR_KERNELGSBASE:
3178 3187
        val = env->kernelgsbase;
3179 3188
        break;
3189
    case MSR_TSC_AUX:
3190
        val = env->tsc_aux;
3191
        break;
3180 3192
#endif
3181 3193
    case MSR_MTRRphysBase(0):
3182 3194
    case MSR_MTRRphysBase(1):
b/target-i386/translate.c
7206 7206
                gen_eob(s);
7207 7207
            }
7208 7208
            break;
7209
        case 7: /* invlpg */
7210
            if (s->cpl != 0) {
7211
                gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base);
7209
        case 7:
7210
            if (mod != 3) { /* invlpg */
7211
                if (s->cpl != 0) {
7212
                    gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base);
7213
                } else {
7214
                    if (s->cc_op != CC_OP_DYNAMIC)
7215
                        gen_op_set_cc_op(s->cc_op);
7216
                    gen_jmp_im(pc_start - s->cs_base);
7217
                    gen_lea_modrm(s, modrm, &reg_addr, &offset_addr);
7218
                    gen_helper_invlpg(cpu_A0);
7219
                    gen_jmp_im(s->pc - s->cs_base);
7220
                    gen_eob(s);
7221
                }
7212 7222
            } else {
7213
                if (mod == 3) {
7223
                switch (rm) {
7224
                case 0: /* swapgs */
7214 7225
#ifdef TARGET_X86_64
7215
                    if (CODE64(s) && rm == 0) {
7216
                        /* swapgs */
7217
                        tcg_gen_ld_tl(cpu_T[0], cpu_env, offsetof(CPUX86State,segs[R_GS].base));
7218
                        tcg_gen_ld_tl(cpu_T[1], cpu_env, offsetof(CPUX86State,kernelgsbase));
7219
                        tcg_gen_st_tl(cpu_T[1], cpu_env, offsetof(CPUX86State,segs[R_GS].base));
7220
                        tcg_gen_st_tl(cpu_T[0], cpu_env, offsetof(CPUX86State,kernelgsbase));
7226
                    if (CODE64(s)) {
7227
                        if (s->cpl != 0) {
7228
                            gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base);
7229
                        } else {
7230
                            tcg_gen_ld_tl(cpu_T[0], cpu_env,
7231
                                offsetof(CPUX86State,segs[R_GS].base));
7232
                            tcg_gen_ld_tl(cpu_T[1], cpu_env,
7233
                                offsetof(CPUX86State,kernelgsbase));
7234
                            tcg_gen_st_tl(cpu_T[1], cpu_env,
7235
                                offsetof(CPUX86State,segs[R_GS].base));
7236
                            tcg_gen_st_tl(cpu_T[0], cpu_env,
7237
                                offsetof(CPUX86State,kernelgsbase));
7238
                        }
7221 7239
                    } else
7222 7240
#endif
7223 7241
                    {
7224 7242
                        goto illegal_op;
7225 7243
                    }
7226
                } else {
7244
                    break;
7245
                case 1: /* rdtscp */
7246
                    if (!(s->cpuid_ext2_features & CPUID_EXT2_RDTSCP))
7247
                        goto illegal_op;
7227 7248
                    if (s->cc_op != CC_OP_DYNAMIC)
7228 7249
                        gen_op_set_cc_op(s->cc_op);
7229 7250
                    gen_jmp_im(pc_start - s->cs_base);
7230
                    gen_lea_modrm(s, modrm, &reg_addr, &offset_addr);
7231
                    gen_helper_invlpg(cpu_A0);
7232
                    gen_jmp_im(s->pc - s->cs_base);
7233
                    gen_eob(s);
7251
                    if (use_icount)
7252
                        gen_io_start();
7253
                    gen_helper_rdtscp();
7254
                    if (use_icount) {
7255
                        gen_io_end();
7256
                        gen_jmp(s, s->pc - s->cs_base);
7257
                    }
7258
                    break;
7259
                default:
7260
                    goto illegal_op;
7234 7261
                }
7235 7262
            }
7236 7263
            break;

Also available in: Unified diff