mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
. Modify disk_get_info() to process multiple sets of target parameters
provided by the helper script and store it in the array of "targets"
of the structure job_target_data;
. Besides the logical device, maintain an array of physical base disks
in the disk_info structure;
. Use the logical target device only to create bootmap (it is
automatically mirrored by the respective linux driver (dm, or md)
managing the mirrored target). In contrast, install bootstrap blocks
to each physical base disk individually, bypassing that driver;
. Report in verbose mode on which base disks the bootstrap
installation was performed;
. Use the following logic of setting @info->device (which is printed
as "Device...:" in verbose mode):
. source_auto - the target base disk is set;
. source_script - the target (logical) device is set;
. source_user - the device specified by user (via --targetbase
option), or config file is set.
Signed-off-by: Eduard Shishkin <edward6@linux.ibm.com>
Reviewed-by: Stefan Haberland <sth@linux.ibm.com>
Signed-off-by: Steffen Eiden <seiden@linux.ibm.com>
137 lines
3.7 KiB
C
137 lines
3.7 KiB
C
/*
|
|
* s390-tools/zipl/include/install.h
|
|
* Functions handling the installation of the boot loader code onto disk.
|
|
*
|
|
* Copyright IBM Corp. 2001, 2017
|
|
*
|
|
* s390-tools is free software; you can redistribute it and/or modify
|
|
* it under the terms of the MIT license. See LICENSE for details.
|
|
*
|
|
*/
|
|
|
|
#ifndef INSTALL_H
|
|
#define INSTALL_H
|
|
|
|
#include "disk.h"
|
|
#include "job.h"
|
|
#include "zipl.h"
|
|
#include "boot/boot_defs.h"
|
|
|
|
#define NR_PROGRAM_TABLES NR_BLKPTR_FORMATS
|
|
|
|
enum program_component_id {
|
|
COMPONENT_ID_HEAP_AREA,
|
|
COMPONENT_ID_STACK_AREA,
|
|
COMPONENT_ID_LOADER_SIGNATURE,
|
|
COMPONENT_ID_LOADER,
|
|
COMPONENT_ID_PARAMETERS,
|
|
COMPONENT_ID_IMAGE_SIGNATURE,
|
|
COMPONENT_ID_KERNEL_IMAGE,
|
|
COMPONENT_ID_PARMLINE,
|
|
COMPONENT_ID_RAMDISK_SIGNATURE,
|
|
COMPONENT_ID_RAMDISK,
|
|
COMPONENT_ID_ENVBLK,
|
|
COMPONENT_ID_SEGMENT_FILE,
|
|
NR_PROGRAM_COMPONENTS
|
|
};
|
|
|
|
/* Types of SCSI disk layouts */
|
|
enum scsi_layout {
|
|
scsi_layout_pcbios,
|
|
scsi_layout_sun,
|
|
scsi_layout_sgi,
|
|
scsi_layout_unknown
|
|
};
|
|
|
|
struct component_loc {
|
|
address_t addr;
|
|
size_t size;
|
|
};
|
|
|
|
struct component_footer {
|
|
component_type type;
|
|
const char *desc;
|
|
};
|
|
|
|
struct program_component {
|
|
struct component_loc loc;
|
|
disk_blockptr_t *list;
|
|
blocknum_t count;
|
|
};
|
|
|
|
struct program_table {
|
|
disk_blockptr_t table;
|
|
disk_blockptr_t *stage1b_list;
|
|
blocknum_t stage1b_count;
|
|
};
|
|
|
|
/* Bootloader Installation Set */
|
|
struct install_set {
|
|
struct program_table tables[NR_PROGRAM_TABLES];
|
|
struct program_component *components[NR_PROGRAM_COMPONENTS];
|
|
int nr_menu_entries;
|
|
int fd;
|
|
char *basetmp[MAX_TARGETS];
|
|
char *filename;
|
|
unsigned int tmp_filename_created:1;
|
|
unsigned int skip_prepare:1;
|
|
unsigned int print_details:1;
|
|
struct disk_info *info;
|
|
disk_blockptr_t scsi_dump_sb_blockptr;
|
|
};
|
|
|
|
extern struct component_footer component_footers[NR_PROGRAM_COMPONENTS];
|
|
|
|
/* Determine SCSI disk layout from the specified BOOTBLOCK. */
|
|
static inline enum scsi_layout get_scsi_layout(unsigned char *bootblock)
|
|
{
|
|
if ((bootblock[510] == 0x55) && (bootblock[511] == 0xaa))
|
|
return scsi_layout_pcbios;
|
|
else if ((bootblock[508] == 0xda) && (bootblock[509] == 0xbe))
|
|
return scsi_layout_sun;
|
|
else if ((bootblock[0] == 0x0b) && (bootblock[1] == 0xe5) &&
|
|
(bootblock[2] == 0xa9) && (bootblock[3] == 0x41))
|
|
return scsi_layout_sgi;
|
|
return scsi_layout_unknown;
|
|
}
|
|
|
|
static inline component_type component_type_by_id(enum program_component_id id)
|
|
{
|
|
return component_footers[id].type;
|
|
}
|
|
|
|
static inline const char *component_desc_by_id(enum program_component_id id)
|
|
{
|
|
return component_footers[id].desc;
|
|
}
|
|
|
|
static inline struct program_component *get_component(struct install_set *bis,
|
|
int i, int j)
|
|
{
|
|
return bis->components[i] + j;
|
|
}
|
|
|
|
int prepare_bootloader(struct job_data *job, struct install_set *bis);
|
|
int install_bootloader(struct job_data *job, struct install_set *bis);
|
|
int post_install_bootloader(struct job_data *job, struct install_set *bis);
|
|
void free_bootloader(struct install_set *bis);
|
|
int install_tapeloader(const char* device, const char* image,
|
|
const char* parmline, const char* ramdisk,
|
|
address_t image_addr, address_t parm_addr,
|
|
address_t initrd_addr);
|
|
int install_dump(const char *device, struct job_target_data *target,
|
|
uint64_t mem, bool no_compress);
|
|
int install_mvdump(char* const device[], struct job_target_data* target,
|
|
int device_count, uint64_t mem, uint8_t force);
|
|
|
|
int install_fba_stage1b(int fd, disk_blockptr_t **stage1b_list,
|
|
blocknum_t *stage1b_count, disk_blockptr_t *stage2_list,
|
|
blocknum_t stage2_count, struct disk_info *info);
|
|
int install_eckd_stage1b(int fd, disk_blockptr_t **stage1b_list,
|
|
blocknum_t *stage1b_count,
|
|
disk_blockptr_t *stage2_list,
|
|
blocknum_t stage2_count, struct disk_info *info);
|
|
int rewind_tape(int fd);
|
|
|
|
#endif /* INSTALL_H */
|