| From foo@baz Mon Apr 9 17:09:24 CEST 2018 |
| From: James Morse <james.morse@arm.com> |
| Date: Tue, 25 Apr 2017 18:02:44 +0100 |
| Subject: KVM: arm: Restore banked registers and physical timer access on hyp_panic() |
| |
| From: James Morse <james.morse@arm.com> |
| |
| |
| [ Upstream commit d2e19368848ce6065daa785efca26faed54732b6 ] |
| |
| When KVM panics, it hurridly restores the host context and parachutes |
| into the host's panic() code. This looks like it was copied from arm64, |
| the 32bit KVM panic code needs to restore the host's banked registers |
| too. |
| |
| At some point panic() touches the physical timer/counter, this will |
| trap back to HYP. If we're lucky, we panic again. |
| |
| Add a __timer_save_state() call to KVMs hyp_panic() path, this saves the |
| guest registers and disables the traps for the host. |
| |
| Fixes: c36b6db5f3e4 ("ARM: KVM: Add panic handling code") |
| Signed-off-by: James Morse <james.morse@arm.com> |
| Reviewed-by: Marc Zyngier <marc.zyngier@arm.com> |
| Reviewed-by: Christoffer Dall <cdall@linaro.org> |
| Signed-off-by: Christoffer Dall <cdall@linaro.org> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/arm/kvm/hyp/switch.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| --- a/arch/arm/kvm/hyp/switch.c |
| +++ b/arch/arm/kvm/hyp/switch.c |
| @@ -237,8 +237,10 @@ void __hyp_text __noreturn __hyp_panic(i |
| |
| vcpu = (struct kvm_vcpu *)read_sysreg(HTPIDR); |
| host_ctxt = kern_hyp_va(vcpu->arch.host_cpu_context); |
| + __timer_save_state(vcpu); |
| __deactivate_traps(vcpu); |
| __deactivate_vm(vcpu); |
| + __banked_restore_state(host_ctxt); |
| __sysreg_restore_state(host_ctxt); |
| } |
| |