Subject: [PATCH] [FEAT VS1804] genprotimg: add relocator for stage3b From: Marc Hartmayer Summary: genprotimg: Introduce new tool for the creation of PV images Description: genprotimg takes a kernel, host-key documents, optionally an initrd, optionally a file with the kernel command line, and it generates a single, loadable image file. The image consists of a concatenation of a plain text boot loader, the encrypted components for kernel, initrd, and cmdline, and the integrity-protected PV header, containing metadata necessary for running the guest in PV mode. It's possible to use this image file as a kernel for zIPL or for a direct kernel boot using QEMU. Upstream-ID: d2f8f972cff7aacbef8e72577af70dbf59ba3ead Problem-ID: VS1804 Upstream-Description: genprotimg: add relocator for stage3b Add support for the placement of the stage3b loader at other addresses than 0xa000. For this add a position independent relocator that first copies the original stage3b code to the memory location 0xa000 and then starts it. Reviewed-by: Philipp Rudo Signed-off-by: Marc Hartmayer Signed-off-by: Jan Höppner Signed-off-by: Marc Hartmayer --- genprotimg/boot/Makefile | 5 +++ genprotimg/boot/stage3b_reloc.S | 53 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) --- a/genprotimg/boot/Makefile +++ b/genprotimg/boot/Makefile @@ -17,7 +17,7 @@ ALL_CFLAGS := $(NO_PIE_CFLAGS) -Os -g \ -mstack-size=4096 -mstack-guard=128 -msoft-float \ -Wall -Wformat-security -Wextra -Werror -FILES := stage3a.bin stage3b.bin +FILES := stage3a.bin stage3b.bin stage3b_reloc.bin ZIPL_SRCS_C := libc.c ebcdic.c ebcdic_conv.c sclp.c ZIPL_SRCS_ASM := entry.S @@ -66,14 +66,17 @@ ifneq ($(MAKECMDGOALS),clean) -include $(dependencies_zipl_c) endif +stage3b_reloc.o: stage3b.bin stage3a.elf: head.o stage3a_init.o stage3a.o stage3a.lds $(ZIPL_OBJS) stage3b.elf: head.o stage3b.o stage3b.lds $(ZIPL_OBJS) +stage3b_reloc.elf: %.elf: %.o case $* in \ stage3a) SFLAGS="$(NO_PIE_LINKFLAGS) -nostdlib -Wl,-T,stage3a.lds";; \ stage3b) SFLAGS="$(NO_PIE_LINKFLAGS) -nostdlib -Wl,-T,stage3b.lds";; \ + stage3b_reloc) SFLAGS="$(NO_PIE_LINKFLAGS) -nostdlib -Wl,-estage3b_reloc_start,-Ttext,0";; \ esac; \ $(LINK) $$SFLAGS -m64 $(filter %.o, $^) -o $@ @chmod a-x $@ --- /dev/null +++ b/genprotimg/boot/stage3b_reloc.S @@ -0,0 +1,53 @@ +/* + * Relocator code for stage 3b boot loader + * + * Copyright IBM Corp. 2020 + * + * s390-tools is free software; you can redistribute it and/or modify + * it under the terms of the MIT license. See LICENSE for details. + */ + +#include "stage3b.h" +#include "boot/sigp.h" + +.macro MEMCPY dst,src,len + lgr %r0, \dst + lgr %r1, \len + lgr %r2, \src + lgr %r3, \len + +20: mvcle %r0, %r2, 0 + jo 20b +.endm + +.org 0x0 +.section .text.start +.globl stage3b_reloc_start +stage3b_reloc_start: + /* Might be called after a diag308 so better set + * architecture and addressing mode + */ + lhi %r1, 1 + sigp %r1, %r0, SIGP_SET_ARCHITECTURE + sam64 + +.copy_stage3b: + /* Location of stage3b in memory */ + larl %r8, stage3b_start + + /* Destination for stage3b */ + lgfi %r9, STAGE3B_LOAD_ADDRESS + + /* Size of stage3b */ + lghi %r11, stage3b_end - stage3b_start + + /* Copy the stage3b loader to address STAGE3B_LOAD_ADDRESS */ + MEMCPY %r9, %r8, %r11 + + /* Branch to STAGE3B_ENTRY */ + lgfi %r9, STAGE3B_ENTRY + br %r9 +stage3b_start: + .incbin "stage3b.bin" +stage3b_end: +.previous