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
@@ -94,7 +94,8 @@ u64 __guest_enter(struct kvm_vcpu *vcpu);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
@@ -64,10 +64,15 @@ __host_enter_without_restoring: SYM_FUNC_END(__host_exit) /* - * 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
@@ -82,13 +87,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)
@@ -144,7 +144,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
@@ -251,7 +251,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;
@@ -265,7 +264,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
Patch "KVM: arm64: Fix nVHE hyp panic host context restore" has been added to the 5.10-stable tree
This 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.10-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.10 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:38:17 PM CET 2021
From: Andrew Scull <[email protected]>
Date: Mon, 15 Mar 2021 12:22:10 +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
@@ -99,7 +99,8 @@ u64 __guest_enter(struct kvm_vcpu *vcpu)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
@@ -64,10 +64,15 @@ __host_enter_without_restoring: SYM_FUNC_END(__host_exit) /* - * 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
@@ -82,13 +87,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)
@@ -144,7 +144,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
@@ -260,7 +260,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;
@@ -274,7 +273,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.10/kvm-arm64-fix-nvhe-hyp-panic-host-context-restore.patch queue-5.10/kvm-arm64-avoid-corrupting-vcpu-context-register-in-guest-exit.patch
_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm