Sean Christopherson <seanjc@xxxxxxxxxx> writes: > Add a helper, kvm_get_sparse_vp_set(), to handle sanity checks related to > the VARHEAD field and reading the sparse banks of a VP_SET. A future > commit to reduce the memory footprint of sparse_banks will introduce more > common code to the sparse bank retrieval. > > No functional change intended. > > Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx> > --- > arch/x86/kvm/hyperv.c | 32 ++++++++++++++++---------------- > 1 file changed, 16 insertions(+), 16 deletions(-) > > diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c > index e68931ed27f6..3d0981163eed 100644 > --- a/arch/x86/kvm/hyperv.c > +++ b/arch/x86/kvm/hyperv.c > @@ -1750,10 +1750,19 @@ struct kvm_hv_hcall { > sse128_t xmm[HV_HYPERCALL_MAX_XMM_REGISTERS]; > }; > > +static u64 kvm_get_sparse_vp_set(struct kvm *kvm, struct kvm_hv_hcall *hc, > + u64 *sparse_banks, gpa_t offset) > +{ > + if (hc->var_cnt > 64) > + return -EINVAL; > + > + return kvm_read_guest(kvm, hc->ingpa + offset, sparse_banks, > + hc->var_cnt * sizeof(*sparse_banks)); > +} > + > static u64 kvm_hv_flush_tlb(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *hc, bool ex) > { > int i; > - gpa_t gpa; > struct kvm *kvm = vcpu->kvm; > struct hv_tlb_flush_ex flush_ex; > struct hv_tlb_flush flush; > @@ -1830,13 +1839,9 @@ static u64 kvm_hv_flush_tlb(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *hc, bool > goto do_flush; > } > > - if (hc->var_cnt > 64) > - return HV_STATUS_INVALID_HYPERCALL_INPUT; > - > - gpa = hc->ingpa + offsetof(struct hv_tlb_flush_ex, > - hv_vp_set.bank_contents); > - if (unlikely(kvm_read_guest(kvm, gpa, sparse_banks, > - hc->var_cnt * sizeof(sparse_banks[0])))) > + if (kvm_get_sparse_vp_set(kvm, hc, sparse_banks, > + offsetof(struct hv_tlb_flush_ex, > + hv_vp_set.bank_contents))) > return HV_STATUS_INVALID_HYPERCALL_INPUT; > } > > @@ -1933,14 +1938,9 @@ static u64 kvm_hv_send_ipi(struct kvm_vcpu *vcpu, struct kvm_hv_hcall *hc, bool > if (!hc->var_cnt) > goto ret_success; > > - if (hc->var_cnt > 64) > - return HV_STATUS_INVALID_HYPERCALL_INPUT; > - > - if (kvm_read_guest(kvm, > - hc->ingpa + offsetof(struct hv_send_ipi_ex, > - vp_set.bank_contents), > - sparse_banks, > - hc->var_cnt * sizeof(sparse_banks[0]))) > + if (kvm_get_sparse_vp_set(kvm, hc, sparse_banks, > + offsetof(struct hv_send_ipi_ex, > + vp_set.bank_contents))) > return HV_STATUS_INVALID_HYPERCALL_INPUT; > } Reviewed-by: Vitaly Kuznetsov <vkuznets@xxxxxxxxxx> -- Vitaly