mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
Introduce a write simulation operation, which doesn't write actual data and just updates the current position in the file. This allows to emulate block lists for files located on raw devices (not formatted with a file system). This is used by the next patches in the series to implement '--dry-run' zipl option for dumps of all types (not only ngdumps). Introduce a 'misc file descriptor', which allows to mark individual files as "opened in a simulation mode". Whenever bulding a bootmap file, use either real write, or write simulation depending on the mode set in the 'misc file descriptor'. Tested-by: Mikhail Zaslonko <zaslonko@linux.ibm.com> Reviewed-by: Mikhail Zaslonko <zaslonko@linux.ibm.com> Signed-off-by: Eduard Shishkin <edward6@linux.ibm.com> Signed-off-by: Jan Höppner <hoeppner@linux.ibm.com>
138 lines
3.7 KiB
C
138 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 "misc.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;
|
|
struct misc_fd mfd;
|
|
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(struct misc_fd *mfd, 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(struct misc_fd *mfd, 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 */
|