| From 72ecb835d6f0483534bed476c25f6ef37c72fc25 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 17 Jun 2020 11:54:56 +0100 |
| Subject: KVM: arm64: Fix kvm_reset_vcpu() return code being incorrect with SVE |
| |
| From: Steven Price <steven.price@arm.com> |
| |
| If SVE is enabled then 'ret' can be assigned the return value of |
| kvm_vcpu_enable_sve() which may be 0 causing future "goto out" sites to |
| erroneously return 0 on failure rather than -EINVAL as expected. |
| |
| Remove the initialisation of 'ret' and make setting the return value |
| explicit to avoid this situation in the future. |
| |
| Fixes: 9a3cdf26e336 ("KVM: arm64/sve: Allow userspace to enable SVE for vcpus") |
| Cc: stable@vger.kernel.org |
| Reported-by: James Morse <james.morse@arm.com> |
| Signed-off-by: Steven Price <steven.price@arm.com> |
| Signed-off-by: Marc Zyngier <maz@kernel.org> |
| Link: https://lore.kernel.org/r/20200617105456.28245-1-steven.price@arm.com |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/arm64/kvm/reset.c | 10 +++++++--- |
| 1 file changed, 7 insertions(+), 3 deletions(-) |
| |
| --- a/arch/arm64/kvm/reset.c |
| +++ b/arch/arm64/kvm/reset.c |
| @@ -258,7 +258,7 @@ static int kvm_vcpu_enable_ptrauth(struc |
| int kvm_reset_vcpu(struct kvm_vcpu *vcpu) |
| { |
| const struct kvm_regs *cpu_reset; |
| - int ret = -EINVAL; |
| + int ret; |
| bool loaded; |
| |
| /* Reset PMU outside of the non-preemptible section */ |
| @@ -281,15 +281,19 @@ int kvm_reset_vcpu(struct kvm_vcpu *vcpu |
| |
| if (test_bit(KVM_ARM_VCPU_PTRAUTH_ADDRESS, vcpu->arch.features) || |
| test_bit(KVM_ARM_VCPU_PTRAUTH_GENERIC, vcpu->arch.features)) { |
| - if (kvm_vcpu_enable_ptrauth(vcpu)) |
| + if (kvm_vcpu_enable_ptrauth(vcpu)) { |
| + ret = -EINVAL; |
| goto out; |
| + } |
| } |
| |
| switch (vcpu->arch.target) { |
| default: |
| if (test_bit(KVM_ARM_VCPU_EL1_32BIT, vcpu->arch.features)) { |
| - if (!cpu_has_32bit_el1()) |
| + if (!cpu_has_32bit_el1()) { |
| + ret = -EINVAL; |
| goto out; |
| + } |
| cpu_reset = &default_regs_reset32; |
| } else { |
| cpu_reset = &default_regs_reset; |