On 11/27/24 18:43, Sean Christopherson wrote: > From: Binbin Wu <binbin.wu@xxxxxxxxxxxxxxx> > > Add and use user_exit_on_hypercall() to check if userspace wants to handle > a KVM hypercall instead of open-coding the logic everywhere. > > No functional change intended. > > Signed-off-by: Binbin Wu <binbin.wu@xxxxxxxxxxxxxxx> > Reviewed-by: Isaku Yamahata <isaku.yamahata@xxxxxxxxx> > Reviewed-by: Kai Huang <kai.huang@xxxxxxxxx> > Reviewed-by: Xiaoyao Li <xiaoyao.li@xxxxxxxxx> > [sean: squash into one patch, keep explicit KVM_HC_MAP_GPA_RANGE check] > Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx> Reviewed-by: Tom Lendacky <thomas.lendacky@xxxxxxx> > --- > arch/x86/kvm/svm/sev.c | 4 ++-- > arch/x86/kvm/x86.c | 2 +- > arch/x86/kvm/x86.h | 5 +++++ > 3 files changed, 8 insertions(+), 3 deletions(-) > > diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c > index 72674b8825c4..6ac6312c4d57 100644 > --- a/arch/x86/kvm/svm/sev.c > +++ b/arch/x86/kvm/svm/sev.c > @@ -3640,7 +3640,7 @@ static int snp_begin_psc_msr(struct vcpu_svm *svm, u64 ghcb_msr) > return 1; /* resume guest */ > } > > - if (!(vcpu->kvm->arch.hypercall_exit_enabled & (1 << KVM_HC_MAP_GPA_RANGE))) { > + if (!user_exit_on_hypercall(vcpu->kvm, KVM_HC_MAP_GPA_RANGE)) { > set_ghcb_msr(svm, GHCB_MSR_PSC_RESP_ERROR); > return 1; /* resume guest */ > } > @@ -3723,7 +3723,7 @@ static int snp_begin_psc(struct vcpu_svm *svm, struct psc_buffer *psc) > bool huge; > u64 gfn; > > - if (!(vcpu->kvm->arch.hypercall_exit_enabled & (1 << KVM_HC_MAP_GPA_RANGE))) { > + if (!user_exit_on_hypercall(vcpu->kvm, KVM_HC_MAP_GPA_RANGE)) { > snp_complete_psc(svm, VMGEXIT_PSC_ERROR_GENERIC); > return 1; > } > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index 0b2fe4aa04a2..13fe5d6eb8f3 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -10041,7 +10041,7 @@ unsigned long __kvm_emulate_hypercall(struct kvm_vcpu *vcpu, unsigned long nr, > u64 gpa = a0, npages = a1, attrs = a2; > > ret = -KVM_ENOSYS; > - if (!(vcpu->kvm->arch.hypercall_exit_enabled & (1 << KVM_HC_MAP_GPA_RANGE))) > + if (!user_exit_on_hypercall(vcpu->kvm, KVM_HC_MAP_GPA_RANGE)) > break; > > if (!PAGE_ALIGNED(gpa) || !npages || > diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h > index ec623d23d13d..45dd53284dbd 100644 > --- a/arch/x86/kvm/x86.h > +++ b/arch/x86/kvm/x86.h > @@ -612,4 +612,9 @@ int kvm_sev_es_string_io(struct kvm_vcpu *vcpu, unsigned int size, > unsigned int port, void *data, unsigned int count, > int in); > > +static inline bool user_exit_on_hypercall(struct kvm *kvm, unsigned long hc_nr) > +{ > + return kvm->arch.hypercall_exit_enabled & BIT(hc_nr); > +} > + > #endif