On Mon, Mar 21, 2022 at 11:32:21AM -0700, Sagi Shahar <sagis@xxxxxxxxxx> wrote: > > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > > index 314ae43e07bf..9acb33a17445 100644 > > --- a/arch/x86/kvm/x86.c > > +++ b/arch/x86/kvm/x86.c > > @@ -9090,26 +9090,15 @@ static int complete_hypercall_exit(struct kvm_vcpu *vcpu) > > return kvm_skip_emulated_instruction(vcpu); > > } > > > > -int kvm_emulate_hypercall(struct kvm_vcpu *vcpu) > > +unsigned long __kvm_emulate_hypercall(struct kvm_vcpu *vcpu, unsigned long nr, > > + unsigned long a0, unsigned long a1, > > + unsigned long a2, unsigned long a3, > > + int op_64_bit) > > { > > - unsigned long nr, a0, a1, a2, a3, ret; > > - int op_64_bit; > > - > > - if (kvm_xen_hypercall_enabled(vcpu->kvm)) > > - return kvm_xen_hypercall(vcpu); > > - > > - if (kvm_hv_hypercall_enabled(vcpu)) > > - return kvm_hv_hypercall(vcpu); > > - > > - nr = kvm_rax_read(vcpu); > > - a0 = kvm_rbx_read(vcpu); > > - a1 = kvm_rcx_read(vcpu); > > - a2 = kvm_rdx_read(vcpu); > > - a3 = kvm_rsi_read(vcpu); > > + unsigned long ret; > > > > trace_kvm_hypercall(nr, a0, a1, a2, a3); > > > > - op_64_bit = is_64_bit_hypercall(vcpu); > > if (!op_64_bit) { > > nr &= 0xFFFFFFFF; > > a0 &= 0xFFFFFFFF; > > @@ -9118,11 +9107,6 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu) > > a3 &= 0xFFFFFFFF; > > } > > > > - if (static_call(kvm_x86_get_cpl)(vcpu) != 0) { > > - ret = -KVM_EPERM; > > - goto out; > > - } > > - > > ret = -KVM_ENOSYS; > > > > switch (nr) { > > @@ -9181,6 +9165,34 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu) > > ret = -KVM_ENOSYS; > > break; > > } > > + return ret; > > +} > > +EXPORT_SYMBOL_GPL(__kvm_emulate_hypercall); > > + > > +int kvm_emulate_hypercall(struct kvm_vcpu *vcpu) > > +{ > > + unsigned long nr, a0, a1, a2, a3, ret; > > + int op_64_bit; > > + > > + if (kvm_xen_hypercall_enabled(vcpu->kvm)) > > + return kvm_xen_hypercall(vcpu); > > + > > + if (kvm_hv_hypercall_enabled(vcpu)) > > + return kvm_hv_hypercall(vcpu); > > + > > + nr = kvm_rax_read(vcpu); > > + a0 = kvm_rbx_read(vcpu); > > + a1 = kvm_rcx_read(vcpu); > > + a2 = kvm_rdx_read(vcpu); > > + a3 = kvm_rsi_read(vcpu); > > + op_64_bit = is_64_bit_mode(vcpu); > > I think this should be "op_64_bit = is_64_bit_hypercall(vcpu);" > is_64_bit_mode was replaced with is_64_bit_hypercall to support > protected guests here: > https://lore.kernel.org/all/87cztf8h43.fsf@xxxxxxxxxxxxxxxxxxxx/T/ > > Without it, op_64_bit will be set to 0 for TD VMs which will cause the > upper 32 bit of the registers to be cleared in __kvm_emulate_hypercall Oops, thanks for pointing it out. I'll fix it up with next respin. -- Isaku Yamahata <isaku.yamahata@xxxxxxxxx>