@@ -98,17 +98,18 @@ int exec_vmxon_instr(void)
98
98
uint64_t tmp64 ;
99
99
uint32_t tmp32 ;
100
100
int ret_val = - EINVAL ;
101
- void * vmxon_region ;
101
+ void * vmxon_region_va ;
102
+ uint64_t vmxon_region_pa ;
102
103
103
104
/* Allocate page aligned memory for VMXON region */
104
- vmxon_region = alloc_page ();
105
+ vmxon_region_va = alloc_page ();
105
106
106
- if (vmxon_region != 0 ) {
107
+ if (vmxon_region_va != 0 ) {
107
108
/* Initialize vmxon page with revision id from IA32 VMX BASIC
108
109
* MSR
109
110
*/
110
111
tmp32 = msr_read (MSR_IA32_VMX_BASIC );
111
- memcpy_s ((uint32_t * ) vmxon_region , 4 , & tmp32 , 4 );
112
+ memcpy_s ((uint32_t * ) vmxon_region_va , 4 , & tmp32 , 4 );
112
113
113
114
/* Turn on CR0.NE and CR4.VMXE */
114
115
CPU_CR_READ (cr0 , & tmp64 );
@@ -117,7 +118,8 @@ int exec_vmxon_instr(void)
117
118
CPU_CR_WRITE (cr4 , tmp64 | CR4_VMXE );
118
119
119
120
/* Turn ON VMX */
120
- ret_val = exec_vmxon (& vmxon_region );
121
+ vmxon_region_pa = HVA2HPA (vmxon_region_va );
122
+ ret_val = exec_vmxon (& vmxon_region_pa );
121
123
}
122
124
123
125
return ret_val ;
@@ -825,9 +827,9 @@ static void init_host_state(__unused struct vcpu *vcpu)
825
827
826
828
/* Set up host instruction pointer on VM Exit */
827
829
field = VMX_HOST_RIP ;
828
- value32 = (uint32_t ) (( uint64_t ) ( & vm_exit ) & 0xFFFFFFFF ) ;
830
+ value64 = (uint64_t )& vm_exit ;
829
831
pr_dbg ("HOST RIP on VMExit %x " , value32 );
830
- exec_vmwrite (field , value32 );
832
+ exec_vmwrite (field , value64 );
831
833
pr_dbg ("vm exit return address = %x " , value32 );
832
834
833
835
/* These fields manage host and guest system calls * pg 3069 31.10.4.2
@@ -1003,10 +1005,10 @@ static void init_exec_ctrl(struct vcpu *vcpu)
1003
1005
exec_vmwrite (VMX_CR3_TARGET_COUNT , 0 );
1004
1006
1005
1007
/* Set up IO bitmap register A and B - pg 2902 24.6.4 */
1006
- value64 = ( int64_t ) vm -> arch_vm .iobitmap [0 ];
1008
+ value64 = HVA2HPA ( vm -> arch_vm .iobitmap [0 ]) ;
1007
1009
exec_vmwrite64 (VMX_IO_BITMAP_A_FULL , value64 );
1008
1010
pr_dbg ("VMX_IO_BITMAP_A: 0x%016llx " , value64 );
1009
- value64 = ( int64_t ) vm -> arch_vm .iobitmap [1 ];
1011
+ value64 = HVA2HPA ( vm -> arch_vm .iobitmap [1 ]) ;
1010
1012
exec_vmwrite64 (VMX_IO_BITMAP_B_FULL , value64 );
1011
1013
pr_dbg ("VMX_IO_BITMAP_B: 0x%016llx " , value64 );
1012
1014
@@ -1301,6 +1303,7 @@ int init_vmcs(struct vcpu *vcpu)
1301
1303
{
1302
1304
uint32_t vmx_rev_id ;
1303
1305
int status = 0 ;
1306
+ uint64_t vmcs_pa ;
1304
1307
1305
1308
if (vcpu == NULL )
1306
1309
status = - EINVAL ;
@@ -1314,11 +1317,12 @@ int init_vmcs(struct vcpu *vcpu)
1314
1317
memcpy_s ((void * ) vcpu -> arch_vcpu .vmcs , 4 , & vmx_rev_id , 4 );
1315
1318
1316
1319
/* Execute VMCLEAR on current VMCS */
1317
- status = exec_vmclear ((void * )& vcpu -> arch_vcpu .vmcs );
1320
+ vmcs_pa = HVA2HPA (vcpu -> arch_vcpu .vmcs );
1321
+ status = exec_vmclear ((void * )& vmcs_pa );
1318
1322
ASSERT (status == 0 , "Failed VMCLEAR during VMCS setup!" );
1319
1323
1320
1324
/* Load VMCS pointer */
1321
- status = exec_vmptrld ((void * )& vcpu -> arch_vcpu . vmcs );
1325
+ status = exec_vmptrld ((void * )& vmcs_pa );
1322
1326
ASSERT (status == 0 , "Failed VMCS pointer load!" );
1323
1327
1324
1328
/* Initialize the Virtual Machine Control Structure (VMCS) */
0 commit comments