Message ID | 20250211025442.3071607-5-binbin.wu@linux.intel.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | KVM: TDX: TDX hypercalls may exit to userspace | expand |
On Tue, Feb 11, 2025, Binbin Wu wrote: > --- > arch/x86/kvm/vmx/tdx.c | 19 +++++++++++++++++++ > 1 file changed, 19 insertions(+) > > diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c > index 420ee492e919..daa49f2ee2b3 100644 > --- a/arch/x86/kvm/vmx/tdx.c > +++ b/arch/x86/kvm/vmx/tdx.c > @@ -964,6 +964,23 @@ fastpath_t tdx_vcpu_run(struct kvm_vcpu *vcpu, bool force_immediate_exit) > return tdx_exit_handlers_fastpath(vcpu); > } > > +static int complete_hypercall_exit(struct kvm_vcpu *vcpu) > +{ > + tdvmcall_set_return_code(vcpu, vcpu->run->hypercall.ret); > + return 1; > +} > + > +static int tdx_emulate_vmcall(struct kvm_vcpu *vcpu) > +{ > + kvm_rax_write(vcpu, to_tdx(vcpu)->vp_enter_args.r10); > + kvm_rbx_write(vcpu, to_tdx(vcpu)->vp_enter_args.r11); > + kvm_rcx_write(vcpu, to_tdx(vcpu)->vp_enter_args.r12); > + kvm_rdx_write(vcpu, to_tdx(vcpu)->vp_enter_args.r13); > + kvm_rsi_write(vcpu, to_tdx(vcpu)->vp_enter_args.r14); > + > + return __kvm_emulate_hypercall(vcpu, 0, complete_hypercall_exit); Thanks for persevering through all the ideas and churn, I like how this turned out!
diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c index 420ee492e919..daa49f2ee2b3 100644 --- a/arch/x86/kvm/vmx/tdx.c +++ b/arch/x86/kvm/vmx/tdx.c @@ -964,6 +964,23 @@ fastpath_t tdx_vcpu_run(struct kvm_vcpu *vcpu, bool force_immediate_exit) return tdx_exit_handlers_fastpath(vcpu); } +static int complete_hypercall_exit(struct kvm_vcpu *vcpu) +{ + tdvmcall_set_return_code(vcpu, vcpu->run->hypercall.ret); + return 1; +} + +static int tdx_emulate_vmcall(struct kvm_vcpu *vcpu) +{ + kvm_rax_write(vcpu, to_tdx(vcpu)->vp_enter_args.r10); + kvm_rbx_write(vcpu, to_tdx(vcpu)->vp_enter_args.r11); + kvm_rcx_write(vcpu, to_tdx(vcpu)->vp_enter_args.r12); + kvm_rdx_write(vcpu, to_tdx(vcpu)->vp_enter_args.r13); + kvm_rsi_write(vcpu, to_tdx(vcpu)->vp_enter_args.r14); + + return __kvm_emulate_hypercall(vcpu, 0, complete_hypercall_exit); +} + static int handle_tdvmcall(struct kvm_vcpu *vcpu) { switch (tdvmcall_leaf(vcpu)) { @@ -1309,6 +1326,8 @@ int tdx_handle_exit(struct kvm_vcpu *vcpu, fastpath_t fastpath) return 0; case EXIT_REASON_TDCALL: return handle_tdvmcall(vcpu); + case EXIT_REASON_VMCALL: + return tdx_emulate_vmcall(vcpu); default: break; }