KVM: arm64: Fix nVHE hyp panic host context restore
Subsystems (3)
PATCH 1/1 KVM: arm64: Fix nVHE hyp panic host context restore
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.
--- 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(-)
arch/arm64/include/asm/kvm_hyp.h +2 -1
@@ -97,7 +97,8 @@ bool kvm_host_psci_handler(struct kvm_cpu_context *host_ctxt);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__ */
arch/arm64/kvm/hyp/nvhe/host.S +10 -10
@@ -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
arch/arm64/kvm/hyp/nvhe/switch.c +1 -2
@@ -257,7 +257,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;
@@ -271,7 +270,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 (); }
Signature · 6 lines
2.31.0.rc2.261.g7f71774620-goog _______________________________________________ kvmarm mailing list [email protected] https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Quoted 16 lines · Andrew Scull
Commit
c4b000c3928d4f20acef79dccf3a65ae3795e0b0upstream.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 [email protected] # 5.11.y onlySigned-off-by Andrew Scull <[email protected]>Signed-off-by Marc Zyngier <[email protected]>
Quoted 5 lines
--- 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(-)
Both backports now queued up, thanks.
greg k-h
_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
Patch "KVM: arm64: Fix nVHE hyp panic host context restore" has been added to the 5.11-stable tree
In reply to Andrew ScullThis is a note to let you know that I've just added the patch titled
KVM: arm64: Fix nVHE hyp panic host context restore
to the 5.11-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
kvm-arm64-fix-nvhe-hyp-panic-host-context-restore.patch
and it can be found in the queue-5.11 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
From foo@baz Mon Mar 15 01:37:54 PM CET 2021
From: Andrew Scull <[email protected]>
Date: Mon, 15 Mar 2021 12:21:36 +0000
Subject: KVM: arm64: Fix nVHE hyp panic host context restore
To: [email protected]
Cc: [email protected], [email protected], Andrew Scull <[email protected]>, [email protected]
Message-ID: <[email protected]>
From: Andrew Scull <[email protected]>
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.
--- 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(-)
arch/arm64/include/asm/kvm_hyp.h +2 -1
@@ -102,7 +102,8 @@ bool kvm_host_psci_handler(struct kvm_cpvoid __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__ */
arch/arm64/kvm/hyp/nvhe/host.S +10 -10
@@ -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
arch/arm64/kvm/hyp/nvhe/switch.c +1 -2
@@ -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 (); }
Patches currently in stable-queue which might be from [email protected] are
queue-5.11/kvm-arm64-fix-nvhe-hyp-panic-host-context-restore.patch queue-5.11/kvm-arm64-avoid-corrupting-vcpu-context-register-in-guest-exit.patch
_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm