Index: sys/amd64/vmm/amd/svm_softc.h =================================================================== --- sys/amd64/vmm/amd/svm_softc.h +++ sys/amd64/vmm/amd/svm_softc.h @@ -54,11 +54,15 @@ struct asid asid; } __aligned(PAGE_SIZE); +struct apic_page { + uint8_t byte[PAGE_SIZE]; +} __aligned(PAGE_SIZE); + /* * SVM softc, one per virtual machine. */ struct svm_softc { - uint8_t apic_page[VM_MAXCPU][PAGE_SIZE]; + struct apic_page apic_page[VM_MAXCPU]; struct svm_vcpu vcpu[VM_MAXCPU]; vm_offset_t nptp; /* nested page table */ uint8_t *iopm_bitmap; /* shared by all vcpus */ Index: sys/amd64/vmm/intel/vmx.h =================================================================== --- sys/amd64/vmm/intel/vmx.h +++ sys/amd64/vmm/intel/vmx.h @@ -119,13 +119,18 @@ GUEST_MSR_NUM /* must be the last enumeration */ }; +/* per vcpu msrs */ +struct vmx_msrs { + uint64_t reg[GUEST_MSR_NUM]; +}; + /* virtual machine softc */ struct vmx { struct vmcs vmcs[VM_MAXCPU]; /* one vmcs per virtual cpu */ struct apic_page apic_page[VM_MAXCPU]; /* one apic page per vcpu */ char msr_bitmap[PAGE_SIZE]; struct pir_desc pir_desc[VM_MAXCPU]; - uint64_t guest_msrs[VM_MAXCPU][GUEST_MSR_NUM]; + struct vmx_msrs guest_msrs[VM_MAXCPU]; struct vmxctx ctx[VM_MAXCPU]; struct vmxcap cap[VM_MAXCPU]; struct vmxstate state[VM_MAXCPU]; Index: sys/amd64/vmm/intel/vmx_msr.c =================================================================== --- sys/amd64/vmm/intel/vmx_msr.c +++ sys/amd64/vmm/intel/vmx_msr.c @@ -326,7 +326,7 @@ { uint64_t *guest_msrs; - guest_msrs = vmx->guest_msrs[vcpuid]; + guest_msrs = &vmx->guest_msrs[vcpuid].reg[0]; /* * The permissions bitmap is shared between all vcpus so initialize it @@ -358,7 +358,7 @@ void vmx_msr_guest_enter(struct vmx *vmx, int vcpuid) { - uint64_t *guest_msrs = vmx->guest_msrs[vcpuid]; + uint64_t *guest_msrs = &vmx->guest_msrs[vcpuid].reg[0]; /* Save host MSRs (in particular, KGSBASE) and restore guest MSRs */ update_pcb_bases(curpcb); @@ -372,7 +372,7 @@ void vmx_msr_guest_exit(struct vmx *vmx, int vcpuid) { - uint64_t *guest_msrs = vmx->guest_msrs[vcpuid]; + uint64_t *guest_msrs = &vmx->guest_msrs[vcpuid].reg[0]; /* Save guest MSRs */ guest_msrs[IDX_MSR_LSTAR] = rdmsr(MSR_LSTAR); @@ -396,7 +396,7 @@ const uint64_t *guest_msrs; int error; - guest_msrs = vmx->guest_msrs[vcpuid]; + guest_msrs = &vmx->guest_msrs[vcpuid].reg[0]; error = 0; switch (num) { @@ -438,7 +438,7 @@ uint64_t changed; int error; - guest_msrs = vmx->guest_msrs[vcpuid]; + guest_msrs = &vmx->guest_msrs[vcpuid].reg[0]; error = 0; switch (num) {