Changeset 91305 in vbox for trunk/src/VBox/VMM
- Timestamp:
- Sep 17, 2021 8:56:45 PM (3 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp
r91301 r91305 2478 2478 * 2479 2479 * @returns @c true if the I/O port access must cause a VM-exit, @c false otherwise. 2480 * @param p vIoBitmap Pointer to I/O bitmap.2480 * @param pbIoBitmap Pointer to I/O bitmap. 2481 2481 * @param uPort The I/O port being accessed. 2482 2482 * @param cbAccess e size of the I/O access in bytes (1, 2 or 4 bytes). 2483 2483 */ 2484 static bool cpumGetVmxIoBitmapPermission( void const *pvIoBitmap, uint16_t uPort, uint8_t cbAccess)2484 static bool cpumGetVmxIoBitmapPermission(uint8_t const *pbIoBitmap, uint16_t uPort, uint8_t cbAccess) 2485 2485 { 2486 2486 Assert(cbAccess == 1 || cbAccess == 2 || cbAccess == 4); … … 2504 2504 * If any bit corresponding to the I/O access is set, we must cause a VM-exit. 2505 2505 */ 2506 uint8_t const *pbIoBitmap = (uint8_t const *)pvIoBitmap;2507 2506 uint16_t const offPerm = uPort >> 3; /* Byte offset of the port. */ 2508 2507 uint16_t const idxPermBit = uPort - (offPerm << 3); /* Bit offset within byte. */ … … 2513 2512 /* Fetch 8 or 16-bits depending on whether the access spans 8-bit boundary. */ 2514 2513 RTUINT16U uPerm; 2515 uPerm.s.Lo = *(pbIoBitmap + offPerm);2514 uPerm.s.Lo = pbIoBitmap[offPerm]; 2516 2515 if (idxPermBit + cbAccess > 8) 2517 uPerm.s.Hi = *(pbIoBitmap + 1 + offPerm);2516 uPerm.s.Hi = pbIoBitmap[offPerm + 1]; 2518 2517 else 2519 2518 uPerm.s.Hi = 0; … … 2802 2801 2803 2802 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); 2809 2804 2810 2805 return false; -
trunk/src/VBox/VMM/VMMAll/IEMAllCImplVmxInstr.cpp.h
r91304 r91305 6663 6663 /* Read the IO bitmap A. */ 6664 6664 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], 6667 6666 GCPhysIoBitmapA, VMX_V_IO_BITMAP_A_SIZE); 6668 6667 if (RT_SUCCESS(rc)) … … 6673 6672 /* Read the IO bitmap B. */ 6674 6673 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); 6677 6676 if (RT_SUCCESS(rc)) 6678 6677 { /* likely */ } -
trunk/src/VBox/VMM/VMMR3/CPUM.cpp
r91304 r91305 1067 1067 pCtx->hwvirt.vmx.pvVirtApicPageR3 = NULL; 1068 1068 } 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 }1074 1069 } 1075 1070 } … … 1115 1110 AssertCompile(sizeof(pCtx->hwvirt.vmx.abMsrBitmap) == VMX_V_MSR_BITMAP_PAGES * X86_PAGE_SIZE); 1116 1111 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); 1117 1114 1118 1115 /* … … 1132 1129 1133 1130 /* 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 else1141 {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 /*1148 1131 * Zero out all allocated pages (should compress well for saved-state). 1149 1132 */ 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. */ 1151 1134 RT_ZERO(pCtx->hwvirt.vmx.Vmcs); 1152 1135 RT_ZERO(pCtx->hwvirt.vmx.ShadowVmcs); … … 1157 1140 RT_ZERO(pCtx->hwvirt.vmx.aExitMsrLoadArea); 1158 1141 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); 1160 1143 memset(pCtx->hwvirt.vmx.CTX_SUFF(pvVirtApicPage), 0, VMX_V_VIRT_APIC_SIZE); 1161 1144 } … … 2471 2454 SSMR3PutMem(pSSM, &pGstCtx->hwvirt.vmx.aExitMsrLoadArea[0], sizeof(pGstCtx->hwvirt.vmx.aExitMsrLoadArea)); 2472 2455 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)); 2474 2457 SSMR3PutU64(pSSM, pGstCtx->hwvirt.vmx.uFirstPauseLoopTick); 2475 2458 SSMR3PutU64(pSSM, pGstCtx->hwvirt.vmx.uPrevPauseTick); … … 2761 2744 SSMR3GetMem(pSSM, &pGstCtx->hwvirt.vmx.aExitMsrLoadArea[0], sizeof(pGstCtx->hwvirt.vmx.aExitMsrLoadArea)); 2762 2745 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)); 2764 2747 SSMR3GetU64(pSSM, &pGstCtx->hwvirt.vmx.uFirstPauseLoopTick); 2765 2748 SSMR3GetU64(pSSM, &pGstCtx->hwvirt.vmx.uPrevPauseTick); -
trunk/src/VBox/VMM/include/CPUMInternal.mac
r91304 r91305 256 256 .Guest.hwvirt.vmx.aExitMsrLoadArea resb 0x2000 257 257 .Guest.hwvirt.vmx.abMsrBitmap resb 0x1000 258 .Guest.hwvirt.vmx.abIoBitmap resb 0x1000+0x1000 258 259 alignb 8 259 260 .Guest.hwvirt.vmx.GCPhysVmxon resq 1 … … 270 271 .Guest.hwvirt.vmx.pvVirtApicPageR0 resq 1 271 272 .Guest.hwvirt.vmx.pvVirtApicPageR3 resq 1 272 .Guest.hwvirt.vmx.pvIoBitmapR0 resq 1273 .Guest.hwvirt.vmx.pvIoBitmapR3 resq 1274 273 .Guest.hwvirt.vmx.uFirstPauseLoopTick resq 1 275 274 .Guest.hwvirt.vmx.uPrevPauseTick resq 1 -
trunk/src/VBox/VMM/testcase/tstVMStruct.h
r91304 r91305 150 150 GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvVirtApicPageR0); 151 151 GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvVirtApicPageR3); 152 GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvIoBitmapR0);153 GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvIoBitmapR3);154 152 GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.uFirstPauseLoopTick); 155 153 GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.uPrevPauseTick); -
trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp
r91304 r91305 260 260 CHECK_MEMBER_ALIGNMENT(VMCPU, cpum.s.Guest.hwvirt.vmx.aExitMsrLoadArea, 4096); 261 261 CHECK_MEMBER_ALIGNMENT(VMCPU, cpum.s.Guest.hwvirt.vmx.abMsrBitmap, 4096); 262 CHECK_MEMBER_ALIGNMENT(VMCPU, cpum.s.Guest.hwvirt.vmx.abIoBitmap, 4096); 262 263 263 264 PVM pVM = NULL; NOREF(pVM);
Note:
See TracChangeset
for help on using the changeset viewer.