zipl: consolidate stage3_params structs and stage3 flags

Introduce a struct definition for the stage3 parameters used by
stage3.c. This makes it easier to maintain the stage3 linker script
and it allows us to consolidate the stage3_params structs defined in
`stage3.h` and `include/boot.h` as well as the stage3 flag macros.

Reviewed-by: Philipp Rudo <prudo@linux.ibm.com>
Reviewed-by: Stefan Haberland <sth@linux.ibm.com>
Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com>
Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
This commit is contained in:
Marc Hartmayer
2020-03-27 09:13:40 +01:00
committed by Jan Höppner
parent cb11d6baec
commit 6c04f97773
7 changed files with 37 additions and 57 deletions

View File

@@ -100,9 +100,9 @@ void kdump_stage3(void)
{
unsigned long crash_base, crash_size;
if (!(stage3_flags & STAGE3_FLAG_KDUMP))
if (!(_stage3_parms.flags & STAGE3_FLAG_KDUMP))
return;
if (!(stage3_flags & STAGE3_FLAG_SCSI))
if (!(_stage3_parms.flags & STAGE3_FLAG_SCSI))
kdump_stage3_dasd(&crash_base, &crash_size);
else
kdump_stage3_scsi(&crash_base, &crash_size);

View File

@@ -147,19 +147,19 @@ void start(void)
* verified component. If it is not IPL is aborted.
*/
if (secure_boot_enabled()) {
if (_image_addr != IMAGE_LOAD_ADDRESS ||
_load_psw != DEFAULT_PSW_LOAD)
if (_stage3_parms.image_addr != IMAGE_LOAD_ADDRESS ||
_stage3_parms.load_psw != DEFAULT_PSW_LOAD)
panic(ESECUREBOOT, "%s", msg_sipl_inval);
if (!is_verified_address(_load_psw & PSW_ADDR_MASK))
if (!is_verified_address(_stage3_parms.load_psw & PSW_ADDR_MASK))
panic(ESECUREBOOT, "%s", msg_sipl_unverified);
}
/*
* cut the kernel header
*/
memmove((void *)_image_addr,
(void *)_image_addr + IMAGE_LOAD_ADDRESS,
_image_len - IMAGE_LOAD_ADDRESS);
memmove((void *)_stage3_parms.image_addr,
(void *)_stage3_parms.image_addr + IMAGE_LOAD_ADDRESS,
_stage3_parms.image_len - IMAGE_LOAD_ADDRESS);
/* store subchannel ID into low core and into new kernel space */
subchannel_id = S390_lowcore.subchannel_id;
@@ -167,15 +167,16 @@ void start(void)
*(unsigned long long *)IPL_DEVICE = subchannel_id;
/* if valid command line is given, copy it into new kernel space */
if (_parm_addr != UNSPECIFIED_ADDRESS) {
if (_stage3_parms.parm_addr != UNSPECIFIED_ADDRESS) {
memcpy((void *)COMMAND_LINE,
(void *)(unsigned long *)_parm_addr, COMMAND_LINE_SIZE);
(void *)(unsigned long *)_stage3_parms.parm_addr,
COMMAND_LINE_SIZE);
/* terminate \0 */
*(char *)(COMMAND_LINE + COMMAND_LINE_SIZE - 1) = 0;
}
/* convert extra parameter to ascii */
if (!_extra_parm || !*cextra)
if (!_stage3_parms.extra_parm || !*cextra)
goto noextra;
/* Handle extra kernel parameters specified in DASD boot menu. */
@@ -216,11 +217,11 @@ void start(void)
noextra:
/* copy initrd start address and size intop new kernle space */
*(unsigned long long *)INITRD_START = _initrd_addr;
*(unsigned long long *)INITRD_SIZE = _initrd_len;
*(unsigned long long *)INITRD_START = _stage3_parms.initrd_addr;
*(unsigned long long *)INITRD_SIZE = _stage3_parms.initrd_len;
/* store address of new kernel to 0 to be able to start it */
*(unsigned long long *)0 = _load_psw;
*(unsigned long long *)0 = _stage3_parms.load_psw;
kdump_stage3();

View File

@@ -12,6 +12,7 @@
#ifndef STAGE3_H
#define STAGE3_H
#include "lib/zt_common.h"
#include "boot/s390.h"
#include "boot/ipl.h"
#include "boot/linux_layout.h"
@@ -27,15 +28,21 @@
#define UNSPECIFIED_ADDRESS -1UL
/* Stage 3 bootloader parameter structure */
/* Structure must not have any padding */
struct stage3_parms {
unsigned long long parm_addr; /* address of parmline */
unsigned long long initrd_addr; /* address of initrd */
unsigned long long initrd_len; /* length of initrd */
unsigned long long load_psw; /* load psw of kernel */
unsigned long long extra_parm; /* use extra parm line mechanism? */
unsigned long long flags; /* flags (e.g. STAGE3_FLAG_KDUMP) */
unsigned long long image_len; /* length of kernel */
unsigned long long image_addr; /* target address of kernel */
};
STATIC_ASSERT(sizeof(struct stage3_parms) == 8 * 8)
extern unsigned long long _parm_addr; /* address of parmline */
extern unsigned long long _initrd_addr; /* address of initrd */
extern unsigned long long _initrd_len; /* length of initrd */
extern unsigned long long _load_psw; /* load psw of kernel */
extern unsigned long long _extra_parm; /* use extra parm line mechanism? */
extern unsigned long long stage3_flags; /* flags (e.g. STAGE3_FLAG_KDUMP) */
extern unsigned long long _image_len; /* length of kernel */
extern unsigned long long _image_addr; /* target address of kernel */
extern struct stage3_parms _stage3_parms;
extern void kdump_stage3();
#endif /* STAGE3_H */

View File

@@ -25,21 +25,7 @@ SECTIONS
/* stage 3 parameter */
. = 0x9000;
_parm_addr = .;
. = 0x9008;
_initrd_addr = .;
. = 0x9010;
_initrd_len = .;
. = 0x9018;
_load_psw = .;
. = 0x9020;
_extra_parm = .;
. = 0x9028;
stage3_flags =.;
. = 0x9030;
_image_len = .;
. = 0x9038;
_image_addr = .;
_stage3_parms = .;
. = 0xa000;
.text.start : { *(.text.start) }

View File

@@ -241,23 +241,6 @@ struct boot_stage2_params {
} __packed;
/* Stage 3 bootloader parameter structure */
struct boot_stage3_params {
uint64_t parm_addr;
uint64_t initrd_addr;
uint64_t initrd_len;
uint64_t load_psw;
uint64_t extra_parm;
uint16_t flags;
uint16_t reserved[3];
uint64_t image_len;
uint64_t image_addr;
} __packed;
#define STAGE3_FLAG_SCSI 0x0001
#define STAGE3_FLAG_KDUMP 0x0002
/* Tape IPL bootloader parameter structure */
#define BOOT_TAPE_IPL_PARAMS_OFFSET 0x200
@@ -312,7 +295,7 @@ 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 entry, int extra_parm, uint16_t flags,
address_t entry, int extra_parm, uint64_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);

View File

@@ -17,6 +17,8 @@
#include <fcntl.h>
#include <sys/stat.h>
#include "stage3.h"
#include "../boot/data.h"
#include "boot.h"
#include "bootmap.h"
@@ -79,10 +81,10 @@ 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 entry, int extra_parm, uint16_t flags,
address_t entry, int extra_parm, uint64_t flags,
address_t image_addr, size_t image_len)
{
struct boot_stage3_params params;
struct stage3_parms params;
void* data;
if (entry != (entry & PSW_ADDRESS_MASK)) {

View File

@@ -21,6 +21,7 @@
#include "lib/zt_common.h"
#include "lib/util_part.h"
#include "lib/util_path.h"
#include "stage3.h"
#include "boot.h"
#include "bootmap.h"