VirtualBox

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


Ignore:
Timestamp:
Sep 17, 2021 8:56:45 PM (3 years ago)
Author:
vboxsync
Message:

VMM/CPUM,++: Moved the nested VT-X I/O permission bitmap allocations into CPUMCTX. bugref:10093

Location:
trunk/src/VBox/VMM
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp

    r91301 r91305  
    24782478 *
    24792479 * @returns @c true if the I/O port access must cause a VM-exit, @c false otherwise.
    2480  * @param   pvIoBitmap  Pointer to I/O bitmap.
     2480 * @param   pbIoBitmap  Pointer to I/O bitmap.
    24812481 * @param   uPort       The I/O port being accessed.
    24822482 * @param   cbAccess    e size of the I/O access in bytes (1, 2 or 4 bytes).
    24832483 */
    2484 static bool cpumGetVmxIoBitmapPermission(void const *pvIoBitmap, uint16_t uPort, uint8_t cbAccess)
     2484static bool cpumGetVmxIoBitmapPermission(uint8_t const *pbIoBitmap, uint16_t uPort, uint8_t cbAccess)
    24852485{
    24862486    Assert(cbAccess == 1 || cbAccess == 2 || cbAccess == 4);
     
    25042504     * If any bit corresponding to the I/O access is set, we must cause a VM-exit.
    25052505     */
    2506     uint8_t const *pbIoBitmap = (uint8_t const *)pvIoBitmap;
    25072506    uint16_t const offPerm    = uPort >> 3;                         /* Byte offset of the port. */
    25082507    uint16_t const idxPermBit = uPort - (offPerm << 3);             /* Bit offset within byte. */
     
    25132512    /* Fetch 8 or 16-bits depending on whether the access spans 8-bit boundary. */
    25142513    RTUINT16U uPerm;
    2515     uPerm.s.Lo = *(pbIoBitmap + offPerm);
     2514    uPerm.s.Lo = pbIoBitmap[offPerm];
    25162515    if (idxPermBit + cbAccess > 8)
    2517         uPerm.s.Hi = *(pbIoBitmap + 1 + offPerm);
     2516        uPerm.s.Hi = pbIoBitmap[offPerm + 1];
    25182517    else
    25192518        uPerm.s.Hi = 0;
     
    28022801
    28032802    if (CPUMIsGuestVmxProcCtlsSet(pCtx, VMX_PROC_CTLS_USE_IO_BITMAPS))
    2804     {
    2805         uint8_t const *pbIoBitmap = (uint8_t const *)pCtx->hwvirt.vmx.CTX_SUFF(pvIoBitmap);
    2806         Assert(pbIoBitmap);
    2807         return cpumGetVmxIoBitmapPermission(pbIoBitmap, u16Port, cbAccess);
    2808     }
     2803        return cpumGetVmxIoBitmapPermission(pCtx->hwvirt.vmx.abIoBitmap, u16Port, cbAccess);
    28092804
    28102805    return false;
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImplVmxInstr.cpp.h

    r91304 r91305  
    66636663        /* Read the IO bitmap A. */
    66646664        RTGCPHYS const GCPhysIoBitmapA = pVmcs->u64AddrIoBitmapA.u;
    6665         Assert(pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pvIoBitmap));
    6666         int rc = PGMPhysSimpleReadGCPhys(pVCpu->CTX_SUFF(pVM), pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pvIoBitmap),
     6665        int rc = PGMPhysSimpleReadGCPhys(pVCpu->CTX_SUFF(pVM), &pVCpu->cpum.GstCtx.hwvirt.vmx.abIoBitmap[0],
    66676666                                         GCPhysIoBitmapA, VMX_V_IO_BITMAP_A_SIZE);
    66686667        if (RT_SUCCESS(rc))
     
    66736672        /* Read the IO bitmap B. */
    66746673        RTGCPHYS const GCPhysIoBitmapB = pVmcs->u64AddrIoBitmapB.u;
    6675         uint8_t *pbIoBitmapB = (uint8_t *)pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pvIoBitmap) + VMX_V_IO_BITMAP_A_SIZE;
    6676         rc = PGMPhysSimpleReadGCPhys(pVCpu->CTX_SUFF(pVM), pbIoBitmapB, GCPhysIoBitmapB, VMX_V_IO_BITMAP_B_SIZE);
     6674        rc = PGMPhysSimpleReadGCPhys(pVCpu->CTX_SUFF(pVM), &pVCpu->cpum.GstCtx.hwvirt.vmx.abIoBitmap[VMX_V_IO_BITMAP_A_SIZE],
     6675                                    GCPhysIoBitmapB, VMX_V_IO_BITMAP_B_SIZE);
    66776676        if (RT_SUCCESS(rc))
    66786677        { /* likely */ }
  • trunk/src/VBox/VMM/VMMR3/CPUM.cpp

    r91304 r91305  
    10671067            pCtx->hwvirt.vmx.pvVirtApicPageR3 = NULL;
    10681068        }
    1069         if (pCtx->hwvirt.vmx.pvIoBitmapR3)
    1070         {
    1071             SUPR3ContFree(pCtx->hwvirt.vmx.pvIoBitmapR3, VMX_V_IO_BITMAP_A_PAGES + VMX_V_IO_BITMAP_B_PAGES);
    1072             pCtx->hwvirt.vmx.pvIoBitmapR3 = NULL;
    1073         }
    10741069    }
    10751070}
     
    11151110        AssertCompile(sizeof(pCtx->hwvirt.vmx.abMsrBitmap) == VMX_V_MSR_BITMAP_PAGES * X86_PAGE_SIZE);
    11161111        AssertCompile(sizeof(pCtx->hwvirt.vmx.abMsrBitmap) == VMX_V_MSR_BITMAP_SIZE);
     1112        AssertCompile(sizeof(pCtx->hwvirt.vmx.abIoBitmap) == (VMX_V_IO_BITMAP_A_PAGES + VMX_V_IO_BITMAP_B_PAGES) * X86_PAGE_SIZE);
     1113        AssertCompile(sizeof(pCtx->hwvirt.vmx.abIoBitmap) == VMX_V_IO_BITMAP_A_SIZE + VMX_V_IO_BITMAP_B_SIZE);
    11171114
    11181115        /*
     
    11321129
    11331130        /*
    1134          * Allocate the I/O bitmaps (A and B).
    1135          */
    1136         pCtx->hwvirt.vmx.pvIoBitmapR3 = SUPR3ContAlloc(VMX_V_IO_BITMAP_A_PAGES + VMX_V_IO_BITMAP_B_PAGES,
    1137                                                        &pCtx->hwvirt.vmx.pvIoBitmapR0, NULL);
    1138         if (pCtx->hwvirt.vmx.pvIoBitmapR3)
    1139         { /* likely */ }
    1140         else
    1141         {
    1142             LogRel(("CPUM%u: Failed to alloc %u pages for the nested-guest's I/O bitmaps\n", pVCpu->idCpu,
    1143                     VMX_V_IO_BITMAP_A_PAGES + VMX_V_IO_BITMAP_B_PAGES));
    1144             break;
    1145         }
    1146 
    1147         /*
    11481131         * Zero out all allocated pages (should compress well for saved-state).
    11491132         */
    1150         /** @todo this is and always was unnecessary - they are already zeroed. */
     1133        /** @todo r=bird: this is and always was unnecessary - they are already zeroed. */
    11511134        RT_ZERO(pCtx->hwvirt.vmx.Vmcs);
    11521135        RT_ZERO(pCtx->hwvirt.vmx.ShadowVmcs);
     
    11571140        RT_ZERO(pCtx->hwvirt.vmx.aExitMsrLoadArea);
    11581141        RT_ZERO(pCtx->hwvirt.vmx.abMsrBitmap);
    1159         memset(pCtx->hwvirt.vmx.CTX_SUFF(pvIoBitmap),          0, VMX_V_IO_BITMAP_A_SIZE + VMX_V_IO_BITMAP_B_SIZE);
     1142        RT_ZERO(pCtx->hwvirt.vmx.abIoBitmap);
    11601143        memset(pCtx->hwvirt.vmx.CTX_SUFF(pvVirtApicPage),      0, VMX_V_VIRT_APIC_SIZE);
    11611144    }
     
    24712454            SSMR3PutMem(pSSM,     &pGstCtx->hwvirt.vmx.aExitMsrLoadArea[0],  sizeof(pGstCtx->hwvirt.vmx.aExitMsrLoadArea));
    24722455            SSMR3PutMem(pSSM,     &pGstCtx->hwvirt.vmx.abMsrBitmap[0],       sizeof(pGstCtx->hwvirt.vmx.abMsrBitmap));
    2473             SSMR3PutMem(pSSM,      pGstCtx->hwvirt.vmx.pvIoBitmapR3, VMX_V_IO_BITMAP_A_SIZE + VMX_V_IO_BITMAP_B_SIZE);
     2456            SSMR3PutMem(pSSM,     &pGstCtx->hwvirt.vmx.abIoBitmap[0],        sizeof(pGstCtx->hwvirt.vmx.abIoBitmap));
    24742457            SSMR3PutU64(pSSM,      pGstCtx->hwvirt.vmx.uFirstPauseLoopTick);
    24752458            SSMR3PutU64(pSSM,      pGstCtx->hwvirt.vmx.uPrevPauseTick);
     
    27612744                        SSMR3GetMem(pSSM,      &pGstCtx->hwvirt.vmx.aExitMsrLoadArea[0],  sizeof(pGstCtx->hwvirt.vmx.aExitMsrLoadArea));
    27622745                        SSMR3GetMem(pSSM,      &pGstCtx->hwvirt.vmx.abMsrBitmap[0],       sizeof(pGstCtx->hwvirt.vmx.abMsrBitmap));
    2763                         SSMR3GetMem(pSSM,       pGstCtx->hwvirt.vmx.pvIoBitmapR3, VMX_V_IO_BITMAP_A_SIZE + VMX_V_IO_BITMAP_B_SIZE);
     2746                        SSMR3GetMem(pSSM,      &pGstCtx->hwvirt.vmx.abIoBitmap[0],        sizeof(pGstCtx->hwvirt.vmx.abIoBitmap));
    27642747                        SSMR3GetU64(pSSM,      &pGstCtx->hwvirt.vmx.uFirstPauseLoopTick);
    27652748                        SSMR3GetU64(pSSM,      &pGstCtx->hwvirt.vmx.uPrevPauseTick);
  • trunk/src/VBox/VMM/include/CPUMInternal.mac

    r91304 r91305  
    256256    .Guest.hwvirt.vmx.aExitMsrLoadArea      resb        0x2000
    257257    .Guest.hwvirt.vmx.abMsrBitmap           resb        0x1000
     258    .Guest.hwvirt.vmx.abIoBitmap            resb        0x1000+0x1000
    258259    alignb 8
    259260    .Guest.hwvirt.vmx.GCPhysVmxon           resq        1
     
    270271    .Guest.hwvirt.vmx.pvVirtApicPageR0      resq        1
    271272    .Guest.hwvirt.vmx.pvVirtApicPageR3      resq        1
    272     .Guest.hwvirt.vmx.pvIoBitmapR0          resq        1
    273     .Guest.hwvirt.vmx.pvIoBitmapR3          resq        1
    274273    .Guest.hwvirt.vmx.uFirstPauseLoopTick   resq        1
    275274    .Guest.hwvirt.vmx.uPrevPauseTick        resq        1
  • trunk/src/VBox/VMM/testcase/tstVMStruct.h

    r91304 r91305  
    150150    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvVirtApicPageR0);
    151151    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvVirtApicPageR3);
    152     GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvIoBitmapR0);
    153     GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvIoBitmapR3);
    154152    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.uFirstPauseLoopTick);
    155153    GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.uPrevPauseTick);
  • trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp

    r91304 r91305  
    260260    CHECK_MEMBER_ALIGNMENT(VMCPU, cpum.s.Guest.hwvirt.vmx.aExitMsrLoadArea, 4096);
    261261    CHECK_MEMBER_ALIGNMENT(VMCPU, cpum.s.Guest.hwvirt.vmx.abMsrBitmap, 4096);
     262    CHECK_MEMBER_ALIGNMENT(VMCPU, cpum.s.Guest.hwvirt.vmx.abIoBitmap, 4096);
    262263
    263264    PVM pVM = NULL; NOREF(pVM);
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