VirtualBox

Changeset 70352 in vbox for trunk/src/VBox/VMM/VMMR0


Ignore:
Timestamp:
Dec 27, 2017 7:56:22 AM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
119952
Message:

VMM/HM,CPUM: SVM VMCB layout adjustments.

File:
1 edited

Legend:

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

    r70303 r70352  
    798798    bool const fUsePauseFilter       = fPauseFilter && pVM->hm.s.svm.cPauseFilter && pVM->hm.s.svm.cPauseFilterThresholdTicks;
    799799
     800    bool const fLbrVirt              = RT_BOOL(pVM->hm.s.svm.u32Features & X86_CPUID_SVM_FEATURE_EDX_LBR_VIRT);
     801    bool const fUseLbrVirt           = fLbrVirt; /** @todo CFGM etc. */
     802
    800803    for (VMCPUID i = 0; i < pVM->cCpus; i++)
    801804    {
     
    858861        pVmcb->ctrl.u64MSRPMPhysAddr = pVCpu->hm.s.svm.HCPhysMsrBitmap;
    859862
    860         /* No LBR virtualization. */
    861         Assert(pVmcb->ctrl.u1LbrVirt == 0);
     863        /* LBR virtualization. */
     864        if (fUseLbrVirt)
     865        {
     866            pVmcb->ctrl.LbrVirt.n.u1LbrVirt = fUseLbrVirt;
     867            pVmcb->guest.u64DBGCTL = MSR_IA32_DEBUGCTL_LBR;
     868        }
     869        else
     870            Assert(pVmcb->ctrl.LbrVirt.n.u1LbrVirt == 0);
    862871
    863872        /* Initially all VMCB clean bits MBZ indicating that everything should be loaded from the VMCB in memory. */
     
    875884
    876885        /* Setup Nested Paging. This doesn't change throughout the execution time of the VM. */
    877         pVmcb->ctrl.u1NestedPaging = pVM->hm.s.fNestedPaging;
     886        pVmcb->ctrl.NestedPaging.n.u1NestedPaging = pVM->hm.s.fNestedPaging;
    878887
    879888        /* Without Nested Paging, we need additionally intercepts. */
     
    21082117               ("fContextUseFlags=%#RX32\n", HMCPU_CF_VALUE(pVCpu)));
    21092118
    2110     Log4(("hmR0SvmLoadGuestState: CS:RIP=%04x:%RX64 EFL=%#x CR0=%#RX32 CR3=%#RX32 CR4=%#RX32\n", pCtx->cs.Sel, pCtx->rip,
    2111           pCtx->eflags.u, pCtx->cr0, pCtx->cr3, pCtx->cr4));
     2119    Log4(("hmR0SvmLoadGuestState: CS:RIP=%04x:%RX64 EFL=%#x CR0=%#RX32 CR3=%#RX32 CR4=%#RX32 ESP=%#RX32 EBP=%#RX32\n",
     2120          pCtx->cs.Sel, pCtx->rip, pCtx->eflags.u, pCtx->cr0, pCtx->cr3, pCtx->cr4, pCtx->esp, pCtx->ebp));
     2121    Log4(("hmR0SvmLoadGuestState: SS={%04x base=%016RX64 limit=%08x flags=%08x}\n", pCtx->ss.Sel, pCtx->ss.u64Base,
     2122          pCtx->ss.u32Limit, pCtx->ss.Attr.u));
    21122123    STAM_PROFILE_ADV_STOP(&pVCpu->hm.s.StatLoadGuestState, x);
    21132124    return rc;
     
    21522163        pNstGstVmcbCache->u64CR4            = pVmcbNstGstState->u64CR4;
    21532164        pNstGstVmcbCache->u64EFER           = pVmcbNstGstState->u64EFER;
     2165        pNstGstVmcbCache->u64DBGCTL         = pVmcbNstGstState->u64DBGCTL;
    21542166        pNstGstVmcbCache->u64IOPMPhysAddr   = pVmcbNstGstCtrl->u64IOPMPhysAddr;
    21552167        pNstGstVmcbCache->u64MSRPMPhysAddr  = pVmcbNstGstCtrl->u64MSRPMPhysAddr;
     
    21582170        pNstGstVmcbCache->fVIntrMasking     = pVmcbNstGstCtrl->IntCtrl.n.u1VIntrMasking;
    21592171        pNstGstVmcbCache->TLBCtrl           = pVmcbNstGstCtrl->TLBCtrl;
    2160         pNstGstVmcbCache->u1NestedPaging    = pVmcbNstGstCtrl->u1NestedPaging;
     2172        pNstGstVmcbCache->u1NestedPaging    = pVmcbNstGstCtrl->NestedPaging.n.u1NestedPaging;
     2173        pNstGstVmcbCache->u1LbrVirt         = pVmcbNstGstCtrl->LbrVirt.n.u1LbrVirt;
    21612174        pCtx->hwvirt.svm.fHMCachedVmcb      = true;
    21622175        Log4(("hmR0SvmVmRunCacheVmcb: Cached VMCB fields\n"));
     
    22022215         * end of Trap0eHandler in PGMAllBth.h).
    22032216         */
    2204         pVmcbNstGstCtrl->u1NestedPaging = pVCpu->CTX_SUFF(pVM)->hm.s.fNestedPaging;
     2217        pVmcbNstGstCtrl->NestedPaging.n.u1NestedPaging = pVCpu->CTX_SUFF(pVM)->hm.s.fNestedPaging;
     2218
     2219        /* For now copy the LBR info. from outer guest VMCB. */
     2220        /** @todo fix this later. */
     2221        PCSVMVMCB pVmcb = pVCpu->hm.s.svm.pVmcb;
     2222        pVmcbNstGstCtrl->LbrVirt.n.u1LbrVirt = pVmcb->ctrl.LbrVirt.n.u1LbrVirt;
     2223        pVmcbNstGst->guest.u64DBGCTL = pVmcb->guest.u64DBGCTL;
    22052224    }
    22062225    else
     
    22082227        Assert(pVmcbNstGstCtrl->u64IOPMPhysAddr == g_HCPhysIOBitmap);
    22092228        Assert(pVmcbNstGstCtrl->u64MSRPMPhysAddr = g_HCPhysNstGstMsrBitmap);
    2210         Assert(RT_BOOL(pVmcbNstGstCtrl->u1NestedPaging) == pVCpu->CTX_SUFF(pVM)->hm.s.fNestedPaging);
     2229        Assert(RT_BOOL(pVmcbNstGstCtrl->NestedPaging.n.u1NestedPaging) == pVCpu->CTX_SUFF(pVM)->hm.s.fNestedPaging);
    22112230    }
    22122231}
     
    22692288          "ESP=%#RX32 EBP=%#RX32 rc=%d\n", pCtx->cs.Sel, pCtx->rip, pCtx->eflags.u, pCtx->cr0, pCtx->cr3,
    22702289          pVmcbNstGst->guest.u64CR3, pCtx->cr4, pCtx->esp, pCtx->ebp, rc));
     2290    Log4(("hmR0SvmLoadGuestStateNested: SS={%04x base=%016RX64 limit=%08x flags=%08x}\n", pCtx->ss.Sel, pCtx->ss.u64Base,
     2291          pCtx->ss.u32Limit, pCtx->ss.Attr.u));
    22712292    STAM_PROFILE_ADV_STOP(&pVCpu->hm.s.StatLoadGuestState, x);
    22722293
     
    23452366     * Guest interrupt shadow.
    23462367     */
    2347     if (pVmcb->ctrl.u1IntShadow)
     2368    if (pVmcb->ctrl.IntShadow.n.u1IntShadow)
    23482369        EMSetInhibitInterruptsPC(pVCpu, pMixedCtx->rip);
    23492370    else if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS))
     
    24172438     */
    24182439    Assert(!(pVmcb->guest.u8CPL & ~0x3));
    2419     pMixedCtx->ss.Attr.n.u2Dpl = pVmcb->guest.u8CPL & 0x3;
     2440    uint8_t const uCpl = pVmcb->guest.u8CPL;
     2441    if (pMixedCtx->ss.Attr.n.u2Dpl != uCpl)
     2442    {
     2443        Log4(("hmR0SvmSaveGuestState: CPL differs. SS.DPL=%u, CPL=%u, overwriting SS.DPL!\n", pMixedCtx->ss.Attr.n.u2Dpl, uCpl));
     2444        pMixedCtx->ss.Attr.n.u2Dpl = pVmcb->guest.u8CPL & 0x3;
     2445    }
    24202446
    24212447    /*
     
    24632489     * This is done as the very last step of syncing the guest state, as PGMUpdateCR3() may cause longjmp's to ring-3.
    24642490     */
    2465     if (   pVmcb->ctrl.u1NestedPaging
     2491    if (   pVmcb->ctrl.NestedPaging.n.u1NestedPaging
    24662492        && pMixedCtx->cr3 != pVmcb->guest.u64CR3)
    24672493    {
     
    24702496    }
    24712497
    2472     Log4(("hmR0SvmSaveGuestState: CS:RIP=%04x:%RX64 EFL=%#x CR0=%#RX32 CR3=%#RX32 CR4=%#RX32\n", pMixedCtx->cs.Sel,
    2473           pMixedCtx->rip, pMixedCtx->eflags.u, pMixedCtx->cr0, pMixedCtx->cr3, pMixedCtx->cr4));
     2498    if (CPUMIsGuestInSvmNestedHwVirtMode(pMixedCtx))
     2499    {
     2500        Log4(("hmR0SvmSaveGuestState: CS:RIP=%04x:%RX64 EFL=%#x CR0=%#RX32 CR3=%#RX32 CR4=%#RX32 ESP=%#RX32 EBP=%#RX32\n",
     2501              pMixedCtx->cs.Sel, pMixedCtx->rip, pMixedCtx->eflags.u, pMixedCtx->cr0, pMixedCtx->cr3, pMixedCtx->cr4,
     2502              pMixedCtx->esp, pMixedCtx->ebp));
     2503        Log4(("hmR0SvmSaveGuestState: SS={%04x base=%016RX64 limit=%08x flags=%08x}\n", pMixedCtx->ss.Sel, pMixedCtx->ss.u64Base,
     2504              pMixedCtx->ss.u32Limit, pMixedCtx->ss.Attr.u));
     2505        Log4(("hmR0SvmSaveGuestState: DBGCTL BR_FROM=%#RX64 BR_TO=%#RX64 XcptFrom=%#RX64 XcptTo=%#RX64\n",
     2506              pVmcb->guest.u64BR_FROM, pVmcb->guest.u64BR_TO,pVmcb->guest.u64LASTEXCPFROM, pVmcb->guest.u64LASTEXCPTO));
     2507    }
    24742508}
    24752509
     
    34933527     * the nested-guest but execution later continues here with an interrupt shadow active.
    34943528     */
    3495     pVmcb->ctrl.u1IntShadow = fIntShadow;
     3529    pVmcb->ctrl.IntShadow.n.u1IntShadow = fIntShadow;
    34963530}
    34973531
     
    35453579        Log4(("ctrl.IntCtrl.u24Reserved          %#x\n",      pVmcb->ctrl.IntCtrl.n.u24Reserved));
    35463580
    3547         Log4(("ctrl.u1IntShadow                  %#x\n",      pVmcb->ctrl.u1IntShadow));
    3548         Log4(("ctrl.u1GuestIntMask               %#x\n",      pVmcb->ctrl.u1GuestIntMask));
     3581        Log4(("ctrl.IntShadow.u1IntShadow        %#x\n",      pVmcb->ctrl.IntShadow.n.u1IntShadow));
     3582        Log4(("ctrl.IntShadow.u1GuestIntMask     %#x\n",      pVmcb->ctrl.IntShadow.n.u1GuestIntMask));
    35493583        Log4(("ctrl.u64ExitCode                  %#RX64\n",   pVmcb->ctrl.u64ExitCode));
    35503584        Log4(("ctrl.u64ExitInfo1                 %#RX64\n",   pVmcb->ctrl.u64ExitInfo1));
     
    35563590        Log4(("ctrl.ExitIntInfo.u1Valid          %#x\n",      pVmcb->ctrl.ExitIntInfo.n.u1Valid));
    35573591        Log4(("ctrl.ExitIntInfo.u32ErrorCode     %#x\n",      pVmcb->ctrl.ExitIntInfo.n.u32ErrorCode));
    3558         Log4(("ctrl.u1NestedPaging               %#x\n",      pVmcb->ctrl.u1NestedPaging));
    3559         Log4(("ctrl.u1Sev                        %#x\n",      pVmcb->ctrl.u1Sev));
    3560         Log4(("ctrl.u1SevEs                      %#x\n",      pVmcb->ctrl.u1SevEs));
     3592        Log4(("ctrl.NestedPaging.u1NestedPaging  %#x\n",      pVmcb->ctrl.NestedPaging.n.u1NestedPaging));
     3593        Log4(("ctrl.NestedPaging.u1Sev           %#x\n",      pVmcb->ctrl.NestedPaging.n.u1Sev));
     3594        Log4(("ctrl.NestedPaging.u1SevEs         %#x\n",      pVmcb->ctrl.NestedPaging.n.u1SevEs));
    35613595        Log4(("ctrl.EventInject.u8Vector         %#x\n",      pVmcb->ctrl.EventInject.n.u8Vector));
    35623596        Log4(("ctrl.EventInject.u3Type           %#x\n",      pVmcb->ctrl.EventInject.n.u3Type));
     
    35683602        Log4(("ctrl.u64NestedPagingCR3           %#RX64\n",   pVmcb->ctrl.u64NestedPagingCR3));
    35693603
    3570         Log4(("ctrl.u1Lbrvirt                    %#x\n",      pVmcb->ctrl.u1LbrVirt));
    3571         Log4(("ctrl.u1VirtVmsaveVmload           %#x\n",      pVmcb->ctrl.u1VirtVmsaveVmload));
     3604        Log4(("ctrl.LbrVirt.u1LbrVirt            %#x\n",      pVmcb->ctrl.LbrVirt.n.u1LbrVirt));
     3605        Log4(("ctrl.LbrVirt.u1VirtVmsaveVmload   %#x\n",      pVmcb->ctrl.LbrVirt.n.u1VirtVmsaveVmload));
    35723606
    35733607        Log4(("guest.CS.u16Sel                   %RTsel\n",   pVmcb->guest.CS.u16Sel));
     
    48624896        case SVM_EXIT_IOIO:
    48634897        {
    4864             /*
    4865              * Figure out if the IO port access is intercepted by the nested-guest.
    4866              */
    48674898            if (HMIsGuestSvmCtrlInterceptSet(pVCpu, pCtx, SVM_CTRL_INTERCEPT_IOIO_PROT))
    48684899            {
     
    50705101                    if (HMIsGuestSvmXcptInterceptSet(pVCpu, pCtx, uVector))
    50715102                        return HM_SVM_VMEXIT_NESTED(pVCpu, uExitCode, uExitInfo1, uExitInfo2);
     5103#if 0
     5104                    /* Debugging DOS6 triple-fault nested-VM. */
     5105                    unsigned    cbInstr;
     5106                    DISCPUSTATE Dis;
     5107                    int rc = EMInterpretDisasCurrent(pVCpu->CTX_SUFF(pVM), pVCpu, &Dis, &cbInstr);
     5108                    if (RT_SUCCESS(rc))
     5109                    {
     5110                        RT_NOREF(cbInstr);
     5111                        if (   Dis.pCurInstr->uOpcode == OP_IRET
     5112                            && uVector == X86_XCPT_GP)
     5113                        {
     5114                            Log4(("#GP on IRET detected!\n"));
     5115                            return VERR_IEM_INSTR_NOT_IMPLEMENTED;
     5116                        }
     5117                    }
     5118                    else
     5119                        Log4(("hmR0SvmExitXcptGeneric: failed to disassemble instr. rc=%Rrc\n", rc));
     5120#endif
    50725121                    return hmR0SvmExitXcptGeneric(pVCpu, pCtx, pSvmTransient);
    50735122                }
     
    54075456
    54085457                        case X86_XCPT_GP:
     5458                        {
    54095459                            Event.n.u1ErrorCodeValid    = 1;
    54105460                            Event.n.u32ErrorCode        = pVmcb->ctrl.u64ExitInfo1;
    54115461                            STAM_COUNTER_INC(&pVCpu->hm.s.StatExitGuestGP);
    54125462                            break;
     5463                        }
    54135464
    54145465                        default:
     
    75897640    Assert(pSvmTransient->u64ExitCode == pVmcb->ctrl.u64ExitCode);
    75907641    Assert(uVector <= X86_XCPT_LAST);
     7642    Log4(("hmR0SvmExitXcptGeneric: uVector=%#x uErrCode=%u\n", uVector, uErrCode));
    75917643
    75927644    SVMEVENT Event;
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