lkml.org 
[lkml]   [2022]   [Mar]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH v5 090/104] KVM: TDX: handle KVM hypercall with TDG.VP.VMCALL
    Date
    From: Isaku Yamahata <isaku.yamahata@intel.com>

    The TDX Guest-Host communication interface (GHCI) specification defines
    the ABI for the guest TD to issue hypercall. It reserves vendor specific
    arguments for VMM specific use. Use it as KVM hypercall and handle it.

    Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
    ---
    arch/x86/kvm/vmx/tdx.c | 31 +++++++++++++++++++++++++++++++
    1 file changed, 31 insertions(+)

    diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c
    index 86daafd9eec0..53f59fb92dcf 100644
    --- a/arch/x86/kvm/vmx/tdx.c
    +++ b/arch/x86/kvm/vmx/tdx.c
    @@ -865,6 +865,34 @@ static int tdx_handle_triple_fault(struct kvm_vcpu *vcpu)
    return 0;
    }

    +static int tdx_emulate_vmcall(struct kvm_vcpu *vcpu)
    +{
    + unsigned long nr, a0, a1, a2, a3, ret;
    +
    + /*
    + * ABI for KVM tdvmcall argument:
    + * In Guest-Hypervisor Communication Interface(GHCI) specification,
    + * Non-zero leaf number (R10 != 0) is defined to indicate
    + * vendor-specific. KVM uses this for KVM hypercall. NOTE: KVM
    + * hypercall number starts from one. Zero isn't used for KVM hypercall
    + * number.
    + *
    + * R10: KVM h ypercall number
    + * arguments: R11, R12, R13, R14.
    + */
    + nr = kvm_r10_read(vcpu);
    + a0 = kvm_r11_read(vcpu);
    + a1 = kvm_r12_read(vcpu);
    + a2 = kvm_r13_read(vcpu);
    + a3 = kvm_r14_read(vcpu);
    +
    + ret = __kvm_emulate_hypercall(vcpu, nr, a0, a1, a2, a3, true);
    +
    + tdvmcall_set_return_code(vcpu, ret);
    +
    + return 1;
    +}
    +
    static int handle_tdvmcall(struct kvm_vcpu *vcpu)
    {
    struct vcpu_tdx *tdx = to_tdx(vcpu);
    @@ -872,6 +900,9 @@ static int handle_tdvmcall(struct kvm_vcpu *vcpu)
    if (unlikely(tdx->tdvmcall.xmm_mask))
    goto unsupported;

    + if (tdvmcall_exit_type(vcpu))
    + return tdx_emulate_vmcall(vcpu);
    +
    switch (tdvmcall_exit_reason(vcpu)) {
    default:
    break;
    --
    2.25.1
    \
     
     \ /
      Last update: 2022-03-04 21:00    [W:2.338 / U:0.960 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site