Commit 76f4e2da authored by Mark Rutland's avatar Mark Rutland Committed by Will Deacon

arm64: kexec: always reset to EL2 if present

Currently machine_kexec() doesn't reset to EL2 in the case of a
crashdump kernel. This leaves potentially dodgy state active at EL2, and
means that if the crashdump kernel attempts to online secondary CPUs,
these will be booted as mismatched ELs.

Let's reset to EL2, as we do in all other cases, and simplify things. If
EL2 state is corrupt, things are already sufficiently bad that kdump is
unlikely to work, and it's best-effort regardless.

Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: James Morse <james.morse@arm.com>
Acked-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
parent 7e7df71f
...@@ -16,13 +16,14 @@ ...@@ -16,13 +16,14 @@
void __cpu_soft_restart(unsigned long el2_switch, unsigned long entry, void __cpu_soft_restart(unsigned long el2_switch, unsigned long entry,
unsigned long arg0, unsigned long arg1, unsigned long arg2); unsigned long arg0, unsigned long arg1, unsigned long arg2);
static inline void __noreturn cpu_soft_restart(unsigned long el2_switch, static inline void __noreturn cpu_soft_restart(unsigned long entry,
unsigned long entry, unsigned long arg0, unsigned long arg1, unsigned long arg0,
unsigned long arg2) unsigned long arg1,
unsigned long arg2)
{ {
typeof(__cpu_soft_restart) *restart; typeof(__cpu_soft_restart) *restart;
el2_switch = el2_switch && !is_kernel_in_hyp_mode() && unsigned long el2_switch = !is_kernel_in_hyp_mode() &&
is_hyp_mode_available(); is_hyp_mode_available();
restart = (void *)__pa_symbol(__cpu_soft_restart); restart = (void *)__pa_symbol(__cpu_soft_restart);
......
...@@ -207,8 +207,7 @@ void machine_kexec(struct kimage *kimage) ...@@ -207,8 +207,7 @@ void machine_kexec(struct kimage *kimage)
* relocation is complete. * relocation is complete.
*/ */
cpu_soft_restart(kimage != kexec_crash_image, cpu_soft_restart(reboot_code_buffer_phys, kimage->head, kimage->start, 0);
reboot_code_buffer_phys, kimage->head, kimage->start, 0);
BUG(); /* Should never get here. */ BUG(); /* Should never get here. */
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment