x86/hyperv: Move VMCB enlightenment definitions to hyperv-tlfs.h
[ Upstream commit089fe572a2
] Move Hyper-V's VMCB enlightenment definitions to the TLFS header; the definitions come directly from the TLFS[*], not from KVM. No functional change intended. [*] https://learn.microsoft.com/en-us/virtualization/hyper-v-on-windows/tlfs/datatypes/hv_svm_enlightened_vmcb_fields [vitaly: rename VMCB_HV_ -> HV_VMCB_ to match the rest of hyperv-tlfs.h, keep svm/hyperv.h] Signed-off-by: Sean Christopherson <seanjc@google.com> Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Message-Id: <20221101145426.251680-2-vkuznets@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Stable-dep-of:e5c972c1fa
("KVM: SVM: Flush Hyper-V TLB when required") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
6e999e45ab
commit
59ef934fcc
|
@ -598,6 +598,28 @@ struct hv_enlightened_vmcs {
|
||||||
|
|
||||||
#define HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL 0xFFFF
|
#define HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL 0xFFFF
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Hyper-V uses the software reserved 32 bytes in VMCB control area to expose
|
||||||
|
* SVM enlightenments to guests.
|
||||||
|
*/
|
||||||
|
struct hv_enlightenments {
|
||||||
|
struct __packed hv_enlightenments_control {
|
||||||
|
u32 nested_flush_hypercall:1;
|
||||||
|
u32 msr_bitmap:1;
|
||||||
|
u32 enlightened_npt_tlb: 1;
|
||||||
|
u32 reserved:29;
|
||||||
|
} __packed hv_enlightenments_control;
|
||||||
|
u32 hv_vp_id;
|
||||||
|
u64 hv_vm_id;
|
||||||
|
u64 partition_assist_page;
|
||||||
|
u64 reserved;
|
||||||
|
} __packed;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Hyper-V uses the software reserved clean bit in VMCB.
|
||||||
|
*/
|
||||||
|
#define HV_VMCB_NESTED_ENLIGHTENMENTS 31
|
||||||
|
|
||||||
struct hv_partition_assist_pg {
|
struct hv_partition_assist_pg {
|
||||||
u32 tlb_lock_count;
|
u32 tlb_lock_count;
|
||||||
};
|
};
|
||||||
|
|
|
@ -10,26 +10,4 @@
|
||||||
|
|
||||||
#include "../hyperv.h"
|
#include "../hyperv.h"
|
||||||
|
|
||||||
/*
|
|
||||||
* Hyper-V uses the software reserved 32 bytes in VMCB
|
|
||||||
* control area to expose SVM enlightenments to guests.
|
|
||||||
*/
|
|
||||||
struct hv_enlightenments {
|
|
||||||
struct __packed hv_enlightenments_control {
|
|
||||||
u32 nested_flush_hypercall:1;
|
|
||||||
u32 msr_bitmap:1;
|
|
||||||
u32 enlightened_npt_tlb: 1;
|
|
||||||
u32 reserved:29;
|
|
||||||
} __packed hv_enlightenments_control;
|
|
||||||
u32 hv_vp_id;
|
|
||||||
u64 hv_vm_id;
|
|
||||||
u64 partition_assist_page;
|
|
||||||
u64 reserved;
|
|
||||||
} __packed;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Hyper-V uses the software reserved clean bit in VMCB
|
|
||||||
*/
|
|
||||||
#define VMCB_HV_NESTED_ENLIGHTENMENTS VMCB_SW
|
|
||||||
|
|
||||||
#endif /* __ARCH_X86_KVM_SVM_HYPERV_H__ */
|
#endif /* __ARCH_X86_KVM_SVM_HYPERV_H__ */
|
||||||
|
|
|
@ -194,7 +194,7 @@ static bool nested_svm_vmrun_msrpm(struct vcpu_svm *svm)
|
||||||
if (!svm->nested.force_msr_bitmap_recalc &&
|
if (!svm->nested.force_msr_bitmap_recalc &&
|
||||||
kvm_hv_hypercall_enabled(&svm->vcpu) &&
|
kvm_hv_hypercall_enabled(&svm->vcpu) &&
|
||||||
hve->hv_enlightenments_control.msr_bitmap &&
|
hve->hv_enlightenments_control.msr_bitmap &&
|
||||||
(svm->nested.ctl.clean & BIT(VMCB_HV_NESTED_ENLIGHTENMENTS)))
|
(svm->nested.ctl.clean & BIT(HV_VMCB_NESTED_ENLIGHTENMENTS)))
|
||||||
goto set_msrpm_base_pa;
|
goto set_msrpm_base_pa;
|
||||||
|
|
||||||
if (!(vmcb12_is_intercept(&svm->nested.ctl, INTERCEPT_MSR_PROT)))
|
if (!(vmcb12_is_intercept(&svm->nested.ctl, INTERCEPT_MSR_PROT)))
|
||||||
|
|
|
@ -32,7 +32,7 @@ int svm_hv_enable_direct_tlbflush(struct kvm_vcpu *vcpu)
|
||||||
hve->hv_vm_id = (unsigned long)vcpu->kvm;
|
hve->hv_vm_id = (unsigned long)vcpu->kvm;
|
||||||
if (!hve->hv_enlightenments_control.nested_flush_hypercall) {
|
if (!hve->hv_enlightenments_control.nested_flush_hypercall) {
|
||||||
hve->hv_enlightenments_control.nested_flush_hypercall = 1;
|
hve->hv_enlightenments_control.nested_flush_hypercall = 1;
|
||||||
vmcb_mark_dirty(to_svm(vcpu)->vmcb, VMCB_HV_NESTED_ENLIGHTENMENTS);
|
vmcb_mark_dirty(to_svm(vcpu)->vmcb, HV_VMCB_NESTED_ENLIGHTENMENTS);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -64,7 +64,7 @@ static inline void svm_hv_vmcb_dirty_nested_enlightenments(
|
||||||
(struct hv_enlightenments *)vmcb->control.reserved_sw;
|
(struct hv_enlightenments *)vmcb->control.reserved_sw;
|
||||||
|
|
||||||
if (hve->hv_enlightenments_control.msr_bitmap)
|
if (hve->hv_enlightenments_control.msr_bitmap)
|
||||||
vmcb_mark_dirty(vmcb, VMCB_HV_NESTED_ENLIGHTENMENTS);
|
vmcb_mark_dirty(vmcb, HV_VMCB_NESTED_ENLIGHTENMENTS);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void svm_hv_update_vp_id(struct vmcb *vmcb,
|
static inline void svm_hv_update_vp_id(struct vmcb *vmcb,
|
||||||
|
@ -76,7 +76,7 @@ static inline void svm_hv_update_vp_id(struct vmcb *vmcb,
|
||||||
|
|
||||||
if (hve->hv_vp_id != vp_index) {
|
if (hve->hv_vp_id != vp_index) {
|
||||||
hve->hv_vp_id = vp_index;
|
hve->hv_vp_id = vp_index;
|
||||||
vmcb_mark_dirty(vmcb, VMCB_HV_NESTED_ENLIGHTENMENTS);
|
vmcb_mark_dirty(vmcb, HV_VMCB_NESTED_ENLIGHTENMENTS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -39,7 +39,7 @@ struct hv_enlightenments {
|
||||||
/*
|
/*
|
||||||
* Hyper-V uses the software reserved clean bit in VMCB
|
* Hyper-V uses the software reserved clean bit in VMCB
|
||||||
*/
|
*/
|
||||||
#define VMCB_HV_NESTED_ENLIGHTENMENTS (1U << 31)
|
#define HV_VMCB_NESTED_ENLIGHTENMENTS (1U << 31)
|
||||||
|
|
||||||
void l2_guest_code(void)
|
void l2_guest_code(void)
|
||||||
{
|
{
|
||||||
|
@ -98,14 +98,14 @@ static void __attribute__((__flatten__)) guest_code(struct svm_test_data *svm)
|
||||||
/* Intercept RDMSR 0xc0000101 without telling KVM about it */
|
/* Intercept RDMSR 0xc0000101 without telling KVM about it */
|
||||||
set_bit(2 * (MSR_GS_BASE & 0x1fff), svm->msr + 0x800);
|
set_bit(2 * (MSR_GS_BASE & 0x1fff), svm->msr + 0x800);
|
||||||
/* Make sure HV_VMX_ENLIGHTENED_CLEAN_FIELD_MSR_BITMAP is set */
|
/* Make sure HV_VMX_ENLIGHTENED_CLEAN_FIELD_MSR_BITMAP is set */
|
||||||
vmcb->control.clean |= VMCB_HV_NESTED_ENLIGHTENMENTS;
|
vmcb->control.clean |= HV_VMCB_NESTED_ENLIGHTENMENTS;
|
||||||
run_guest(vmcb, svm->vmcb_gpa);
|
run_guest(vmcb, svm->vmcb_gpa);
|
||||||
/* Make sure we don't see SVM_EXIT_MSR here so eMSR bitmap works */
|
/* Make sure we don't see SVM_EXIT_MSR here so eMSR bitmap works */
|
||||||
GUEST_ASSERT(vmcb->control.exit_code == SVM_EXIT_VMMCALL);
|
GUEST_ASSERT(vmcb->control.exit_code == SVM_EXIT_VMMCALL);
|
||||||
vmcb->save.rip += 3; /* vmcall */
|
vmcb->save.rip += 3; /* vmcall */
|
||||||
|
|
||||||
/* Now tell KVM we've changed MSR-Bitmap */
|
/* Now tell KVM we've changed MSR-Bitmap */
|
||||||
vmcb->control.clean &= ~VMCB_HV_NESTED_ENLIGHTENMENTS;
|
vmcb->control.clean &= ~HV_VMCB_NESTED_ENLIGHTENMENTS;
|
||||||
run_guest(vmcb, svm->vmcb_gpa);
|
run_guest(vmcb, svm->vmcb_gpa);
|
||||||
GUEST_ASSERT(vmcb->control.exit_code == SVM_EXIT_MSR);
|
GUEST_ASSERT(vmcb->control.exit_code == SVM_EXIT_MSR);
|
||||||
vmcb->save.rip += 2; /* rdmsr */
|
vmcb->save.rip += 2; /* rdmsr */
|
||||||
|
|
Loading…
Reference in New Issue