lkml.org 
[lkml]   [2020]   [Dec]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v16 2/9] arm/arm64: KVM: Advertise KVM UID to guests via SMCCC
    Date
    From: Will Deacon <will@kernel.org>

    We can advertise ourselves to guests as KVM and provide a basic features
    bitmap for discoverability of future hypervisor services.

    Cc: Marc Zyngier <maz@kernel.org>
    Signed-off-by: Will Deacon <will@kernel.org>
    Signed-off-by: Jianyong Wu <jianyong.wu@arm.com>
    ---
    arch/arm64/kvm/hypercalls.c | 27 ++++++++++++++++++---------
    1 file changed, 18 insertions(+), 9 deletions(-)

    diff --git a/arch/arm64/kvm/hypercalls.c b/arch/arm64/kvm/hypercalls.c
    index 25ea4ecb6449..b9d8607083eb 100644
    --- a/arch/arm64/kvm/hypercalls.c
    +++ b/arch/arm64/kvm/hypercalls.c
    @@ -12,13 +12,13 @@
    int kvm_hvc_call_handler(struct kvm_vcpu *vcpu)
    {
    u32 func_id = smccc_get_function(vcpu);
    - long val = SMCCC_RET_NOT_SUPPORTED;
    + u64 val[4] = {SMCCC_RET_NOT_SUPPORTED};
    u32 feature;
    gpa_t gpa;

    switch (func_id) {
    case ARM_SMCCC_VERSION_FUNC_ID:
    - val = ARM_SMCCC_VERSION_1_1;
    + val[0] = ARM_SMCCC_VERSION_1_1;
    break;
    case ARM_SMCCC_ARCH_FEATURES_FUNC_ID:
    feature = smccc_get_arg1(vcpu);
    @@ -28,10 +28,10 @@ int kvm_hvc_call_handler(struct kvm_vcpu *vcpu)
    case SPECTRE_VULNERABLE:
    break;
    case SPECTRE_MITIGATED:
    - val = SMCCC_RET_SUCCESS;
    + val[0] = SMCCC_RET_SUCCESS;
    break;
    case SPECTRE_UNAFFECTED:
    - val = SMCCC_ARCH_WORKAROUND_RET_UNAFFECTED;
    + val[0] = SMCCC_ARCH_WORKAROUND_RET_UNAFFECTED;
    break;
    }
    break;
    @@ -54,27 +54,36 @@ int kvm_hvc_call_handler(struct kvm_vcpu *vcpu)
    break;
    fallthrough;
    case SPECTRE_UNAFFECTED:
    - val = SMCCC_RET_NOT_REQUIRED;
    + val[0] = SMCCC_RET_NOT_REQUIRED;
    break;
    }
    break;
    case ARM_SMCCC_HV_PV_TIME_FEATURES:
    - val = SMCCC_RET_SUCCESS;
    + val[0] = SMCCC_RET_SUCCESS;
    break;
    }
    break;
    case ARM_SMCCC_HV_PV_TIME_FEATURES:
    - val = kvm_hypercall_pv_features(vcpu);
    + val[0] = kvm_hypercall_pv_features(vcpu);
    break;
    case ARM_SMCCC_HV_PV_TIME_ST:
    gpa = kvm_init_stolen_time(vcpu);
    if (gpa != GPA_INVALID)
    - val = gpa;
    + val[0] = gpa;
    + break;
    + case ARM_SMCCC_VENDOR_HYP_CALL_UID_FUNC_ID:
    + val[0] = ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_0;
    + val[1] = ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_1;
    + val[2] = ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_2;
    + val[3] = ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_3;
    + break;
    + case ARM_SMCCC_VENDOR_HYP_KVM_FEATURES_FUNC_ID:
    + val[0] = BIT(ARM_SMCCC_KVM_FUNC_FEATURES);
    break;
    default:
    return kvm_psci_call(vcpu);
    }

    - smccc_set_retval(vcpu, val, 0, 0, 0);
    + smccc_set_retval(vcpu, val[0], val[1], val[2], val[3]);
    return 1;
    }
    --
    2.17.1
    \
     
     \ /
      Last update: 2020-12-09 07:15    [W:3.865 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site