Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

KVM: arm64: Advertise KVM UID to guests via SMCCC

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>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20201209060932.212364-3-jianyong.wu@arm.com

authored by

Will Deacon and committed by
Marc Zyngier
923961a7 6e085e0a

+18 -9
+18 -9
arch/arm64/kvm/hypercalls.c
··· 12 12 int kvm_hvc_call_handler(struct kvm_vcpu *vcpu) 13 13 { 14 14 u32 func_id = smccc_get_function(vcpu); 15 - long val = SMCCC_RET_NOT_SUPPORTED; 15 + u64 val[4] = {SMCCC_RET_NOT_SUPPORTED}; 16 16 u32 feature; 17 17 gpa_t gpa; 18 18 19 19 switch (func_id) { 20 20 case ARM_SMCCC_VERSION_FUNC_ID: 21 - val = ARM_SMCCC_VERSION_1_1; 21 + val[0] = ARM_SMCCC_VERSION_1_1; 22 22 break; 23 23 case ARM_SMCCC_ARCH_FEATURES_FUNC_ID: 24 24 feature = smccc_get_arg1(vcpu); ··· 28 28 case SPECTRE_VULNERABLE: 29 29 break; 30 30 case SPECTRE_MITIGATED: 31 - val = SMCCC_RET_SUCCESS; 31 + val[0] = SMCCC_RET_SUCCESS; 32 32 break; 33 33 case SPECTRE_UNAFFECTED: 34 - val = SMCCC_ARCH_WORKAROUND_RET_UNAFFECTED; 34 + val[0] = SMCCC_ARCH_WORKAROUND_RET_UNAFFECTED; 35 35 break; 36 36 } 37 37 break; ··· 54 54 break; 55 55 fallthrough; 56 56 case SPECTRE_UNAFFECTED: 57 - val = SMCCC_RET_NOT_REQUIRED; 57 + val[0] = SMCCC_RET_NOT_REQUIRED; 58 58 break; 59 59 } 60 60 break; 61 61 case ARM_SMCCC_HV_PV_TIME_FEATURES: 62 - val = SMCCC_RET_SUCCESS; 62 + val[0] = SMCCC_RET_SUCCESS; 63 63 break; 64 64 } 65 65 break; 66 66 case ARM_SMCCC_HV_PV_TIME_FEATURES: 67 - val = kvm_hypercall_pv_features(vcpu); 67 + val[0] = kvm_hypercall_pv_features(vcpu); 68 68 break; 69 69 case ARM_SMCCC_HV_PV_TIME_ST: 70 70 gpa = kvm_init_stolen_time(vcpu); 71 71 if (gpa != GPA_INVALID) 72 - val = gpa; 72 + val[0] = gpa; 73 + break; 74 + case ARM_SMCCC_VENDOR_HYP_CALL_UID_FUNC_ID: 75 + val[0] = ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_0; 76 + val[1] = ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_1; 77 + val[2] = ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_2; 78 + val[3] = ARM_SMCCC_VENDOR_HYP_UID_KVM_REG_3; 79 + break; 80 + case ARM_SMCCC_VENDOR_HYP_KVM_FEATURES_FUNC_ID: 81 + val[0] = BIT(ARM_SMCCC_KVM_FUNC_FEATURES); 73 82 break; 74 83 case ARM_SMCCC_TRNG_VERSION: 75 84 case ARM_SMCCC_TRNG_FEATURES: ··· 90 81 return kvm_psci_call(vcpu); 91 82 } 92 83 93 - smccc_set_retval(vcpu, val, 0, 0, 0); 84 + smccc_set_retval(vcpu, val[0], val[1], val[2], val[3]); 94 85 return 1; 95 86 }