1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright IBM Corp. 2007, 2018
7 * Early setup functions which may not rely on an initialized bss
8 * section. The last thing that is supposed to happen here is
9 * initialization of the bss section.
12 #include <linux/processor.h>
13 #include <linux/string.h>
14 #include <asm/sections.h>
15 #include <asm/lowcore.h>
16 #include <asm/setup.h>
17 #include <asm/timex.h>
20 static void __init
reset_tod_clock(void)
24 if (store_tod_clock(&time
) == 0)
26 /* TOD clock not running. Set the clock to Unix Epoch. */
27 if (set_tod_clock(TOD_UNIX_EPOCH
) != 0 || store_tod_clock(&time
) != 0)
30 memset(tod_clock_base
, 0, 16);
31 *(__u64
*) &tod_clock_base
[1] = TOD_UNIX_EPOCH
;
32 S390_lowcore
.last_update_clock
= TOD_UNIX_EPOCH
;
35 static void __init
rescue_initrd(void)
37 unsigned long min_initrd_addr
= (unsigned long) _end
+ (4UL << 20);
40 * Just like in case of IPL from VM reader we make sure there is a
41 * gap of 4MB between end of kernel and start of initrd.
42 * That way we can also be sure that saving an NSS will succeed,
43 * which however only requires different segments.
45 if (!IS_ENABLED(CONFIG_BLK_DEV_INITRD
))
47 if (!INITRD_START
|| !INITRD_SIZE
)
49 if (INITRD_START
>= min_initrd_addr
)
51 memmove((void *) min_initrd_addr
, (void *) INITRD_START
, INITRD_SIZE
);
52 INITRD_START
= min_initrd_addr
;
55 static void __init
clear_bss_section(void)
57 memset(__bss_start
, 0, __bss_stop
- __bss_start
);
60 void __init
startup_init_nobss(void)