Changeset 67157 in vbox
- Timestamp:
- May 31, 2017 9:11:17 AM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 115833
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR3/CPUM.cpp
r66405 r67157 756 756 static void cpumR3FreeHwVirtState(PVM pVM) 757 757 { 758 if (pVM->cpum.ro.GuestFeatures.fSvm) 759 { 760 for (VMCPUID i = 0; i < pVM->cCpus; i++) 758 Assert(pVM->cpum.ro.GuestFeatures.fSvm); 759 for (VMCPUID i = 0; i < pVM->cCpus; i++) 760 { 761 PVMCPU pVCpu = &pVM->aCpus[i]; 762 if (pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR3) 761 763 { 762 PVMCPU pVCpu = &pVM->aCpus[i]; 763 if (pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR3) 764 { 765 SUPR3PageFreeEx(pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR3, SVM_MSRPM_PAGES); 766 pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR3 = NULL; 767 } 768 769 if (pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR3) 770 { 771 SUPR3PageFreeEx(pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR3, SVM_IOPM_PAGES); 772 pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR3 = NULL; 773 } 764 SUPR3PageFreeEx(pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR3, SVM_MSRPM_PAGES); 765 pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR3 = NULL; 766 } 767 768 if (pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR3) 769 { 770 SUPR3PageFreeEx(pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR3, SVM_IOPM_PAGES); 771 pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR3 = NULL; 774 772 } 775 773 } … … 785 783 static int cpumR3AllocHwVirtState(PVM pVM) 786 784 { 785 Assert(pVM->cpum.ro.GuestFeatures.fSvm); 786 787 787 int rc = VINF_SUCCESS; 788 if (pVM->cpum.ro.GuestFeatures.fSvm) 789 { 790 for (VMCPUID i = 0; i < pVM->cCpus; i++) 788 LogRel(("CPUM: Allocating a total of %u pages for the nested-guest SVM MSR and IO permission bitmaps\n", 789 pVM->cCpus * (SVM_MSRPM_PAGES + SVM_IOPM_PAGES))); 790 for (VMCPUID i = 0; i < pVM->cCpus; i++) 791 { 792 PVMCPU pVCpu = &pVM->aCpus[i]; 793 794 /* 795 * Allocate the MSRPM (MSR Permission bitmap). 796 */ 797 Assert(!pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR3); 798 rc = SUPR3PageAllocEx(SVM_MSRPM_PAGES, 0 /* fFlags */, &pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR3, 799 &pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR0, NULL /* paPages */); 800 if (RT_FAILURE(rc)) 791 801 { 792 PVMCPU pVCpu = &pVM->aCpus[i];793 794 /*795 * Allocate the MSRPM (MSR Permission bitmap).796 */797 802 Assert(!pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR3); 798 rc = SUPR3PageAllocEx(SVM_MSRPM_PAGES, 0 /* fFlags */, &pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR3,799 &pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR0, NULL /* paPages */);800 if (RT_FAILURE(rc))801 {802 Assert(!pVCpu->cpum.s.Guest.hwvirt.svm.pvMsrBitmapR3); 803 LogRel(("CPUM%u: Failed to alloc %u pages for the nested-guest's MSR permission bitmap\n", pVCpu->idCpu,804 SVM_MSRPM_PAGES));805 break;806 }807 808 /*809 * Allocate the IOPM (IO Permission bitmap).810 */803 LogRel(("CPUM%u: Failed to alloc %u pages for the nested-guest's MSR permission bitmap\n", pVCpu->idCpu, 804 SVM_MSRPM_PAGES)); 805 break; 806 } 807 808 /* 809 * Allocate the IOPM (IO Permission bitmap). 810 */ 811 Assert(!pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR3); 812 rc = SUPR3PageAllocEx(SVM_IOPM_PAGES, 0 /* fFlags */, &pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR3, 813 &pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR0, NULL /* paPages */); 814 if (RT_FAILURE(rc)) 815 { 811 816 Assert(!pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR3); 812 rc = SUPR3PageAllocEx(SVM_IOPM_PAGES, 0 /* fFlags */, &pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR3, 813 &pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR0, NULL /* paPages */); 814 if (RT_FAILURE(rc)) 815 { 816 Assert(!pVCpu->cpum.s.Guest.hwvirt.svm.pvIoBitmapR3); 817 LogRel(("CPUM%u: Failed to alloc %u pages for the nested-guest's IO permission bitmap\n", pVCpu->idCpu, 818 SVM_IOPM_PAGES)); 819 break; 820 } 817 LogRel(("CPUM%u: Failed to alloc %u pages for the nested-guest's IO permission bitmap\n", pVCpu->idCpu, 818 SVM_IOPM_PAGES)); 819 break; 821 820 } 822 823 /* On any failure, cleanup. */ 824 if (RT_FAILURE(rc))825 cpumR3FreeHwVirtState(pVM);826 }821 } 822 823 /* On any failure, cleanup. */ 824 if (RT_FAILURE(rc)) 825 cpumR3FreeHwVirtState(pVM); 827 826 828 827 return rc; … … 966 965 967 966 /* 968 * Allocate memory required by the hardware virtualization state.969 */970 rc = cpumR3AllocHwVirtState(pVM);971 if (RT_FAILURE(rc))972 return rc;973 974 /*975 967 * Register saved state data item. 976 968 */ … … 1012 1004 if (RT_FAILURE(rc)) 1013 1005 return rc; 1006 1007 /* 1008 * Allocate memory required by the guest hardware virtualization state. 1009 */ 1010 if (pVM->cpum.ro.GuestFeatures.fSvm) 1011 { 1012 rc = cpumR3AllocHwVirtState(pVM); 1013 if (RT_FAILURE(rc)) 1014 return rc; 1015 } 1016 1014 1017 CPUMR3Reset(pVM); 1015 1018 return VINF_SUCCESS; … … 1093 1096 #endif 1094 1097 1095 cpumR3FreeHwVirtState(pVM); 1098 if (pVM->cpum.ro.GuestFeatures.fSvm) 1099 cpumR3FreeHwVirtState(pVM); 1096 1100 return VINF_SUCCESS; 1097 1101 } … … 1241 1245 * Hardware virtualization state. 1242 1246 */ 1243 memset(&pCtx->hwvirt, 0, sizeof(pCtx->hwvirt));1244 1247 /* SVM. */ 1248 RT_ZERO(pCtx->hwvirt.svm.VmcbCtrl); 1245 1249 pCtx->hwvirt.svm.fGif = 1; 1246 1250 }
Note:
See TracChangeset
for help on using the changeset viewer.