Changeset 22016 in vbox
- Timestamp:
- Aug 6, 2009 9:07:11 AM (16 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/HWACCMInternal.h
r21989 r22016 417 417 R0PTRTYPE(void *) pIOBitmap; 418 418 419 /** R0 memory object for the MSR bitmap (8kb). */420 RTR0MEMOBJ pMemObjMSRBitmap;421 /** Physical address of the MSR bitmap (8kb). */422 RTHCPHYS pMSRBitmapPhys;423 /** Virtual address of the MSR bitmap. */424 R0PTRTYPE(void *) pMSRBitmap;425 426 419 /** SVM revision. */ 427 420 uint32_t u32Rev; … … 641 634 PFNHWACCMSVMVMRUN pfnVMRun; 642 635 636 /** R0 memory object for the MSR bitmap (8kb). */ 637 RTR0MEMOBJ pMemObjMSRBitmap; 638 /** Physical address of the MSR bitmap (8kb). */ 639 RTHCPHYS pMSRBitmapPhys; 640 /** Virtual address of the MSR bitmap. */ 641 R0PTRTYPE(void *) pMSRBitmap; 643 642 } svm; 644 643 -
trunk/src/VBox/VMM/VMMR0/HWSVMR0.cpp
r21988 r22016 55 55 static int svmR0InterpretInvpg(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame, uint32_t uASID); 56 56 static int svmR0EmulateTprVMMCall(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx); 57 static void svmR0SetMSRPermission(PVM pVM, unsigned ulMSR, bool fRead, bool fWrite);57 static void svmR0SetMSRPermission(PVMCPU pVCpu, unsigned ulMSR, bool fRead, bool fWrite); 58 58 59 59 /******************************************************************************* … … 132 132 133 133 pVM->hwaccm.s.svm.pMemObjIOBitmap = NIL_RTR0MEMOBJ; 134 pVM->hwaccm.s.svm.pMemObjMSRBitmap = NIL_RTR0MEMOBJ;135 134 136 135 /* Allocate 12 KB for the IO bitmap (doesn't seem to be a way to convince SVM not to use it) */ … … 143 142 /* Set all bits to intercept all IO accesses. */ 144 143 ASMMemFill32(pVM->hwaccm.s.svm.pIOBitmap, PAGE_SIZE*3, 0xffffffff); 145 146 /* Allocate 8 KB for the MSR bitmap (doesn't seem to be a way to convince SVM not to use it) */147 rc = RTR0MemObjAllocCont(&pVM->hwaccm.s.svm.pMemObjMSRBitmap, 2 << PAGE_SHIFT, true /* executable R0 mapping */);148 if (RT_FAILURE(rc))149 return rc;150 151 pVM->hwaccm.s.svm.pMSRBitmap = RTR0MemObjAddress(pVM->hwaccm.s.svm.pMemObjMSRBitmap);152 pVM->hwaccm.s.svm.pMSRBitmapPhys = RTR0MemObjGetPagePhysAddr(pVM->hwaccm.s.svm.pMemObjMSRBitmap, 0);153 /* Set all bits to intercept all MSR accesses. */154 ASMMemFill32(pVM->hwaccm.s.svm.pMSRBitmap, PAGE_SIZE*2, 0xffffffff);155 144 156 145 /* Erratum 170 which requires a forced TLB flush for each world switch: … … 190 179 PVMCPU pVCpu = &pVM->aCpus[i]; 191 180 192 pVCpu->hwaccm.s.svm.pMemObjVMCBHost = NIL_RTR0MEMOBJ; 193 pVCpu->hwaccm.s.svm.pMemObjVMCB = NIL_RTR0MEMOBJ; 181 pVCpu->hwaccm.s.svm.pMemObjVMCBHost = NIL_RTR0MEMOBJ; 182 pVCpu->hwaccm.s.svm.pMemObjVMCB = NIL_RTR0MEMOBJ; 183 pVCpu->hwaccm.s.svm.pMemObjMSRBitmap = NIL_RTR0MEMOBJ; 194 184 195 185 /* Allocate one page for the host context */ … … 210 200 pVCpu->hwaccm.s.svm.pVMCBPhys = RTR0MemObjGetPagePhysAddr(pVCpu->hwaccm.s.svm.pMemObjVMCB, 0); 211 201 ASMMemZeroPage(pVCpu->hwaccm.s.svm.pVMCB); 202 203 /* Allocate 8 KB for the MSR bitmap (doesn't seem to be a way to convince SVM not to use it) */ 204 rc = RTR0MemObjAllocCont(&pVCpu->hwaccm.s.svm.pMemObjMSRBitmap, 2 << PAGE_SHIFT, true /* executable R0 mapping */); 205 if (RT_FAILURE(rc)) 206 return rc; 207 208 pVCpu->hwaccm.s.svm.pMSRBitmap = RTR0MemObjAddress(pVCpu->hwaccm.s.svm.pMemObjMSRBitmap); 209 pVCpu->hwaccm.s.svm.pMSRBitmapPhys = RTR0MemObjGetPagePhysAddr(pVCpu->hwaccm.s.svm.pMemObjMSRBitmap, 0); 210 /* Set all bits to intercept all MSR accesses. */ 211 ASMMemFill32(pVCpu->hwaccm.s.svm.pMSRBitmap, PAGE_SIZE*2, 0xffffffff); 212 212 } 213 213 … … 242 242 pVCpu->hwaccm.s.svm.pMemObjVMCB = NIL_RTR0MEMOBJ; 243 243 } 244 if (pVCpu->hwaccm.s.svm.pMemObjMSRBitmap != NIL_RTR0MEMOBJ) 245 { 246 RTR0MemObjFree(pVCpu->hwaccm.s.svm.pMemObjMSRBitmap, false); 247 pVCpu->hwaccm.s.svm.pMSRBitmap = 0; 248 pVCpu->hwaccm.s.svm.pMSRBitmapPhys = 0; 249 pVCpu->hwaccm.s.svm.pMemObjMSRBitmap = NIL_RTR0MEMOBJ; 250 } 244 251 } 245 252 if (pVM->hwaccm.s.svm.pMemObjIOBitmap != NIL_RTR0MEMOBJ) … … 249 256 pVM->hwaccm.s.svm.pIOBitmapPhys = 0; 250 257 pVM->hwaccm.s.svm.pMemObjIOBitmap = NIL_RTR0MEMOBJ; 251 }252 if (pVM->hwaccm.s.svm.pMemObjMSRBitmap != NIL_RTR0MEMOBJ)253 {254 RTR0MemObjFree(pVM->hwaccm.s.svm.pMemObjMSRBitmap, false);255 pVM->hwaccm.s.svm.pMSRBitmap = 0;256 pVM->hwaccm.s.svm.pMSRBitmapPhys = 0;257 pVM->hwaccm.s.svm.pMemObjMSRBitmap = NIL_RTR0MEMOBJ;258 258 } 259 259 return VINF_SUCCESS; … … 269 269 { 270 270 int rc = VINF_SUCCESS; 271 SVM_VMCB *pVMCB;272 271 273 272 AssertReturn(pVM, VERR_INVALID_PARAMETER); … … 277 276 for (unsigned i=0;i<pVM->cCPUs;i++) 278 277 { 279 pVMCB = (SVM_VMCB *)pVM->aCpus[i].hwaccm.s.svm.pVMCB; 278 PVMCPU pVCpu = &pVM->aCpus[i]; 279 SVM_VMCB *pVMCB = (SVM_VMCB *)pVM->aCpus[i].hwaccm.s.svm.pVMCB; 280 280 281 AssertMsgReturn(pVMCB, ("Invalid pVMCB\n"), VERR_EM_INTERNAL_ERROR); 281 282 … … 352 353 /* Set IO and MSR bitmap addresses. */ 353 354 pVMCB->ctrl.u64IOPMPhysAddr = pVM->hwaccm.s.svm.pIOBitmapPhys; 354 pVMCB->ctrl.u64MSRPMPhysAddr = pV M->hwaccm.s.svm.pMSRBitmapPhys;355 pVMCB->ctrl.u64MSRPMPhysAddr = pVCpu->hwaccm.s.svm.pMSRBitmapPhys; 355 356 356 357 /* No LBR virtualization. */ … … 362 363 /** Setup the PAT msr (nested paging only) */ 363 364 pVMCB->guest.u64GPAT = 0x0007040600070406ULL; 364 }365 366 /* The following MSRs are saved automatically by vmload/vmsave, so we allow the guest367 * to modify them directly.368 */369 svmR0SetMSRPermission(pVM, MSR_K8_LSTAR, true, true);370 svmR0SetMSRPermission(pVM, MSR_K8_CSTAR, true, true);371 svmR0SetMSRPermission(pVM, MSR_K6_STAR, true, true);372 svmR0SetMSRPermission(pVM, MSR_K8_SF_MASK, true, true);373 svmR0SetMSRPermission(pVM, MSR_K8_FS_BASE, true, true);374 svmR0SetMSRPermission(pVM, MSR_K8_GS_BASE, true, true);375 svmR0SetMSRPermission(pVM, MSR_K8_KERNEL_GS_BASE, true, true);376 svmR0SetMSRPermission(pVM, MSR_IA32_SYSENTER_CS, true, true);377 svmR0SetMSRPermission(pVM, MSR_IA32_SYSENTER_ESP, true, true);378 svmR0SetMSRPermission(pVM, MSR_IA32_SYSENTER_EIP, true, true); 365 /* The following MSRs are saved automatically by vmload/vmsave, so we allow the guest 366 * to modify them directly. 367 */ 368 svmR0SetMSRPermission(pVCpu, MSR_K8_LSTAR, true, true); 369 svmR0SetMSRPermission(pVCpu, MSR_K8_CSTAR, true, true); 370 svmR0SetMSRPermission(pVCpu, MSR_K6_STAR, true, true); 371 svmR0SetMSRPermission(pVCpu, MSR_K8_SF_MASK, true, true); 372 svmR0SetMSRPermission(pVCpu, MSR_K8_FS_BASE, true, true); 373 svmR0SetMSRPermission(pVCpu, MSR_K8_GS_BASE, true, true); 374 svmR0SetMSRPermission(pVCpu, MSR_K8_KERNEL_GS_BASE, true, true); 375 svmR0SetMSRPermission(pVCpu, MSR_IA32_SYSENTER_CS, true, true); 376 svmR0SetMSRPermission(pVCpu, MSR_IA32_SYSENTER_ESP, true, true); 377 svmR0SetMSRPermission(pVCpu, MSR_IA32_SYSENTER_EIP, true, true); 378 } 379 379 380 return rc; 380 381 } … … 384 385 * Sets the permission bits for the specified MSR 385 386 * 386 * @param pV M The VMto operate on.387 * @param pVCpu The VMCPU to operate on. 387 388 * @param ulMSR MSR value 388 389 * @param fRead Reading allowed/disallowed 389 390 * @param fWrite Writing allowed/disallowed 390 391 */ 391 static void svmR0SetMSRPermission(PVM pVM, unsigned ulMSR, bool fRead, bool fWrite)392 static void svmR0SetMSRPermission(PVMCPU pVCpu, unsigned ulMSR, bool fRead, bool fWrite) 392 393 { 393 394 unsigned ulBit; 394 uint8_t *pMSRBitmap = (uint8_t *)pV M->hwaccm.s.svm.pMSRBitmap;395 uint8_t *pMSRBitmap = (uint8_t *)pVCpu->hwaccm.s.svm.pMSRBitmap; 395 396 396 397 if (ulMSR <= 0x00001FFF) … … 1085 1086 { 1086 1087 /* A TPR change could activate a pending interrupt, so catch lstar writes. */ 1087 svmR0SetMSRPermission(pV M, MSR_K8_LSTAR, true, false);1088 svmR0SetMSRPermission(pVCpu, MSR_K8_LSTAR, true, false); 1088 1089 } 1089 1090 else … … 1091 1092 * There are enough world switches for detecting pending interrupts. 1092 1093 */ 1093 svmR0SetMSRPermission(pV M, MSR_K8_LSTAR, true, true);1094 svmR0SetMSRPermission(pVCpu, MSR_K8_LSTAR, true, true); 1094 1095 } 1095 1096 else … … 1236 1237 Assert(pVMCB->ctrl.IntCtrl.n.u1VIrqMasking); 1237 1238 Assert(pVMCB->ctrl.u64IOPMPhysAddr == pVM->hwaccm.s.svm.pIOBitmapPhys); 1238 Assert(pVMCB->ctrl.u64MSRPMPhysAddr == pV M->hwaccm.s.svm.pMSRBitmapPhys);1239 Assert(pVMCB->ctrl.u64MSRPMPhysAddr == pVCpu->hwaccm.s.svm.pMSRBitmapPhys); 1239 1240 Assert(pVMCB->ctrl.u64LBRVirt == 0); 1240 1241
Note:
See TracChangeset
for help on using the changeset viewer.