lkml.org 
[lkml]   [2022]   [Oct]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v10 101/108] KVM: TDX: Handle TDX PV map_gpa hypercall
    Date
    From: Isaku Yamahata <isaku.yamahata@intel.com>

    Wire up TDX PV map_gpa hypercall to the kvm/mmu backend.

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

    diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c
    index 16f168f4f21a..4db552b60271 100644
    --- a/arch/x86/kvm/vmx/tdx.c
    +++ b/arch/x86/kvm/vmx/tdx.c
    @@ -1086,6 +1086,37 @@ static int tdx_report_fatal_error(struct kvm_vcpu *vcpu)
    return 0;
    }

    +static int tdx_map_gpa(struct kvm_vcpu *vcpu)
    +{
    + struct kvm *kvm = vcpu->kvm;
    + gpa_t gpa = tdvmcall_a0_read(vcpu);
    + gpa_t size = tdvmcall_a1_read(vcpu);
    + gpa_t end = gpa + size;
    + gfn_t s = gpa_to_gfn(gpa) & ~kvm_gfn_shared_mask(kvm);
    + gfn_t e = gpa_to_gfn(end) & ~kvm_gfn_shared_mask(kvm);
    + bool map_private = kvm_is_private_gpa(kvm, gpa);
    + int ret;
    +
    + if (!IS_ALIGNED(gpa, 4096) || !IS_ALIGNED(size, 4096) ||
    + end < gpa ||
    + end > kvm_gfn_shared_mask(kvm) << (PAGE_SHIFT + 1) ||
    + kvm_is_private_gpa(kvm, gpa) != kvm_is_private_gpa(kvm, end)) {
    + tdvmcall_set_return_code(vcpu, TDG_VP_VMCALL_INVALID_OPERAND);
    + return 1;
    + }
    +
    + ret = kvm_mmu_map_gpa(vcpu, &s, e, map_private);
    + if (ret == -EAGAIN) {
    + tdvmcall_set_return_code(vcpu, TDG_VP_VMCALL_RETRY);
    + tdvmcall_set_return_val(vcpu, gfn_to_gpa(s));
    + } else if (ret)
    + tdvmcall_set_return_code(vcpu, TDG_VP_VMCALL_INVALID_OPERAND);
    + else
    + tdvmcall_set_return_code(vcpu, TDG_VP_VMCALL_SUCCESS);
    +
    + return 1;
    +}
    +
    static int handle_tdvmcall(struct kvm_vcpu *vcpu)
    {
    if (tdvmcall_exit_type(vcpu))
    @@ -1106,6 +1137,8 @@ static int handle_tdvmcall(struct kvm_vcpu *vcpu)
    return tdx_emulate_wrmsr(vcpu);
    case TDG_VP_VMCALL_REPORT_FATAL_ERROR:
    return tdx_report_fatal_error(vcpu);
    + case TDG_VP_VMCALL_MAP_GPA:
    + return tdx_map_gpa(vcpu);
    default:
    break;
    }
    --
    2.25.1
    \
     
     \ /
      Last update: 2022-10-30 07:30    [W:2.103 / U:0.080 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site