File s390-tools-sles15sp2-04-zipl-Fix-entry-point-for-stand-alone-kdump.patch of Package s390-tools.16701

Subject: [PATCH] [FEAT VS1804] zipl: Fix entry point for stand-alone kdump
From: Marc Hartmayer <mhartmay@linux.ibm.com>

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: abe0ba7412f4398973235497754b05a199aec818
Problem-ID:  VS1804

Upstream-Description:

             zipl: Fix entry point for stand-alone kdump

             Currently zipl doesn't differentiate between the load address and the
             entry point of an image, causing stage3 to strip away the entry point at
             0x10000 for stand-alone kdump. This breaks the kdump kernel as it jumps
             to 0x10000 after the special handling needed for kdump has been
             performed.

             Fix this by differentiating between the load address and the entry point
             of an image.

             Fixes: d142fbd5 ("zipl: Do not strip kernel image IPL header")
             Signed-off-by: Philipp Rudo <prudo@linux.ibm.com>
             Reviewed-by: Stefan Haberland <sth@linux.ibm.com>
             Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>


Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com>
---
 zipl/include/boot.h |    4 ++--
 zipl/src/boot.c     |   10 +++++-----
 zipl/src/bootmap.c  |    2 +-
 3 files changed, 8 insertions(+), 8 deletions(-)

--- a/zipl/include/boot.h
+++ b/zipl/include/boot.h
@@ -310,8 +310,8 @@ int boot_init_fba_stage1b(struct boot_fb
 int boot_get_eckd_stage2(void** data, size_t* size, struct job_data* job);
 int boot_get_stage3_parms(void **buffer, size_t *bytecount, address_t parm_addr,
 			  address_t initrd_addr, size_t initrd_len,
-			  address_t load_addr, int extra_parm, uint16_t flags,
-			  size_t image_len);
+			  address_t entry, int extra_parm, uint16_t flags,
+			  address_t image_addr, size_t image_len);
 int boot_get_tape_ipl(void** data, size_t* size, address_t parm_addr,
 		      address_t initrd_addr, address_t image_addr);
 int boot_get_tape_dump(void** data, size_t* size, uint64_t mem);
--- a/zipl/src/boot.c
+++ b/zipl/src/boot.c
@@ -79,14 +79,14 @@ boot_check_data(void)
 int
 boot_get_stage3_parms(void **buffer, size_t *bytecount, address_t parm_addr,
 		      address_t initrd_addr, size_t initrd_len,
-		      address_t image_addr, int extra_parm, uint16_t flags,
-		      size_t image_len)
+		      address_t entry, int extra_parm, uint16_t flags,
+		      address_t image_addr, size_t image_len)
 {
 	struct boot_stage3_params params;
 	void* data;
 
-	if (image_addr != (image_addr & PSW_ADDRESS_MASK)) {
-		error_reason("Kernel image load address to high (31 bit "
+	if (entry != (entry & PSW_ADDRESS_MASK)) {
+		error_reason("Kernel image entry point to high (31 bit "
 			     "addressing mode)");
 		return -1;
 	}
@@ -99,7 +99,7 @@ boot_get_stage3_parms(void **buffer, siz
 	params.parm_addr = (uint64_t) parm_addr;
 	params.initrd_addr = (uint64_t) initrd_addr;
 	params.initrd_len = (uint64_t) initrd_len;
-	params.load_psw = (uint64_t)(image_addr | PSW_LOAD);
+	params.load_psw = (uint64_t)(entry | PSW_LOAD);
 	params.extra_parm = (uint64_t) extra_parm;
 	params.flags = flags;
 	params.image_len = (uint64_t) image_len;
--- a/zipl/src/bootmap.c
+++ b/zipl/src/bootmap.c
@@ -646,7 +646,7 @@ add_ipl_program(int fd, struct job_ipl_d
 				   ipl->is_kdump ? ipl->image_addr + 0x10 :
 				   ipl->image_addr,
 				   (info->type == disk_type_scsi) ? 0 : 1,
-				   flags, image_size);
+				   flags, ipl->image_addr, image_size);
 	if (rc) {
 		free(table);
 		return rc;
openSUSE Build Service is sponsored by