mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
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>
This commit is contained in:
committed by
Jan Höppner
parent
2227bb8330
commit
abe0ba7412
@@ -310,8 +310,8 @@ int boot_init_fba_stage1b(struct boot_fba_stage1b *stage1b,
|
||||
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);
|
||||
|
||||
@@ -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, size_t *bytecount, address_t parm_addr,
|
||||
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;
|
||||
|
||||
@@ -646,7 +646,7 @@ add_ipl_program(int fd, struct job_ipl_data* ipl, disk_blockptr_t* program,
|
||||
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;
|
||||
|
||||
Reference in New Issue
Block a user