mirror of
https://github.com/torvalds/linux.git
synced 2026-06-03 03:53:37 +02:00
KVM: TDX: Handle KVM hypercall with TDG.VP.VMCALL
Handle KVM hypercall for TDX according to TDX Guest-Host Communication Interface (GHCI) specification. The TDX GHCI specification defines the ABI for the guest TD to issue hypercalls. When R10 is non-zero, it indicates the TDG.VP.VMCALL is vendor-specific. KVM uses R10 as KVM hypercall number and R11-R14 as 4 arguments, while the error code is returned in R10. Morph the TDG.VP.VMCALL with KVM hypercall to EXIT_REASON_VMCALL and marshall r10~r14 from vp_enter_args to the appropriate x86 registers for KVM hypercall handling. Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com> Co-developed-by: Binbin Wu <binbin.wu@linux.intel.com> Signed-off-by: Binbin Wu <binbin.wu@linux.intel.com> Message-ID: <20250222014225.897298-6-binbin.wu@linux.intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
c42856af8f
commit
d5998c02bc
|
|
@ -978,6 +978,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)) {
|
||||
|
|
@ -1349,6 +1366,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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user