s390/early: move functions which may not access bss section to extra file
Move functions which may not access bss section to extra file. This makes it easier to verify that all early functions which may not rely on an initialized bss section are not accessing it. Reviewed-by: Vasily Gorbik <gor@linux.ibm.com> Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
32fd2b4bcf
commit
971a9ca625
|
@ -6,22 +6,26 @@
|
|||
ifdef CONFIG_FUNCTION_TRACER
|
||||
|
||||
# Do not trace tracer code
|
||||
CFLAGS_REMOVE_ftrace.o = $(CC_FLAGS_FTRACE)
|
||||
CFLAGS_REMOVE_ftrace.o = $(CC_FLAGS_FTRACE)
|
||||
|
||||
# Do not trace early setup code
|
||||
CFLAGS_REMOVE_als.o = $(CC_FLAGS_FTRACE)
|
||||
CFLAGS_REMOVE_early.o = $(CC_FLAGS_FTRACE)
|
||||
CFLAGS_REMOVE_als.o = $(CC_FLAGS_FTRACE)
|
||||
CFLAGS_REMOVE_early.o = $(CC_FLAGS_FTRACE)
|
||||
CFLAGS_REMOVE_early_nobss.o = $(CC_FLAGS_FTRACE)
|
||||
|
||||
endif
|
||||
|
||||
GCOV_PROFILE_als.o := n
|
||||
GCOV_PROFILE_early.o := n
|
||||
GCOV_PROFILE_als.o := n
|
||||
GCOV_PROFILE_early.o := n
|
||||
GCOV_PROFILE_early_nobss.o := n
|
||||
|
||||
KCOV_INSTRUMENT_als.o := n
|
||||
KCOV_INSTRUMENT_early.o := n
|
||||
KCOV_INSTRUMENT_als.o := n
|
||||
KCOV_INSTRUMENT_early.o := n
|
||||
KCOV_INSTRUMENT_early_nobss.o := n
|
||||
|
||||
UBSAN_SANITIZE_als.o := n
|
||||
UBSAN_SANITIZE_early.o := n
|
||||
UBSAN_SANITIZE_als.o := n
|
||||
UBSAN_SANITIZE_early.o := n
|
||||
UBSAN_SANITIZE_early_nobss.o := n
|
||||
|
||||
#
|
||||
# Use -march=z900 for als.c to be able to print an error
|
||||
|
@ -57,7 +61,7 @@ CFLAGS_ptrace.o += -DUTS_MACHINE='"$(UTS_MACHINE)"'
|
|||
|
||||
obj-y := traps.o time.o process.o base.o early.o setup.o idle.o vtime.o
|
||||
obj-y += processor.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o nmi.o
|
||||
obj-y += debug.o irq.o ipl.o dis.o diag.o vdso.o als.o
|
||||
obj-y += debug.o irq.o ipl.o dis.o diag.o vdso.o als.o early_nobss.o
|
||||
obj-y += sysinfo.o jump_label.o lgr.o os_info.o machine_kexec.o pgm_check.o
|
||||
obj-y += runtime_instr.o cache.o fpu.o dumpstack.o guarded_storage.o sthyi.o
|
||||
obj-y += entry.o reipl.o relocate_kernel.o kdebugfs.o alternative.o
|
||||
|
|
|
@ -33,32 +33,6 @@
|
|||
|
||||
static void __init setup_boot_command_line(void);
|
||||
|
||||
/*
|
||||
* Get the TOD clock running.
|
||||
*/
|
||||
static void __init reset_tod_clock(void)
|
||||
{
|
||||
u64 time;
|
||||
|
||||
if (store_tod_clock(&time) == 0)
|
||||
return;
|
||||
/* TOD clock not running. Set the clock to Unix Epoch. */
|
||||
if (set_tod_clock(TOD_UNIX_EPOCH) != 0 || store_tod_clock(&time) != 0)
|
||||
disabled_wait(0);
|
||||
|
||||
memset(tod_clock_base, 0, 16);
|
||||
*(__u64 *) &tod_clock_base[1] = TOD_UNIX_EPOCH;
|
||||
S390_lowcore.last_update_clock = TOD_UNIX_EPOCH;
|
||||
}
|
||||
|
||||
/*
|
||||
* Clear bss memory
|
||||
*/
|
||||
static noinline __init void clear_bss_section(void)
|
||||
{
|
||||
memset(__bss_start, 0, __bss_stop - __bss_start);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize storage key for kernel pages
|
||||
*/
|
||||
|
@ -310,26 +284,6 @@ static int __init cad_setup(char *str)
|
|||
}
|
||||
early_param("cad", cad_setup);
|
||||
|
||||
static __init noinline void rescue_initrd(void)
|
||||
{
|
||||
unsigned long min_initrd_addr = (unsigned long) _end + (4UL << 20);
|
||||
|
||||
/*
|
||||
* Just like in case of IPL from VM reader we make sure there is a
|
||||
* gap of 4MB between end of kernel and start of initrd.
|
||||
* That way we can also be sure that saving an NSS will succeed,
|
||||
* which however only requires different segments.
|
||||
*/
|
||||
if (!IS_ENABLED(CONFIG_BLK_DEV_INITRD))
|
||||
return;
|
||||
if (!INITRD_START || !INITRD_SIZE)
|
||||
return;
|
||||
if (INITRD_START >= min_initrd_addr)
|
||||
return;
|
||||
memmove((void *) min_initrd_addr, (void *) INITRD_START, INITRD_SIZE);
|
||||
INITRD_START = min_initrd_addr;
|
||||
}
|
||||
|
||||
/* Set up boot command line */
|
||||
static void __init append_to_cmdline(size_t (*ipl_data)(char *, size_t))
|
||||
{
|
||||
|
@ -379,9 +333,6 @@ static void __init setup_boot_command_line(void)
|
|||
|
||||
void __init startup_init(void)
|
||||
{
|
||||
reset_tod_clock();
|
||||
rescue_initrd();
|
||||
clear_bss_section();
|
||||
time_early_init();
|
||||
init_kernel_storage_key();
|
||||
lockdep_off();
|
||||
|
|
|
@ -0,0 +1,65 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright IBM Corp. 2007, 2018
|
||||
*/
|
||||
|
||||
/*
|
||||
* Early setup functions which may not rely on an initialized bss
|
||||
* section. The last thing that is supposed to happen here is
|
||||
* initialization of the bss section.
|
||||
*/
|
||||
|
||||
#include <linux/processor.h>
|
||||
#include <linux/string.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/lowcore.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/timex.h>
|
||||
#include "entry.h"
|
||||
|
||||
static void __init reset_tod_clock(void)
|
||||
{
|
||||
u64 time;
|
||||
|
||||
if (store_tod_clock(&time) == 0)
|
||||
return;
|
||||
/* TOD clock not running. Set the clock to Unix Epoch. */
|
||||
if (set_tod_clock(TOD_UNIX_EPOCH) != 0 || store_tod_clock(&time) != 0)
|
||||
disabled_wait(0);
|
||||
|
||||
memset(tod_clock_base, 0, 16);
|
||||
*(__u64 *) &tod_clock_base[1] = TOD_UNIX_EPOCH;
|
||||
S390_lowcore.last_update_clock = TOD_UNIX_EPOCH;
|
||||
}
|
||||
|
||||
static void __init rescue_initrd(void)
|
||||
{
|
||||
unsigned long min_initrd_addr = (unsigned long) _end + (4UL << 20);
|
||||
|
||||
/*
|
||||
* Just like in case of IPL from VM reader we make sure there is a
|
||||
* gap of 4MB between end of kernel and start of initrd.
|
||||
* That way we can also be sure that saving an NSS will succeed,
|
||||
* which however only requires different segments.
|
||||
*/
|
||||
if (!IS_ENABLED(CONFIG_BLK_DEV_INITRD))
|
||||
return;
|
||||
if (!INITRD_START || !INITRD_SIZE)
|
||||
return;
|
||||
if (INITRD_START >= min_initrd_addr)
|
||||
return;
|
||||
memmove((void *) min_initrd_addr, (void *) INITRD_START, INITRD_SIZE);
|
||||
INITRD_START = min_initrd_addr;
|
||||
}
|
||||
|
||||
static void __init clear_bss_section(void)
|
||||
{
|
||||
memset(__bss_start, 0, __bss_stop - __bss_start);
|
||||
}
|
||||
|
||||
void __init startup_init_nobss(void)
|
||||
{
|
||||
reset_tod_clock();
|
||||
rescue_initrd();
|
||||
clear_bss_section();
|
||||
}
|
|
@ -58,6 +58,7 @@ void do_notify_resume(struct pt_regs *regs);
|
|||
void __init init_IRQ(void);
|
||||
void do_IRQ(struct pt_regs *regs, int irq);
|
||||
void do_restart(void);
|
||||
void __init startup_init_nobss(void);
|
||||
void __init startup_init(void);
|
||||
void die(struct pt_regs *regs, const char *str);
|
||||
int setup_profiling_timer(unsigned int multiplier);
|
||||
|
|
|
@ -40,8 +40,12 @@ ENTRY(startup_continue)
|
|||
stg %r15,__LC_KERNEL_STACK # set end of kernel stack
|
||||
aghi %r15,-160
|
||||
#
|
||||
# Save ipl parameters, clear bss memory, initialize storage key for kernel pages,
|
||||
# and create a kernel NSS if the SAVESYS= parm is defined
|
||||
# Early setup functions that may not rely on an initialized bss section,
|
||||
# like moving the initrd. Returns with an initialized bss section.
|
||||
#
|
||||
brasl %r14,startup_init_nobss
|
||||
#
|
||||
# Early machine initialization and detection functions.
|
||||
#
|
||||
brasl %r14,startup_init
|
||||
lpswe .Lentry-.LPG1(13) # jump to _stext in primary-space,
|
||||
|
|
Loading…
Reference in New Issue