File s390-tools-sles15sp2-04-zipl-Fix-entry-point-for-stand-alone-kdump.patch of Package s390-tools.18705
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;