VirtualBox

Changeset 30862 in vbox for trunk/src/recompiler


Ignore:
Timestamp:
Jul 15, 2010 6:13:56 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
63691
Message:

VMM,REM: Replumbled the MSR updating and reading so that PGM can easily be notified when EFER.NXE changes. (committing from the right place now)

Location:
trunk/src/recompiler
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/recompiler/VBoxREMWrapper.cpp

    r30263 r30862  
    520520};
    521521
    522 /* CPUMGetGuestMsr args */
    523 static const REMPARMDESC g_aArgsCPUMGetGuestMsr[] =
     522/* CPUMQueryGuestMsr args */
     523static const REMPARMDESC g_aArgsCPUMQueryGuestMsr[] =
    524524{
    525525    { REMPARMDESC_FLAGS_INT,        sizeof(PVMCPU),             NULL },
    526526    { REMPARMDESC_FLAGS_INT,        sizeof(uint32_t),           NULL },
    527 };
    528 
    529 /* CPUMGetGuestMsr args */
     527    { REMPARMDESC_FLAGS_INT,        sizeof(uint64_t *),         NULL },
     528};
     529
     530/* CPUMSetGuestMsr args */
    530531static const REMPARMDESC g_aArgsCPUMSetGuestMsr[] =
    531532{
     
    727728    { REMPARMDESC_FLAGS_INT,        sizeof(PVMCPU),             NULL },
    728729    { REMPARMDESC_FLAGS_INT,        sizeof(uint8_t),            NULL }
    729 };
    730 static const REMPARMDESC g_aArgsPDMApicWriteMSR[] =
    731 {
    732     { REMPARMDESC_FLAGS_INT,        sizeof(PVM),                NULL },
    733     { REMPARMDESC_FLAGS_INT,        sizeof(VMCPUID),            NULL },
    734     { REMPARMDESC_FLAGS_INT,        sizeof(uint32_t),           NULL },
    735     { REMPARMDESC_FLAGS_INT,        sizeof(uint64_t),           NULL }
    736 };
    737 static const REMPARMDESC g_aArgsPDMApicReadMSR[] =
    738 {
    739     { REMPARMDESC_FLAGS_INT,        sizeof(PVM),                NULL },
    740     { REMPARMDESC_FLAGS_INT,        sizeof(VMCPUID),            NULL },
    741     { REMPARMDESC_FLAGS_INT,        sizeof(uint32_t),           NULL },
    742     { REMPARMDESC_FLAGS_INT,        sizeof(uint64_t *),         NULL }
    743730};
    744731static const REMPARMDESC g_aArgsPDMGetInterrupt[] =
     
    11871174    { "CPUMSetChangedFlags",                    VMM_FN(CPUMSetChangedFlags),            &g_aArgsCPUMSetChangedFlags[0],             RT_ELEMENTS(g_aArgsCPUMSetChangedFlags),               REMFNDESC_FLAGS_RET_VOID,   0,                  NULL },
    11881175    { "CPUMGetGuestCPL",                        VMM_FN(CPUMGetGuestCPL),                &g_aArgsCPUMGetGuestCpl[0],                 RT_ELEMENTS(g_aArgsCPUMGetGuestCpl),                   REMFNDESC_FLAGS_RET_INT,    sizeof(unsigned),   NULL },
    1189     { "CPUMGetGuestMsr",                        VMM_FN(CPUMGetGuestMsr),                &g_aArgsCPUMGetGuestMsr[0],                 RT_ELEMENTS(g_aArgsCPUMGetGuestMsr),                   REMFNDESC_FLAGS_RET_INT,    sizeof(uint64_t),   NULL },
     1176    { "CPUMQueryGuestMsr",                      VMM_FN(CPUMQueryGuestMsr),              &g_aArgsCPUMQueryGuestMsr[0],               RT_ELEMENTS(g_aArgsCPUMQueryGuestMsr),                 REMFNDESC_FLAGS_RET_INT,    sizeof(uint64_t),   NULL },
    11901177    { "CPUMSetGuestMsr",                        VMM_FN(CPUMSetGuestMsr),                &g_aArgsCPUMSetGuestMsr[0],                 RT_ELEMENTS(g_aArgsCPUMSetGuestMsr),                   REMFNDESC_FLAGS_RET_VOID,   0,                  NULL },
    11911178    { "CPUMGetGuestCpuId",                      VMM_FN(CPUMGetGuestCpuId),              &g_aArgsCPUMGetGuestCpuId[0],               RT_ELEMENTS(g_aArgsCPUMGetGuestCpuId),                 REMFNDESC_FLAGS_RET_VOID,   0,                  NULL },
     
    12351222    { "PDMApicSetBase",                         VMM_FN(PDMApicSetBase),                 &g_aArgsPDMApicSetBase[0],                  RT_ELEMENTS(g_aArgsPDMApicSetBase),                    REMFNDESC_FLAGS_RET_INT,    sizeof(int),        NULL },
    12361223    { "PDMApicSetTPR",                          VMM_FN(PDMApicSetTPR),                  &g_aArgsPDMApicSetTPR[0],                   RT_ELEMENTS(g_aArgsPDMApicSetTPR),                     REMFNDESC_FLAGS_RET_INT,    sizeof(int),        NULL },
    1237     { "PDMApicWriteMSR",                        VMM_FN(PDMApicWriteMSR),                &g_aArgsPDMApicWriteMSR[0],                 RT_ELEMENTS(g_aArgsPDMApicWriteMSR),                   REMFNDESC_FLAGS_RET_INT,    sizeof(int),        NULL },
    1238     { "PDMApicReadMSR",                         VMM_FN(PDMApicReadMSR),                 &g_aArgsPDMApicReadMSR[0],                  RT_ELEMENTS(g_aArgsPDMApicReadMSR),                    REMFNDESC_FLAGS_RET_INT,    sizeof(int),        NULL },
    12391224    { "PDMR3DmaRun",                            VMM_FN(PDMR3DmaRun),                    &g_aArgsVM[0],                              RT_ELEMENTS(g_aArgsVM),                                REMFNDESC_FLAGS_RET_VOID,   0,                  NULL },
    12401225    { "PDMR3CritSectInit",                      VMM_FN(PDMR3CritSectInit),              &g_aArgsPDMR3CritSectInit[0],               RT_ELEMENTS(g_aArgsPDMR3CritSectInit),                 REMFNDESC_FLAGS_RET_INT,    sizeof(int),        NULL },
  • trunk/src/recompiler/VBoxRecompiler.c

    r30453 r30862  
    41674167/* -+- local apic -+- */
    41684168
     4169#if 0 /* CPUMSetGuestMsr does this now. */
    41694170void cpu_set_apic_base(CPUX86State *env, uint64_t val)
    41704171{
     
    41724173    LogFlow(("cpu_set_apic_base: val=%#llx rc=%Rrc\n", val, rc)); NOREF(rc);
    41734174}
     4175#endif
    41744176
    41754177uint64_t cpu_get_apic_base(CPUX86State *env)
     
    42054207}
    42064208
    4207 
    4208 uint64_t cpu_apic_rdmsr(CPUX86State *env, uint32_t reg)
    4209 {
    4210     uint64_t value;
    4211     int rc = PDMApicReadMSR(env->pVM, 0/* cpu */, reg, &value);
    4212     if (RT_SUCCESS(rc))
    4213     {
    4214         LogFlow(("cpu_apic_rdms returns %#x\n", value));
    4215         return value;
    4216     }
    4217     /** @todo: exception ? */
    4218     LogFlow(("cpu_apic_rdms returns 0 (rc=%Rrc)\n", rc));
    4219     return value;
    4220 }
    4221 
    4222 void     cpu_apic_wrmsr(CPUX86State *env, uint32_t reg, uint64_t value)
    4223 {
    4224     int rc = PDMApicWriteMSR(env->pVM, 0 /* cpu */, reg, value);
    4225     /** @todo: exception if error ? */
    4226     LogFlow(("cpu_apic_wrmsr: rc=%Rrc\n", rc)); NOREF(rc);
    4227 }
    4228 
    4229 uint64_t cpu_rdmsr(CPUX86State *env, uint32_t msr)
     4209/**
     4210 * Read an MSR.
     4211 *
     4212 * @retval 0 success.
     4213 * @retval -1 failure, raise \#GP(0).
     4214 * @param   env     The cpu state.
     4215 * @param   idMsr   The MSR to read.
     4216 * @param   puValue Where to return the value.
     4217 */
     4218int cpu_rdmsr(CPUX86State *env, uint32_t idMsr, uint64_t *puValue)
    42304219{
    42314220    Assert(env->pVCpu);
    4232     return CPUMGetGuestMsr(env->pVCpu, msr);
    4233 }
    4234 
    4235 void cpu_wrmsr(CPUX86State *env, uint32_t msr, uint64_t val)
     4221    return CPUMQueryGuestMsr(env->pVCpu, idMsr, puValue) == VINF_SUCCESS ? 0 : -1;
     4222}
     4223
     4224/**
     4225 * Write to an MSR.
     4226 *
     4227 * @retval 0 success.
     4228 * @retval -1 failure, raise \#GP(0).
     4229 * @param   env     The cpu state.
     4230 * @param   idMsr   The MSR to read.
     4231 * @param   puValue Where to return the value.
     4232 */
     4233int cpu_wrmsr(CPUX86State *env, uint32_t idMsr, uint64_t uValue)
    42364234{
    42374235    Assert(env->pVCpu);
    4238     CPUMSetGuestMsr(env->pVCpu, msr, val);
     4236    return CPUMSetGuestMsr(env->pVCpu, idMsr, uValue) == VINF_SUCCESS ? 0 : -1;
    42394237}
    42404238
  • trunk/src/recompiler/target-i386/cpu.h

    r18927 r30862  
    601601    /* sysenter registers */
    602602    uint32_t sysenter_cs;
     603#ifdef VBOX
     604    uint32_t alignment0;
     605#endif
    603606    uint64_t sysenter_esp;
    604607    uint64_t sysenter_eip;
    605 #ifdef VBOX
    606     uint32_t alignment0;
    607 #endif
    608608    uint64_t efer;
    609609    uint64_t star;
     
    926926#endif
    927927#ifdef VBOX
    928 uint64_t cpu_apic_rdmsr(CPUX86State *env, uint32_t reg);
    929 void     cpu_apic_wrmsr(CPUX86State *env, uint32_t reg, uint64_t value);
    930 uint64_t cpu_rdmsr(CPUX86State *env, uint32_t msr);
    931 void     cpu_wrmsr(CPUX86State *env, uint32_t msr, uint64_t val);
     928int cpu_rdmsr(CPUX86State *env, uint32_t idMsr, uint64_t *puValue);
     929int cpu_wrmsr(CPUX86State *env, uint32_t idMsr, uint64_t uValue);
    932930#endif
    933931void cpu_smm_update(CPUX86State *env);
  • trunk/src/recompiler/target-i386/op_helper.c

    r29333 r30862  
    36903690    EAX = (uint32_t)(val);
    36913691    EDX = (uint32_t)(val >> 32);
    3692     ECX = cpu_rdmsr(env, MSR_K8_TSC_AUX);
     3692    if (cpu_rdmsr(env, MSR_K8_TSC_AUX, &val) == 0)
     3693        ECX = (uint32_t)(val);
     3694    else
     3695        ECX = 0;
    36933696}
    36943697#endif
     
    37433746        break;
    37443747    case MSR_IA32_APICBASE:
     3748#ifndef VBOX /* The CPUMSetGuestMsr call below does this now. */
    37453749        cpu_set_apic_base(env, val);
     3750#endif
    37463751        break;
    37473752    case MSR_EFER:
     
    37953800#ifndef VBOX
    37963801        /* XXX: exception ? */
    3797         break;
    3798 #else  /* VBOX */
     3802#endif
     3803        break;
     3804    }
     3805
     3806#ifdef VBOX
     3807    /* call CPUM. */
     3808    if (cpu_wrmsr(env, (uint32_t)ECX, val) != 0)
    37993809    {
    3800         uint32_t ecx = (uint32_t)ECX;
    3801         /* In X2APIC specification this range is reserved for APIC control. */
    3802         if (ecx >= MSR_APIC_RANGE_START && ecx < MSR_APIC_RANGE_END)
    3803             cpu_apic_wrmsr(env, ecx, val);
    3804         /** @todo else exception? */
    3805         break;
    3806     }
    3807     case MSR_K8_TSC_AUX:
    3808             cpu_wrmsr(env, MSR_K8_TSC_AUX, val);
    3809             break;
    3810 #endif /* VBOX */
    3811     }
     3810        /** @todo be a brave man and raise a \#GP(0) here as we should... */
     3811    }
     3812#endif
    38123813}
    38133814
     
    38423843        val = env->vm_hsave;
    38433844        break;
    3844 #ifdef VBOX
    3845     case MSR_IA32_PERF_STATUS:
    3846     case MSR_IA32_PLATFORM_INFO:
    3847     case MSR_IA32_FSB_CLOCK_STS:
    3848     case MSR_IA32_THERM_STATUS:
    3849         val = CPUMGetGuestMsr(env->pVCpu, (uint32_t)ECX);
    3850         break;
    3851 #else
     3845#ifndef VBOX /* forward to CPUMQueryGuestMsr. */
    38523846    case MSR_IA32_PERF_STATUS:
    38533847        /* tsc_increment_by_tick */
     
    38903884        /* XXX: exception ? */
    38913885        val = 0;
    3892         break;
    38933886#else  /* VBOX */
     3887        if (cpu_rdmsr(env, (uint32_t)ECX, &val) != 0)
    38943888        {
    3895             uint32_t ecx = (uint32_t)ECX;
    3896             /* In X2APIC specification this range is reserved for APIC control. */
    3897             if (ecx >= MSR_APIC_RANGE_START && ecx < MSR_APIC_RANGE_END)
    3898                 val = cpu_apic_rdmsr(env, ecx);
    3899             else
    3900                 val = 0; /** @todo else exception? */
    3901             break;
    3902         }
    3903         case MSR_IA32_TSC:
    3904         case MSR_K8_TSC_AUX:
    3905             val = cpu_rdmsr(env, (uint32_t)ECX);
    3906             break;
    3907 #endif /* VBOX */
     3889            /** @todo be a brave man and raise a \#GP(0) here as we should... */
     3890            val = 0;
     3891        }
     3892#endif
     3893        break;
    39083894    }
    39093895    EAX = (uint32_t)(val);
    39103896    EDX = (uint32_t)(val >> 32);
     3897
     3898#ifdef VBOX_STRICT
     3899    if (cpu_rdmsr(env, (uint32_t)ECX, &val) != 0)
     3900        val = 0;
     3901    AssertMsg(val == RT_MAKE_U32(EAX, EDX), ("idMsr=%#x val=%#llx eax:edx=%#llx\n", (uint32_t)ECX, val, RT_MAKE_U32(EAX, EDX)));
     3902#endif
    39113903}
    39123904#endif
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