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) + } +}