VirtualBox

Changeset 85806 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Aug 18, 2020 7:24:05 AM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
139963
Message:

HMSVMR0: bugref:9618 Virtualized VMSAVE/VMLOAD fix.

File:
1 edited

Legend:

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

    r83485 r85806  
    999999    /* Set up unconditional intercepts and conditions. */
    10001000    pVmcbCtrl0->u64InterceptCtrl = HMSVM_MANDATORY_GUEST_CTRL_INTERCEPTS
    1001                                  | SVM_CTRL_INTERCEPT_VMMCALL;
     1001                                 | SVM_CTRL_INTERCEPT_VMMCALL
     1002                                 | SVM_CTRL_INTERCEPT_VMSAVE
     1003                                 | SVM_CTRL_INTERCEPT_VMLOAD
     1004                                 | SVM_CTRL_INTERCEPT_CLGI
     1005                                 | SVM_CTRL_INTERCEPT_STGI;
    10021006
    10031007#ifdef HMSVM_ALWAYS_TRAP_TASK_SWITCH
     
    10061010
    10071011#ifdef VBOX_WITH_NESTED_HWVIRT_SVM
    1008     /* Virtualized VMSAVE/VMLOAD. */
    1009     pVmcbCtrl0->LbrVirt.n.u1VirtVmsaveVmload = fUseVirtVmsaveVmload;
    1010     if (!fUseVirtVmsaveVmload)
    1011         pVmcbCtrl0->u64InterceptCtrl |= SVM_CTRL_INTERCEPT_VMSAVE
    1012                                      |  SVM_CTRL_INTERCEPT_VMLOAD;
    1013 
    1014     /* Virtual GIF. */
    1015     pVmcbCtrl0->IntCtrl.n.u1VGifEnable = fUseVGif;
    1016     if (!fUseVGif)
    1017         pVmcbCtrl0->u64InterceptCtrl |= SVM_CTRL_INTERCEPT_CLGI
    1018                                      |  SVM_CTRL_INTERCEPT_STGI;
     1012    if (pVCpu0->CTX_SUFF(pVM)->cpum.ro.GuestFeatures.fSvm)
     1013    {
     1014        /* Virtualized VMSAVE/VMLOAD. */
     1015        if (fUseVirtVmsaveVmload)
     1016        {
     1017            pVmcbCtrl0->LbrVirt.n.u1VirtVmsaveVmload = 1;
     1018            pVmcbCtrl0->u64InterceptCtrl &= ~(  SVM_CTRL_INTERCEPT_VMSAVE
     1019                                              | SVM_CTRL_INTERCEPT_VMLOAD);
     1020        }
     1021        else
     1022            Assert(!pVmcbCtrl0->LbrVirt.n.u1VirtVmsaveVmload);
     1023
     1024        /* Virtual GIF. */
     1025        if (fUseVGif)
     1026        {
     1027            pVmcbCtrl0->IntCtrl.n.u1VGifEnable = 1;
     1028            pVmcbCtrl0->u64InterceptCtrl &= ~(  SVM_CTRL_INTERCEPT_CLGI
     1029                                              | SVM_CTRL_INTERCEPT_STGI);
     1030        }
     1031        else
     1032            Assert(!pVmcbCtrl0->IntCtrl.n.u1VGifEnable);
     1033    }
     1034    else
    10191035#endif
     1036    {
     1037        Assert(!pVCpu0->CTX_SUFF(pVM)->cpum.ro.GuestFeatures.fSvm);
     1038        Assert(!pVmcbCtrl0->LbrVirt.n.u1VirtVmsaveVmload);
     1039        Assert(!pVmcbCtrl0->IntCtrl.n.u1VGifEnable);
     1040    }
    10201041
    10211042    /* CR4 writes must always be intercepted for tracking PGM mode changes. */
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