mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-28 14:44:10 +08:00
76f4e2da45
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: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Mark Rutland <mark.rutland@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
36 lines
924 B
C
36 lines
924 B
C
/*
|
|
* CPU reset routines
|
|
*
|
|
* Copyright (C) 2015 Huawei Futurewei Technologies.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#ifndef _ARM64_CPU_RESET_H
|
|
#define _ARM64_CPU_RESET_H
|
|
|
|
#include <asm/virt.h>
|
|
|
|
void __cpu_soft_restart(unsigned long el2_switch, unsigned long entry,
|
|
unsigned long arg0, unsigned long arg1, unsigned long arg2);
|
|
|
|
static inline void __noreturn cpu_soft_restart(unsigned long entry,
|
|
unsigned long arg0,
|
|
unsigned long arg1,
|
|
unsigned long arg2)
|
|
{
|
|
typeof(__cpu_soft_restart) *restart;
|
|
|
|
unsigned long el2_switch = !is_kernel_in_hyp_mode() &&
|
|
is_hyp_mode_available();
|
|
restart = (void *)__pa_symbol(__cpu_soft_restart);
|
|
|
|
cpu_install_idmap();
|
|
restart(el2_switch, entry, arg0, arg1, arg2);
|
|
unreachable();
|
|
}
|
|
|
|
#endif
|