Commit 980d5f9a authored by Alexander Egorenkov's avatar Alexander Egorenkov Committed by Vasily Gorbik

s390/boot: enable .bss section for compressed kernel

- Support static uninitialized variables in compressed kernel.
- Remove chkbss script
- Get rid of workarounds for not having .bss section
Signed-off-by: default avatarAlexander Egorenkov <egorenar@linux.ibm.com>
Reviewed-by: default avatarVasily Gorbik <gor@linux.ibm.com>
Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
parent 1a80b54d
...@@ -73,7 +73,3 @@ $(obj)/startup.a: $(OBJECTS) FORCE ...@@ -73,7 +73,3 @@ $(obj)/startup.a: $(OBJECTS) FORCE
install: install:
sh -x $(srctree)/$(obj)/install.sh $(KERNELRELEASE) $(obj)/bzImage \ sh -x $(srctree)/$(obj)/install.sh $(KERNELRELEASE) $(obj)/bzImage \
System.map "$(INSTALL_PATH)" System.map "$(INSTALL_PATH)"
chkbss := $(obj-y)
chkbss-target := startup.a
include $(srctree)/arch/s390/scripts/Makefile.chkbss
...@@ -62,7 +62,3 @@ $(obj)/vmlinux.bin.xz: $(vmlinux.bin.all-y) FORCE ...@@ -62,7 +62,3 @@ $(obj)/vmlinux.bin.xz: $(vmlinux.bin.all-y) FORCE
OBJCOPYFLAGS_piggy.o := -I binary -O elf64-s390 -B s390:64-bit --rename-section .data=.vmlinux.bin.compressed OBJCOPYFLAGS_piggy.o := -I binary -O elf64-s390 -B s390:64-bit --rename-section .data=.vmlinux.bin.compressed
$(obj)/piggy.o: $(obj)/vmlinux.bin$(suffix-y) FORCE $(obj)/piggy.o: $(obj)/vmlinux.bin$(suffix-y) FORCE
$(call if_changed,objcopy) $(call if_changed,objcopy)
chkbss := $(filter-out piggy.o info.o, $(obj-y))
chkbss-target := vmlinux.bin
include $(srctree)/arch/s390/scripts/Makefile.chkbss
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
* gzip declarations * gzip declarations
*/ */
#define STATIC static #define STATIC static
#define STATIC_RW_DATA static __section(.data)
#undef memset #undef memset
#undef memcpy #undef memcpy
......
...@@ -58,6 +58,19 @@ SECTIONS ...@@ -58,6 +58,19 @@ SECTIONS
BOOT_DATA BOOT_DATA
BOOT_DATA_PRESERVED BOOT_DATA_PRESERVED
/*
* This is the BSS section of the decompressor and not of the decompressed Linux kernel.
* It will consume place in the decompressor's image.
*/
. = ALIGN(8);
.bss : {
_bss = . ;
*(.bss)
*(.bss.*)
*(COMMON)
_ebss = .;
}
/* /*
* uncompressed image info used by the decompressor it should match * uncompressed image info used by the decompressor it should match
* struct vmlinux_info. It comes from .vmlinux.info section of * struct vmlinux_info. It comes from .vmlinux.info section of
...@@ -81,15 +94,6 @@ SECTIONS ...@@ -81,15 +94,6 @@ SECTIONS
FILL(0xff); FILL(0xff);
. = ALIGN(4096); . = ALIGN(4096);
} }
. = ALIGN(256);
.bss : {
_bss = . ;
*(.bss)
*(.bss.*)
*(COMMON)
. = ALIGN(8); /* For convenience during zeroing */
_ebss = .;
}
_end = .; _end = .;
/* Sections to be discarded */ /* Sections to be discarded */
......
...@@ -313,6 +313,12 @@ ENTRY(startup_kdump) ...@@ -313,6 +313,12 @@ ENTRY(startup_kdump)
spt 6f-.LPG0(%r13) spt 6f-.LPG0(%r13)
mvc __LC_LAST_UPDATE_TIMER(8),6f-.LPG0(%r13) mvc __LC_LAST_UPDATE_TIMER(8),6f-.LPG0(%r13)
l %r15,.Lstack-.LPG0(%r13) l %r15,.Lstack-.LPG0(%r13)
// Clear decompressor's BSS section
larl %r2,_bss
slgr %r3,%r3
larl %r4,_ebss
slgr %r4,%r2
brasl %r14,memset
brasl %r14,verify_facilities brasl %r14,verify_facilities
brasl %r14,startup_kernel brasl %r14,startup_kernel
......
...@@ -21,7 +21,7 @@ unsigned long __bootdata(memory_end); ...@@ -21,7 +21,7 @@ unsigned long __bootdata(memory_end);
int __bootdata(memory_end_set); int __bootdata(memory_end_set);
int __bootdata(noexec_disabled); int __bootdata(noexec_disabled);
int kaslr_enabled __section(.data); int kaslr_enabled;
static inline int __diag308(unsigned long subcode, void *addr) static inline int __diag308(unsigned long subcode, void *addr)
{ {
...@@ -209,7 +209,7 @@ static void modify_fac_list(char *str) ...@@ -209,7 +209,7 @@ static void modify_fac_list(char *str)
check_cleared_facilities(); check_cleared_facilities();
} }
static char command_line_buf[COMMAND_LINE_SIZE] __section(.data); static char command_line_buf[COMMAND_LINE_SIZE];
void parse_boot_command_line(void) void parse_boot_command_line(void)
{ {
char *param, *val; char *param, *val;
......
...@@ -120,6 +120,9 @@ static void handle_relocs(unsigned long offset) ...@@ -120,6 +120,9 @@ static void handle_relocs(unsigned long offset)
} }
} }
/*
* This function clears the BSS section of the decompressed Linux kernel and NOT the decompressor's.
*/
static void clear_bss_section(void) static void clear_bss_section(void)
{ {
memset((void *)vmlinux.default_lma + vmlinux.image_size, 0, vmlinux.bss_size); memset((void *)vmlinux.default_lma + vmlinux.image_size, 0, vmlinux.bss_size);
......
...@@ -307,7 +307,7 @@ void machine_power_off(void) ...@@ -307,7 +307,7 @@ void machine_power_off(void)
void (*pm_power_off)(void) = machine_power_off; void (*pm_power_off)(void) = machine_power_off;
EXPORT_SYMBOL_GPL(pm_power_off); EXPORT_SYMBOL_GPL(pm_power_off);
void *restart_stack __section(.data); void *restart_stack;
unsigned long stack_alloc(void) unsigned long stack_alloc(void)
{ {
......
# SPDX-License-Identifier: GPL-2.0
chkbss-target ?= built-in.a
$(obj)/$(chkbss-target): chkbss
chkbss-files := $(addsuffix .chkbss, $(chkbss))
clean-files += $(chkbss-files)
PHONY += chkbss
chkbss: $(addprefix $(obj)/, $(chkbss-files))
quiet_cmd_chkbss = CHKBSS $<
cmd_chkbss = \
if ! $(OBJSIZE) --common $< | $(AWK) 'END { if ($$3) exit 1 }'; then \
echo "error: $< .bss section is not empty" >&2; exit 1; \
fi; \
touch $@;
$(obj)/%.o.chkbss: $(obj)/%.o
$(call cmd,chkbss)
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