VirtualBox

Changeset 14411 in vbox for trunk/src/recompiler/target-i386


Ignore:
Timestamp:
Nov 20, 2008 1:26:47 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
39642
Message:

RDTSCP support added. Enabled only for AMD-V guests.

Location:
trunk/src/recompiler/target-i386
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/recompiler/target-i386/cpu.h

    r13034 r14411  
    857857void cpu_smm_update(CPUX86State *env);
    858858
     859#ifdef VBOX
     860uint64_t cpu_rdmsr(CPUX86State *env, uint32_t msr);
     861void     cpu_wrmsr(CPUX86State *env, uint32_t msr, uint64_t val);
     862#endif
     863
    859864/* will be suppressed */
    860865void cpu_x86_update_cr0(CPUX86State *env, uint32_t new_cr0);
  • trunk/src/recompiler/target-i386/exec.h

    r11982 r14411  
    215215void helper_sysret(int dflag);
    216216void helper_rdtsc(void);
     217#ifdef VBOX
     218void helper_rdtscp(void);
     219#endif
    217220void helper_rdmsr(void);
    218221void helper_wrmsr(void);
  • trunk/src/recompiler/target-i386/helper.c

    r13839 r14411  
    30233023}
    30243024
     3025#ifdef VBOX
     3026void helper_rdtscp(void)
     3027{
     3028    uint64_t val;
     3029
     3030    if ((env->cr[4] & CR4_TSD_MASK) && ((env->hflags & HF_CPL_MASK) != 0)) {
     3031        raise_exception(EXCP0D_GPF);
     3032    }
     3033
     3034    val = cpu_get_tsc(env);
     3035    EAX = (uint32_t)(val);
     3036    EDX = (uint32_t)(val >> 32);
     3037    ECX = cpu_rdmsr(env, MSR_K8_TSC_AUX);
     3038}
     3039#endif
     3040
    30253041#if defined(CONFIG_USER_ONLY)
    30263042void helper_wrmsr(void)
     
    31063122        break;
    31073123    }
     3124    case MSR_K8_TSC_AUX:
     3125        cpu_wrmsr(env, MSR_K8_TSC_AUX, val);
     3126        break;
    31083127#endif /* VBOX */
    31093128    }
     
    31703189        break;
    31713190    }
     3191    case MSR_K8_TSC_AUX:
     3192        val = cpu_rdmsr(env, MSR_K8_TSC_AUX);
     3193        break;
    31723194#endif /* VBOX */
    31733195    }
  • trunk/src/recompiler/target-i386/op.c

    r13449 r14411  
    10551055    helper_rdtsc();
    10561056}
     1057
     1058#ifdef VBOX
     1059void OPPROTO op_rdtscp(void)
     1060{
     1061    helper_rdtscp();
     1062}
     1063#endif
    10571064
    10581065void OPPROTO op_cpuid(void)
  • trunk/src/recompiler/target-i386/translate.c

    r13839 r14411  
    59405940        op = (modrm >> 3) & 7;
    59415941        rm = modrm & 7;
     5942
     5943#ifdef VBOX
     5944        /* 0f 01 f9 */
     5945        if (modrm == 0xf9)
     5946        {
     5947            if (!(s->cpuid_ext2_features & CPUID_EXT2_RDTSCP))
     5948                 goto illegal_op;
     5949            gen_jmp_im(pc_start - s->cs_base);
     5950            gen_op_rdtscp();
     5951            break;
     5952        }
     5953#endif
     5954
    59425955        switch(op) {
    59435956        case 0: /* sgdt */
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette