--- /dev/null
+From foo@baz Mon Mar 15 01:37:54 PM CET 2021
+From: Andrew Scull <ascull@google.com>
+Date: Mon, 15 Mar 2021 12:21:36 +0000
+Subject: KVM: arm64: Fix nVHE hyp panic host context restore
+To: kvmarm@lists.cs.columbia.edu
+Cc: maz@kernel.org, kernel-team@android.com, Andrew Scull <ascull@google.com>, stable@vger.kernel.org
+Message-ID: <20210315122136.1687370-1-ascull@google.com>
+
+From: Andrew Scull <ascull@google.com>
+
+Commit c4b000c3928d4f20acef79dccf3a65ae3795e0b0 upstream.
+
+When panicking from the nVHE hyp and restoring the host context, x29 is
+expected to hold a pointer to the host context. This wasn't being done
+so fix it to make sure there's a valid pointer the host context being
+used.
+
+Rather than passing a boolean indicating whether or not the host context
+should be restored, instead pass the pointer to the host context. NULL
+is passed to indicate that no context should be restored.
+
+Fixes: a2e102e20fd6 ("KVM: arm64: nVHE: Handle hyp panics")
+Cc: stable@vger.kernel.org # 5.11.y only
+Signed-off-by: Andrew Scull <ascull@google.com>
+Signed-off-by: Marc Zyngier <maz@kernel.org>
+Link: https://lore.kernel.org/r/20210219122406.1337626-1-ascull@google.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/arm64/include/asm/kvm_hyp.h | 3 ++-
+ arch/arm64/kvm/hyp/nvhe/host.S | 20 ++++++++++----------
+ arch/arm64/kvm/hyp/nvhe/switch.c | 3 +--
+ 3 files changed, 13 insertions(+), 13 deletions(-)
+
+--- a/arch/arm64/include/asm/kvm_hyp.h
++++ b/arch/arm64/include/asm/kvm_hyp.h
+@@ -102,7 +102,8 @@ bool kvm_host_psci_handler(struct kvm_cp
+
+ void __noreturn hyp_panic(void);
+ #ifdef __KVM_NVHE_HYPERVISOR__
+-void __noreturn __hyp_do_panic(bool restore_host, u64 spsr, u64 elr, u64 par);
++void __noreturn __hyp_do_panic(struct kvm_cpu_context *host_ctxt, u64 spsr,
++ u64 elr, u64 par);
+ #endif
+
+ #endif /* __ARM64_KVM_HYP_H__ */
+--- a/arch/arm64/kvm/hyp/nvhe/host.S
++++ b/arch/arm64/kvm/hyp/nvhe/host.S
+@@ -71,10 +71,15 @@ SYM_FUNC_START(__host_enter)
+ SYM_FUNC_END(__host_enter)
+
+ /*
+- * void __noreturn __hyp_do_panic(bool restore_host, u64 spsr, u64 elr, u64 par);
++ * void __noreturn __hyp_do_panic(struct kvm_cpu_context *host_ctxt, u64 spsr,
++ * u64 elr, u64 par);
+ */
+ SYM_FUNC_START(__hyp_do_panic)
+- /* Load the format arguments into x1-7 */
++ mov x29, x0
++
++ /* Load the format string into x0 and arguments into x1-7 */
++ ldr x0, =__hyp_panic_string
++
+ mov x6, x3
+ get_vcpu_ptr x7, x3
+
+@@ -89,13 +94,8 @@ SYM_FUNC_START(__hyp_do_panic)
+ ldr lr, =panic
+ msr elr_el2, lr
+
+- /*
+- * Set the panic format string and enter the host, conditionally
+- * restoring the host context.
+- */
+- cmp x0, xzr
+- ldr x0, =__hyp_panic_string
+- b.eq __host_enter_without_restoring
++ /* Enter the host, conditionally restoring the host context. */
++ cbz x29, __host_enter_without_restoring
+ b __host_enter_for_panic
+ SYM_FUNC_END(__hyp_do_panic)
+
+@@ -150,7 +150,7 @@ SYM_FUNC_END(__hyp_do_panic)
+
+ .macro invalid_host_el1_vect
+ .align 7
+- mov x0, xzr /* restore_host = false */
++ mov x0, xzr /* host_ctxt = NULL */
+ mrs x1, spsr_el2
+ mrs x2, elr_el2
+ mrs x3, par_el1
+--- a/arch/arm64/kvm/hyp/nvhe/switch.c
++++ b/arch/arm64/kvm/hyp/nvhe/switch.c
+@@ -266,7 +266,6 @@ void __noreturn hyp_panic(void)
+ u64 spsr = read_sysreg_el2(SYS_SPSR);
+ u64 elr = read_sysreg_el2(SYS_ELR);
+ u64 par = read_sysreg_par();
+- bool restore_host = true;
+ struct kvm_cpu_context *host_ctxt;
+ struct kvm_vcpu *vcpu;
+
+@@ -280,7 +279,7 @@ void __noreturn hyp_panic(void)
+ __sysreg_restore_state_nvhe(host_ctxt);
+ }
+
+- __hyp_do_panic(restore_host, spsr, elr, par);
++ __hyp_do_panic(host_ctxt, spsr, elr, par);
+ unreachable();
+ }
+