From: Kees Cook keescook@chromium.org
mainline inclusion from linux-v5.3-rc1 commit ba5c5e4a5da443e80a3722e67515de5e37375b18 category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/I4RIZO CVE: NA
--------------------------------
While jump_label_init() was moved earlier in the boot process in efd9e03facd0 ("arm64: Use static keys for CPU features"), it wasn't early enough for early params to use it. The old state of things was as described here...
init/main.c calls out to arch-specific things before general jump label and early param handling:
asmlinkage __visible void __init start_kernel(void) { ... setup_arch(&command_line); ... smp_prepare_boot_cpu(); ... /* parameters may set static keys */ jump_label_init(); parse_early_param(); ... }
x86 setup_arch() wants those earlier, so it handles jump label and early param:
void __init setup_arch(char **cmdline_p) { ... jump_label_init(); ... parse_early_param(); ... }
arm64 setup_arch() only had early param:
void __init setup_arch(char **cmdline_p) { ... parse_early_param(); ... }
with jump label later in smp_prepare_boot_cpu():
void __init smp_prepare_boot_cpu(void) { ... jump_label_init(); ... }
This moves arm64 jump_label_init() from smp_prepare_boot_cpu() to setup_arch(), as done already on x86, in preparation from early param usage in the init_on_alloc/free() series: https://lkml.kernel.org/r/1561572949.5154.81.camel@lca.pw
Link: http://lkml.kernel.org/r/201906271003.005303B52@keescook Signed-off-by: Kees Cook keescook@chromium.org Acked-by: Ard Biesheuvel ard.biesheuvel@linaro.org Acked-by: Catalin Marinas catalin.marinas@arm.com Cc: Alexander Potapenko glider@google.com Cc: Qian Cai cai@lca.pw Cc: Will Deacon will@kernel.org Signed-off-by: Andrew Morton akpm@linux-foundation.org Signed-off-by: Linus Torvalds torvalds@linux-foundation.org Signed-off-by: Ma Wupeng mawupeng1@huawei.com Reviewed-by: Kefeng Wangwangkefeng.wang@huawei.com Signed-off-by: Yang Yingliang yangyingliang@huawei.com --- arch/arm64/kernel/setup.c | 5 +++++ arch/arm64/kernel/smp.c | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c index e23b804773874..6d7bb45717e0a 100644 --- a/arch/arm64/kernel/setup.c +++ b/arch/arm64/kernel/setup.c @@ -341,6 +341,11 @@ void __init setup_arch(char **cmdline_p)
setup_machine_fdt(__fdt_pointer);
+ /* + * Initialise the static keys early as they may be enabled by the + * cpufeature code and early parameters. + */ + jump_label_init(); parse_early_param();
/* diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c index f09c10863867b..4ef5bdb65b9db 100644 --- a/arch/arm64/kernel/smp.c +++ b/arch/arm64/kernel/smp.c @@ -614,11 +614,6 @@ void __init smp_cpus_done(unsigned int max_cpus) void __init smp_prepare_boot_cpu(void) { set_my_cpu_offset(per_cpu_offset(smp_processor_id())); - /* - * Initialise the static keys early as they may be enabled by the - * cpufeature code. - */ - jump_label_init(); cpuinfo_store_boot_cpu();
/*