VirtualBox

Changeset 78715 in vbox for trunk/include/VBox


Ignore:
Timestamp:
May 24, 2019 11:16:11 AM (6 years ago)
Author:
vboxsync
Message:

cpum.h: Nested VMX: bugref:9180 Add CPUMIsGuestVmxLmswInterceptSet for upcoming changes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/cpum.h

    r78688 r78715  
    21632163    PCVMXVVMCS pVmcs = pCtx->hwvirt.vmx.CTX_SUFF(pVmcs);
    21642164    Assert(pVmcs);
    2165     Assert(CPUMIsGuestInVmxRootMode(pCtx));
     2165    Assert(CPUMIsGuestInVmxNonRootMode(pCtx));
    21662166    uint64_t const uGstCr0      = pCtx->cr0;
    21672167    uint64_t const fGstHostMask = pVmcs->u64Cr0Mask.u;
     
    21892189    PCVMXVVMCS pVmcs = pCtx->hwvirt.vmx.CTX_SUFF(pVmcs);
    21902190    Assert(pVmcs);
    2191     Assert(CPUMIsGuestInVmxRootMode(pCtx));
     2191    Assert(CPUMIsGuestInVmxNonRootMode(pCtx));
    21922192    uint64_t const uGstCr4      = pCtx->cr4;
    21932193    uint64_t const fGstHostMask = pVmcs->u64Cr4Mask.u;
    21942194    uint64_t const fReadShadow  = pVmcs->u64Cr4ReadShadow.u;
    21952195    return (fReadShadow & fGstHostMask) | (uGstCr4 & ~fGstHostMask);
     2196}
     2197
     2198
     2199/**
     2200 * Checks whether the LMSW access causes a VM-exit or not.
     2201 *
     2202 * @returns @c true if the LMSW access causes a VM-exit, @c false otherwise.
     2203 * @param   pVCpu       The cross context virtual CPU structure of the calling EMT.
     2204 * @param   pCtx        Pointer to the context.
     2205 * @param   uNewMsw     The LMSW source operand (the Machine Status Word).
     2206 */
     2207DECLINLINE(bool) CPUMIsGuestVmxLmswInterceptSet(PVMCPU pVCpu, PCCPUMCTX pCtx, uint16_t uNewMsw)
     2208{
     2209    /*
     2210     * LMSW VM-exits are subject to the CR0 guest/host mask and the CR0 read shadow.
     2211     *
     2212     * See Intel spec. 24.6.6 "Guest/Host Masks and Read Shadows for CR0 and CR4".
     2213     * See Intel spec. 25.1.3 "Instructions That Cause VM Exits Conditionally".
     2214     */
     2215    RT_NOREF(pVCpu);
     2216    PCVMXVVMCS pVmcs = pCtx->hwvirt.vmx.CTX_SUFF(pVmcs);
     2217    Assert(pVmcs);
     2218    Assert(CPUMIsGuestInVmxNonRootMode(pCtx));
     2219
     2220    uint32_t const fGstHostMask = pVmcs->u64Cr0Mask.u;
     2221    uint32_t const fReadShadow  = pVmcs->u64Cr0ReadShadow.u;
     2222
     2223    /*
     2224     * LMSW can never clear CR0.PE but it may set it. Hence, we handle the
     2225     * CR0.PE case first, before the rest of the bits in the MSW.
     2226     *
     2227     * If CR0.PE is owned by the host and CR0.PE differs between the
     2228     * MSW (source operand) and the read-shadow, we must cause a VM-exit.
     2229     */
     2230    if (    (fGstHostMask & X86_CR0_PE)
     2231        &&  (uNewMsw      & X86_CR0_PE)
     2232        && !(fReadShadow  & X86_CR0_PE))
     2233        return true;
     2234
     2235    /*
     2236     * If CR0.MP, CR0.EM or CR0.TS is owned by the host, and the corresponding
     2237     * bits differ between the MSW (source operand) and the read-shadow, we must
     2238     * cause a VM-exit.
     2239     */
     2240    uint32_t const fGstHostLmswMask = fGstHostMask & (X86_CR0_MP | X86_CR0_EM | X86_CR0_TS);
     2241    if ((fReadShadow & fGstHostLmswMask) != (uNewMsw & fGstHostLmswMask))
     2242        return true;
     2243
     2244    return false;
    21962245}
    21972246
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