VirtualBox

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


Ignore:
Timestamp:
Jun 22, 2018 11:36:36 AM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
123172
Message:

HMSVMR0.cpp: Shortened hmR0SvmImportGuestState a little. bugref:9193

File:
1 edited

Legend:

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

    r72655 r72661  
    27852785
    27862786    Log4(("hmR0SvmImportGuestState: fExtrn=%#RX64 fWhat=%#RX64\n", pCtx->fExtrn, fWhat));
    2787     if (pCtx->fExtrn & HMSVM_CPUMCTX_EXTRN_ALL)
    2788     {
    2789         fWhat &= pCtx->fExtrn;
    2790 
     2787
     2788    /*
     2789     * We disable interrupts to make the updating of the state and in particular
     2790     * the fExtrn modification atomic wrt to preemption hooks.
     2791     */
     2792    RTCCUINTREG const fSavedFlags = ASMIntDisableFlags();
     2793
     2794    fWhat &= pCtx->fExtrn;
     2795    if (fWhat & pCtx->fExtrn)
     2796    {
    27912797#ifdef VBOX_WITH_NESTED_HWVIRT_SVM
    27922798        if (fWhat & CPUMCTX_EXTRN_HWVIRT)
     
    27992805                pCtx->hwvirt.fGif = pVmcbCtrl->IntCtrl.n.u1VGif;
    28002806            }
    2801             ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_HWVIRT);
    28022807        }
    28032808
     
    28072812                && VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_INTERRUPT_NESTED_GUEST))
    28082813                VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INTERRUPT_NESTED_GUEST);
    2809             ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_HM_SVM_HWVIRT_VIRQ);
    2810         }
    2811 #else
    2812         ASMAtomicUoAndU64(&pCtx->fExtrn, ~(CPUMCTX_EXTRN_HWVIRT | CPUMCTX_EXTRN_HM_SVM_HWVIRT_VIRQ));
     2814        }
    28132815#endif
    28142816
     
    28192821            else if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS))
    28202822                VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS);
    2821             ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_HM_SVM_INT_SHADOW);
    28222823        }
    28232824
    28242825        if (fWhat & CPUMCTX_EXTRN_RIP)
    2825         {
    28262826            pCtx->rip = pVmcbGuest->u64RIP;
    2827             ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_RIP);
    2828         }
    28292827
    28302828        if (fWhat & CPUMCTX_EXTRN_RFLAGS)
    2831         {
    28322829            pCtx->eflags.u32 = pVmcbGuest->u64RFlags;
    2833             ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_RFLAGS);
    2834         }
    28352830
    28362831        if (fWhat & CPUMCTX_EXTRN_RSP)
    2837         {
    28382832            pCtx->rsp = pVmcbGuest->u64RSP;
    2839             ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_RSP);
    2840         }
    28412833
    28422834        if (fWhat & CPUMCTX_EXTRN_RAX)
    2843         {
    28442835            pCtx->rax = pVmcbGuest->u64RAX;
    2845             ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_RAX);
    2846         }
    28472836
    28482837        if (fWhat & CPUMCTX_EXTRN_SREG_MASK)
     
    28652854                }
    28662855                HMSVM_ASSERT_SEG_GRANULARITY(pCtx, cs);
    2867                 ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_CS);
    28682856            }
    28692857            if (fWhat & CPUMCTX_EXTRN_SS)
     
    28812869                if (pCtx->ss.Attr.n.u2Dpl != uCpl)
    28822870                    pCtx->ss.Attr.n.u2Dpl = uCpl & 0x3;
    2883                 ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_SS);
    28842871            }
    28852872            if (fWhat & CPUMCTX_EXTRN_DS)
     
    28872874                HMSVM_SEG_REG_COPY_FROM_VMCB(pCtx, pVmcbGuest, DS, ds);
    28882875                HMSVM_ASSERT_SEG_GRANULARITY(pCtx, ds);
    2889                 ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_DS);
    28902876            }
    28912877            if (fWhat & CPUMCTX_EXTRN_ES)
     
    28932879                HMSVM_SEG_REG_COPY_FROM_VMCB(pCtx, pVmcbGuest, ES, es);
    28942880                HMSVM_ASSERT_SEG_GRANULARITY(pCtx, es);
    2895                 ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_ES);
    28962881            }
    28972882            if (fWhat & CPUMCTX_EXTRN_FS)
     
    28992884                HMSVM_SEG_REG_COPY_FROM_VMCB(pCtx, pVmcbGuest, FS, fs);
    29002885                HMSVM_ASSERT_SEG_GRANULARITY(pCtx, fs);
    2901                 ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_FS);
    29022886            }
    29032887            if (fWhat & CPUMCTX_EXTRN_GS)
     
    29052889                HMSVM_SEG_REG_COPY_FROM_VMCB(pCtx, pVmcbGuest, GS, gs);
    29062890                HMSVM_ASSERT_SEG_GRANULARITY(pCtx, gs);
    2907                 ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_GS);
    29082891            }
    29092892        }
     
    29272910                        pCtx->tr.Attr.n.u4Type = X86_SEL_TYPE_SYS_286_TSS_BUSY;
    29282911                }
    2929                 ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_TR);
    29302912            }
    29312913
    29322914            if (fWhat & CPUMCTX_EXTRN_LDTR)
    2933             {
    29342915                HMSVM_SEG_REG_COPY_FROM_VMCB(pCtx, pVmcbGuest, LDTR, ldtr);
    2935                 ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_LDTR);
    2936             }
    29372916
    29382917            if (fWhat & CPUMCTX_EXTRN_GDTR)
     
    29402919                pCtx->gdtr.cbGdt = pVmcbGuest->GDTR.u32Limit;
    29412920                pCtx->gdtr.pGdt  = pVmcbGuest->GDTR.u64Base;
    2942                 ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_GDTR);
    29432921            }
    29442922
     
    29472925                pCtx->idtr.cbIdt = pVmcbGuest->IDTR.u32Limit;
    29482926                pCtx->idtr.pIdt  = pVmcbGuest->IDTR.u64Base;
    2949                 ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_IDTR);
    29502927            }
    29512928        }
     
    29572934            pCtx->msrCSTAR  = pVmcbGuest->u64CSTAR;
    29582935            pCtx->msrSFMASK = pVmcbGuest->u64SFMASK;
    2959             ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_SYSCALL_MSRS);
    29602936        }
    29612937
     
    29652941            pCtx->SysEnter.eip = pVmcbGuest->u64SysEnterEIP;
    29662942            pCtx->SysEnter.esp = pVmcbGuest->u64SysEnterESP;
    2967             ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_SYSENTER_MSRS);
    29682943        }
    29692944
    29702945        if (fWhat & CPUMCTX_EXTRN_KERNEL_GS_BASE)
    2971         {
    29722946            pCtx->msrKERNELGSBASE = pVmcbGuest->u64KernelGSBase;
    2973             ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_KERNEL_GS_BASE);
    2974         }
    29752947
    29762948        if (fWhat & CPUMCTX_EXTRN_DR_MASK)
     
    29822954                else
    29832955                    CPUMSetHyperDR6(pVCpu, pVmcbGuest->u64DR6);
    2984                 ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_DR6);
    29852956            }
    29862957
     
    29912962                else
    29922963                    Assert(pVmcbGuest->u64DR7 == CPUMGetHyperDR7(pVCpu));
    2993                 ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_DR7);
    29942964            }
    29952965        }
     
    30022972                uint64_t const uCr0 = (pCtx->cr0          & ~(X86_CR0_TS | X86_CR0_MP))
    30032973                                    | (pVmcbGuest->u64CR0 &  (X86_CR0_TS | X86_CR0_MP));
     2974                VMMRZCallRing3Disable(pVCpu); /* CPUM has log statements and calls into PGM. */
    30042975                CPUMSetGuestCR0(pVCpu, uCr0);
    3005                 ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_CR0);
     2976                VMMRZCallRing3Enable(pVCpu);
    30062977            }
    30072978
    30082979            if (fWhat & CPUMCTX_EXTRN_CR2)
    3009             {
    30102980                pCtx->cr2 = pVmcbGuest->u64CR2;
    3011                 ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_CR2);
    3012             }
    30132981
    30142982            if (fWhat & CPUMCTX_EXTRN_CR3)
     
    30182986                {
    30192987                    CPUMSetGuestCR3(pVCpu, pVmcbGuest->u64CR3);
    3020                     if (VMMRZCallRing3IsEnabled(pVCpu))
    3021                     {
    3022                         Log4(("hmR0SvmImportGuestState: Calling PGMUpdateCR3\n"));
    3023                         PGMUpdateCR3(pVCpu, pVmcbGuest->u64CR3);
    3024                     }
    3025                     else
    3026                     {
    3027                         Log4(("hmR0SvmImportGuestState: Setting VMCPU_FF_HM_UPDATE_CR3\n"));
    3028                         VMCPU_FF_SET(pVCpu, VMCPU_FF_HM_UPDATE_CR3);
    3029                     }
     2988                    VMCPU_FF_SET(pVCpu, VMCPU_FF_HM_UPDATE_CR3);
    30302989                }
    3031                 ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_CR3);
    30322990            }
    30332991
    30342992            /* Changes to CR4 are always intercepted. */
    30352993        }
     2994
     2995        /* Update fExtrn. */
     2996        pCtx->fExtrn &= ~fWhat;
    30362997
    30372998        /* If everything has been imported, clear the HM keeper bit. */
    30382999        if (!(pCtx->fExtrn & HMSVM_CPUMCTX_EXTRN_ALL))
    30393000        {
    3040             ASMAtomicUoAndU64(&pCtx->fExtrn, ~CPUMCTX_EXTRN_KEEPER_HM);
     3001            pCtx->fExtrn &= ~CPUMCTX_EXTRN_KEEPER_HM;
    30413002            Assert(!pCtx->fExtrn);
    30423003        }
    30433004    }
    30443005    else
    3045         Assert(!pCtx->fExtrn);
     3006        Assert(!pCtx->fExtrn || (pCtx->fExtrn & HMSVM_CPUMCTX_EXTRN_ALL));
     3007
     3008    ASMSetFlags(fSavedFlags);
    30463009
    30473010    /*
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