VirtualBox

Ignore:
Timestamp:
Jul 4, 2018 2:27:12 PM (6 years ago)
Author:
vboxsync
Message:

EM,HM,IEM: Replaced EMInterpretWrmsr with IEMExecDecodedWrmsr.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp

    r72874 r72877  
    1189511895{
    1189611896    HMVMX_VALIDATE_EXIT_HANDLER_PARAMS();
    11897     PVM pVM = pVCpu->CTX_SUFF(pVM);
    11898     int rc = VINF_SUCCESS;
    11899 
    11900     /* EMInterpretWrmsr() requires CR0, EFLAGS and SS segment register. FS, GS (base) can be accessed by MSR writes. */
    11901     rc  = hmR0VmxImportGuestState(pVCpu,   CPUMCTX_EXTRN_CR0
    11902                                          | CPUMCTX_EXTRN_RFLAGS
    11903                                          | CPUMCTX_EXTRN_SS
    11904                                          | CPUMCTX_EXTRN_FS
    11905                                          | CPUMCTX_EXTRN_GS);
    11906     if (!(pVCpu->hm.s.vmx.u32ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_USE_MSR_BITMAPS))
    11907         rc |= hmR0VmxImportGuestState(pVCpu, CPUMCTX_EXTRN_ALL_MSRS);
     11897
     11898    /** @todo Optimize this: We currently drag in in the whole MSR state
     11899     * (CPUMCTX_EXTRN_ALL_MSRS) here.  We should optimize this to only get
     11900     * MSRs required.  That would require changes to IEM and possibly CPUM too.
     11901     * (Should probably do it lazy fashion from CPUMAllMsrs.cpp). */
     11902    uint32_t const idMsr = pMixedCtx->ecx; /* Save it. */
     11903    int rc = hmR0VmxReadExitInstrLenVmcs(pVmxTransient);
     11904    rc    |= hmR0VmxImportGuestState(pVCpu, IEM_CPUMCTX_EXTRN_EXEC_DECODED_NO_MEM_MASK | CPUMCTX_EXTRN_ALL_MSRS);
    1190811905    AssertRCReturn(rc, rc);
    11909     Log4Func(("ecx=%#RX32 edx:eax=%#RX32:%#RX32\n", pMixedCtx->ecx, pMixedCtx->edx, pMixedCtx->eax));
    11910 
    11911     rc = EMInterpretWrmsr(pVM, pVCpu, CPUMCTX2CORE(pMixedCtx));
    11912     AssertMsg(rc == VINF_SUCCESS || rc == VERR_EM_INTERPRETER, ("hmR0VmxExitWrmsr: failed, invalid error code %Rrc\n", rc));
     11906
     11907    Log4Func(("ecx=%#RX32 edx:eax=%#RX32:%#RX32\n", idMsr, pMixedCtx->edx, pMixedCtx->eax));
     11908
     11909    VBOXSTRICTRC rcStrict = IEMExecDecodedWrmsr(pVCpu, pVmxTransient->cbInstr);
    1191311910    STAM_COUNTER_INC(&pVCpu->hm.s.StatExitWrmsr);
    1191411911
    11915     if (RT_SUCCESS(rc))
    11916     {
    11917         rc = hmR0VmxAdvanceGuestRip(pVCpu, pMixedCtx, pVmxTransient);
    11918 
     11912    if (rcStrict == VINF_SUCCESS)
     11913    {
    1191911914        /* If this is an X2APIC WRMSR access, update the APIC state as well. */
    11920         if (    pMixedCtx->ecx == MSR_IA32_APICBASE
    11921             || (   pMixedCtx->ecx >= MSR_IA32_X2APIC_START
    11922                 && pMixedCtx->ecx <= MSR_IA32_X2APIC_END))
     11915        if (    idMsr == MSR_IA32_APICBASE
     11916            || (   idMsr >= MSR_IA32_X2APIC_START
     11917                && idMsr <= MSR_IA32_X2APIC_END))
    1192311918        {
    1192411919            /*
     
    1192911924            ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_GUEST_APIC_TPR);
    1193011925        }
    11931         else if (pMixedCtx->ecx == MSR_IA32_TSC)        /* Windows 7 does this during bootup. See @bugref{6398}. */
     11926        else if (idMsr == MSR_IA32_TSC)        /* Windows 7 does this during bootup. See @bugref{6398}. */
    1193211927            pVmxTransient->fUpdateTscOffsettingAndPreemptTimer = true;
    11933         else if (pMixedCtx->ecx == MSR_K6_EFER)
     11928        else if (idMsr == MSR_K6_EFER)
    1193411929        {
    1193511930            /*
     
    1194611941        if (!(pVCpu->hm.s.vmx.u32ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_USE_MSR_BITMAPS))
    1194711942        {
    11948             switch (pMixedCtx->ecx)
     11943            switch (idMsr)
    1194911944            {
    1195011945                case MSR_IA32_SYSENTER_CS:  ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_GUEST_SYSENTER_CS_MSR);   break;
     
    1195611951                default:
    1195711952                {
    11958                     if (hmR0VmxIsAutoLoadStoreGuestMsr(pVCpu, pMixedCtx->ecx))
     11953                    if (hmR0VmxIsAutoLoadStoreGuestMsr(pVCpu, idMsr))
    1195911954                        ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_VMX_GUEST_AUTO_MSRS);
    11960                     else if (hmR0VmxIsLazyGuestMsr(pVCpu, pMixedCtx->ecx))
     11955                    else if (hmR0VmxIsLazyGuestMsr(pVCpu, idMsr))
    1196111956                        ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_VMX_GUEST_LAZY_MSRS);
    1196211957                    break;
     
    1196811963        {
    1196911964            /* Paranoia. Validate that MSRs in the MSR-bitmaps with write-passthru are not intercepted. */
    11970             switch (pMixedCtx->ecx)
     11965            switch (idMsr)
    1197111966            {
    1197211967                case MSR_IA32_SYSENTER_CS:
     
    1197611971                case MSR_K8_GS_BASE:
    1197711972                {
    11978                     AssertMsgFailed(("Unexpected WRMSR for an MSR in the VMCS. ecx=%#RX32\n", pMixedCtx->ecx));
     11973                    AssertMsgFailed(("Unexpected WRMSR for an MSR in the VMCS. ecx=%#RX32\n", idMsr));
    1197911974                    HMVMX_UNEXPECTED_EXIT_RET(pVCpu, pVmxTransient);
    1198011975                }
     
    1198311978                default:
    1198411979                {
    11985                     if (hmR0VmxIsAutoLoadStoreGuestMsr(pVCpu, pMixedCtx->ecx))
     11980                    if (hmR0VmxIsAutoLoadStoreGuestMsr(pVCpu, idMsr))
    1198611981                    {
    1198711982                        /* EFER writes are always intercepted, see hmR0VmxExportGuestMsrs(). */
    11988                         if (pMixedCtx->ecx != MSR_K6_EFER)
     11983                        if (idMsr != MSR_K6_EFER)
    1198911984                        {
    1199011985                            AssertMsgFailed(("Unexpected WRMSR for an MSR in the auto-load/store area in the VMCS. ecx=%#RX32\n",
    11991                                              pMixedCtx->ecx));
     11986                                             idMsr));
    1199211987                            HMVMX_UNEXPECTED_EXIT_RET(pVCpu, pVmxTransient);
    1199311988                        }
    1199411989                    }
    1199511990
    11996                     if (hmR0VmxIsLazyGuestMsr(pVCpu, pMixedCtx->ecx))
     11991                    if (hmR0VmxIsLazyGuestMsr(pVCpu, idMsr))
    1199711992                    {
    1199811993                        VMXMSREXITREAD  enmRead;
    1199911994                        VMXMSREXITWRITE enmWrite;
    12000                         int rc2 = hmR0VmxGetMsrPermission(pVCpu, pMixedCtx->ecx, &enmRead, &enmWrite);
     11995                        int rc2 = hmR0VmxGetMsrPermission(pVCpu, idMsr, &enmRead, &enmWrite);
    1200111996                        AssertRCReturn(rc2, rc2);
    1200211997                        if (enmWrite == VMXMSREXIT_PASSTHRU_WRITE)
    1200311998                        {
    12004                             AssertMsgFailed(("Unexpected WRMSR for passthru, lazy-restore MSR. ecx=%#RX32\n", pMixedCtx->ecx));
     11999                            AssertMsgFailed(("Unexpected WRMSR for passthru, lazy-restore MSR. ecx=%#RX32\n", idMsr));
    1200512000                            HMVMX_UNEXPECTED_EXIT_RET(pVCpu, pVmxTransient);
    1200612001                        }
     
    1201212007#endif  /* VBOX_STRICT */
    1201312008    }
    12014     return rc;
     12009    else
     12010        AssertMsg(   rcStrict == VINF_CPUM_R3_MSR_WRITE
     12011                  || rcStrict == VINF_IEM_RAISED_XCPT,
     12012                  ("Unexpected IEMExecDecodedWrmsr status: %Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));
     12013
     12014    return rcStrict;
    1201512015}
    1201612016
Note: See TracChangeset for help on using the changeset viewer.

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