Skip to content

Commit

Permalink
KVM: nVMX: Keep track of hv_vm_id/hv_vp_id when eVMCS is in use
Browse files Browse the repository at this point in the history
To handle L2 TLB flush requests, KVM needs to keep track of L2's VM_ID/
VP_IDs which are set by L1 hypervisor. 'Partition assist page' address is
also needed to handle post-flush exit to L1 upon request.

Reviewed-by: Maxim Levitsky <[email protected]>
Reviewed-by: Sean Christopherson <[email protected]>
Signed-off-by: Vitaly Kuznetsov <[email protected]>
Signed-off-by: Paolo Bonzini <[email protected]>
Message-Id: <[email protected]>
Signed-off-by: Paolo Bonzini <[email protected]>
  • Loading branch information
vittyvk authored and bonzini committed Nov 18, 2022
1 parent 7d5e88d commit 38edb45
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 0 deletions.
6 changes: 6 additions & 0 deletions arch/x86/include/asm/kvm_host.h
Original file line number Diff line number Diff line change
Expand Up @@ -668,6 +668,12 @@ struct kvm_vcpu_hv {

/* Preallocated buffer for handling hypercalls passing sparse vCPU set */
u64 sparse_banks[HV_MAX_SPARSE_VCPU_BANKS];

struct {
u64 pa_page_gpa;
u64 vm_id;
u32 vp_id;
} nested;
};

/* Xen HVM per vcpu emulation context */
Expand Down
15 changes: 15 additions & 0 deletions arch/x86/kvm/vmx/nested.c
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ static void vmx_disable_shadow_vmcs(struct vcpu_vmx *vmx)

static inline void nested_release_evmcs(struct kvm_vcpu *vcpu)
{
struct kvm_vcpu_hv *hv_vcpu = to_hv_vcpu(vcpu);
struct vcpu_vmx *vmx = to_vmx(vcpu);

if (evmptr_is_valid(vmx->nested.hv_evmcs_vmptr)) {
Expand All @@ -233,6 +234,12 @@ static inline void nested_release_evmcs(struct kvm_vcpu *vcpu)
}

vmx->nested.hv_evmcs_vmptr = EVMPTR_INVALID;

if (hv_vcpu) {
hv_vcpu->nested.pa_page_gpa = INVALID_GPA;
hv_vcpu->nested.vm_id = 0;
hv_vcpu->nested.vp_id = 0;
}
}

static void vmx_sync_vmcs_host_state(struct vcpu_vmx *vmx,
Expand Down Expand Up @@ -1557,11 +1564,19 @@ static void copy_enlightened_to_vmcs12(struct vcpu_vmx *vmx, u32 hv_clean_fields
{
struct vmcs12 *vmcs12 = vmx->nested.cached_vmcs12;
struct hv_enlightened_vmcs *evmcs = vmx->nested.hv_evmcs;
struct kvm_vcpu_hv *hv_vcpu = to_hv_vcpu(&vmx->vcpu);

/* HV_VMX_ENLIGHTENED_CLEAN_FIELD_NONE */
vmcs12->tpr_threshold = evmcs->tpr_threshold;
vmcs12->guest_rip = evmcs->guest_rip;

if (unlikely(!(hv_clean_fields &
HV_VMX_ENLIGHTENED_CLEAN_FIELD_ENLIGHTENMENTSCONTROL))) {
hv_vcpu->nested.pa_page_gpa = evmcs->partition_assist_page;
hv_vcpu->nested.vm_id = evmcs->hv_vm_id;
hv_vcpu->nested.vp_id = evmcs->hv_vp_id;
}

if (unlikely(!(hv_clean_fields &
HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_BASIC))) {
vmcs12->guest_rsp = evmcs->guest_rsp;
Expand Down

0 comments on commit 38edb45

Please sign in to comment.