From fe0d42e295a06614581f1a575d628a7f898622e6 Mon Sep 17 00:00:00 2001 From: Marc Hartmayer Date: Wed, 18 Jan 2023 18:53:16 +0000 Subject: [PATCH] zipl/boot: use linker scripts for all bootloaders MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use linker script for all bootloaders instead of having the load addresses of the bootloaders hard-coded in the Makefile. This allows us to simplify the Makefile and it fixes the dependency tracking for the bootloaders *0.bin, *1.bin, and *1b.bin. Reviewed-by: Stefan Haberland Signed-off-by: Marc Hartmayer Signed-off-by: Jan Höppner --- include/boot/loaders_layout.h | 3 +++ zipl/boot/Makefile | 24 ++++++++++-------------- zipl/boot/stage0.lds.S | 18 ++++++++++++++++++ zipl/boot/stage1.lds.S | 18 ++++++++++++++++++ zipl/boot/stage1b.lds.S | 18 ++++++++++++++++++ 5 files changed, 67 insertions(+), 14 deletions(-) create mode 100644 zipl/boot/stage0.lds.S create mode 100644 zipl/boot/stage1.lds.S create mode 100644 zipl/boot/stage1b.lds.S diff --git a/include/boot/loaders_layout.h b/include/boot/loaders_layout.h index 09493c49..7ab8e52a 100644 --- a/include/boot/loaders_layout.h +++ b/include/boot/loaders_layout.h @@ -14,6 +14,9 @@ #include "lib/zt_common.h" #include "linux_layout.h" +#define STAGE0_LOAD_ADDRESS _AC(0x0, UL) + +#define STAGE1_LOAD_ADDRESS _AC(0x18, UL) #define STAGE1B_LOAD_ADDRESS _AC(0xe000, UL) #define STAGE2_DESC _AC(0x78, UL) diff --git a/zipl/boot/Makefile b/zipl/boot/Makefile index 52d01fdd..2bae890c 100644 --- a/zipl/boot/Makefile +++ b/zipl/boot/Makefile @@ -41,6 +41,15 @@ endif %.lds: %.lds.S $(CPP) -Wp,-MD,.$@.d,-MT,$@ $(INCLUDE_PARMS) -P -C -o $@ $< +fba0.exec eckd0_ldl.exec eckd0_cdl.exec tape0.exec: \ + stage0.lds + +eckd1.exec: \ + stage1.lds + +eckd1b.exec fba1b.exec: \ + stage1b.lds + eckd2dump_sv.exec: \ head.o stage2dump.o cio.o eckd2dump.o eckd2dump_sv.o \ libc.o ebcdic.o sclp.o entry.o stage2.lds @@ -61,20 +70,7 @@ stage3.exec: head.o stage3.o kdump3.o libc.o ebcdic.o ebcdic_conv.o sclp.o \ sclp_stage3.o kdump.o entry.o stage3.lds %.exec: %.o - STAGE=$$( \ - echo $@ | awk ' \ - match($$0,/[0-9]+b*/){ \ - print substr($$0,RSTART,RLENGTH) \ - }' \ - ); \ - case $$STAGE in \ - 0) SFLAGS="-Wl,-Ttext,0";; \ - 1) SFLAGS="-Wl,-Ttext,0x18";; \ - 1b) SFLAGS="-Wl,-Ttext,0xE000";; \ - 2) SFLAGS="-Wl,-T,stage2.lds";; \ - 3) SFLAGS="-Wl,-T,stage3.lds";; \ - esac; \ - $(LINK) $$SFLAGS $(NO_PIE_LDFLAGS) $(NO_WARN_RWX_SEGMENTS_LDFLAGS) -Wl,--build-id=none -m64 -static -nostdlib $(filter %.o, $^) -o $@ + $(LINK) -Wl,-T,$(filter %.lds,$^) $(NO_PIE_LDFLAGS) $(NO_WARN_RWX_SEGMENTS_LDFLAGS) -Wl,--build-id=none -m64 -static -nostdlib $(filter %.o, $^) -o $@ %.bin: %.exec $(OBJCOPY) -O binary $< $@ diff --git a/zipl/boot/stage0.lds.S b/zipl/boot/stage0.lds.S new file mode 100644 index 00000000..751e252e --- /dev/null +++ b/zipl/boot/stage0.lds.S @@ -0,0 +1,18 @@ +#include "boot/loaders_layout.h" + +ENTRY(_start) + +SECTIONS +{ + . = STAGE0_LOAD_ADDRESS; + .text : { + *(.text .text.*) + } + + /* Sections to be discarded */ + /DISCARD/ : { + *(.eh_frame) + *(.interp) + *(.note.GNU-stack) + } +} diff --git a/zipl/boot/stage1.lds.S b/zipl/boot/stage1.lds.S new file mode 100644 index 00000000..d0ba5873 --- /dev/null +++ b/zipl/boot/stage1.lds.S @@ -0,0 +1,18 @@ +#include "boot/loaders_layout.h" + +ENTRY(_start) + +SECTIONS +{ + . = STAGE1_LOAD_ADDRESS; + .text : { + *(.text .text.*) + } + + /* Sections to be discarded */ + /DISCARD/ : { + *(.eh_frame) + *(.interp) + *(.note.GNU-stack) + } +} diff --git a/zipl/boot/stage1b.lds.S b/zipl/boot/stage1b.lds.S new file mode 100644 index 00000000..c319c2eb --- /dev/null +++ b/zipl/boot/stage1b.lds.S @@ -0,0 +1,18 @@ +#include "boot/loaders_layout.h" + +ENTRY(_start) + +SECTIONS +{ + . = STAGE1B_LOAD_ADDRESS; + .text : { + *(.text .text.*) + } + + /* Sections to be discarded */ + /DISCARD/ : { + *(.eh_frame) + *(.interp) + *(.note.GNU-stack) + } +}