| From: Marc Zyngier <marc.zyngier@arm.com> |
| Date: Tue, 16 Jan 2018 10:23:47 +0000 |
| Subject: arm64: KVM: Fix SMCCC handling of unimplemented SMC/HVC calls |
| |
| commit acfb3b883f6d6a4b5d27ad7fdded11f6a09ae6dd upstream. |
| |
| KVM doesn't follow the SMCCC when it comes to unimplemented calls, |
| and inject an UNDEF instead of returning an error. Since firmware |
| calls are now used for security mitigation, they are becoming more |
| common, and the undef is counter productive. |
| |
| Instead, let's follow the SMCCC which states that -1 must be returned |
| to the caller when getting an unknown function number. |
| |
| Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> |
| Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org> |
| [bwh: Backported to 3.16: use vcpu_reg()] |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| arch/arm64/kvm/handle_exit.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/arch/arm64/kvm/handle_exit.c |
| +++ b/arch/arm64/kvm/handle_exit.c |
| @@ -34,7 +34,7 @@ static int handle_hvc(struct kvm_vcpu *v |
| |
| ret = kvm_psci_call(vcpu); |
| if (ret < 0) { |
| - kvm_inject_undefined(vcpu); |
| + *vcpu_reg(vcpu, 0) = ~0UL; |
| return 1; |
| } |
| |
| @@ -43,7 +43,7 @@ static int handle_hvc(struct kvm_vcpu *v |
| |
| static int handle_smc(struct kvm_vcpu *vcpu, struct kvm_run *run) |
| { |
| - kvm_inject_undefined(vcpu); |
| + *vcpu_reg(vcpu, 0) = ~0UL; |
| return 1; |
| } |
| |