mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
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:
committed by
Jan Höppner
parent
cb11d6baec
commit
6c04f97773
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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) }
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user