From 7104bae9de560e7f9f00b2bef4b8c791cdd59c7f Mon Sep 17 00:00:00 2001 From: Farhan Ali Date: Tue, 29 Mar 2016 16:18:47 +0200 Subject: [PATCH 01/12] hw/s390x: provide loadparm property for the machine In order to specify the LOADPARM value one may now add ",loadparm=xxx" parameter to the "-machine s390-ccw-virtio" option. The property setter will normalize and check the value provided much like the way the HMC does. The value is stored, but not used at the moment. Initial patch from Eugene (jno) Dvurechenski. Signed-off-by: Eugene (jno) Dvurechenski Signed-off-by: Farhan Ali Reviewed-by: Christian Borntraeger Signed-off-by: Cornelia Huck --- hw/s390x/s390-virtio-ccw.c | 37 ++++++++++++++++++++++++++++++ include/hw/s390x/s390-virtio-ccw.h | 1 + 2 files changed, 38 insertions(+) diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c index 04bd0ebe40..fdd4384ff0 100644 --- a/hw/s390x/s390-virtio-ccw.c +++ b/hw/s390x/s390-virtio-ccw.c @@ -274,6 +274,36 @@ bool cpu_model_allowed(void) return true; } +static char *machine_get_loadparm(Object *obj, Error **errp) +{ + S390CcwMachineState *ms = S390_CCW_MACHINE(obj); + + return g_memdup(ms->loadparm, sizeof(ms->loadparm)); +} + +static void machine_set_loadparm(Object *obj, const char *val, Error **errp) +{ + S390CcwMachineState *ms = S390_CCW_MACHINE(obj); + int i; + + for (i = 0; i < sizeof(ms->loadparm) && val[i]; i++) { + uint8_t c = toupper(val[i]); /* mimic HMC */ + + if (('A' <= c && c <= 'Z') || ('0' <= c && c <= '9') || (c == '.') || + (c == ' ')) { + ms->loadparm[i] = c; + } else { + error_setg(errp, "LOADPARM: invalid character '%c' (ASCII 0x%02x)", + c, c); + return; + } + } + + for (; i < sizeof(ms->loadparm); i++) { + ms->loadparm[i] = ' '; /* pad right with spaces */ + } +} + static inline void s390_machine_initfn(Object *obj) { object_property_add_bool(obj, "aes-key-wrap", @@ -291,6 +321,13 @@ static inline void s390_machine_initfn(Object *obj) "enable/disable DEA key wrapping using the CPACF wrapping key", NULL); object_property_set_bool(obj, true, "dea-key-wrap", NULL); + object_property_add_str(obj, "loadparm", + machine_get_loadparm, machine_set_loadparm, NULL); + object_property_set_description(obj, "loadparm", + "Up to 8 chars in set of [A-Za-z0-9. ] (lower case chars converted" + " to upper case) to pass to machine loader, boot manager," + " and guest kernel", + NULL); } static const TypeInfo ccw_machine_info = { diff --git a/include/hw/s390x/s390-virtio-ccw.h b/include/hw/s390x/s390-virtio-ccw.h index 6ecae00386..7b8a3e4d74 100644 --- a/include/hw/s390x/s390-virtio-ccw.h +++ b/include/hw/s390x/s390-virtio-ccw.h @@ -28,6 +28,7 @@ typedef struct S390CcwMachineState { /*< public >*/ bool aes_key_wrap; bool dea_key_wrap; + uint8_t loadparm[8]; } S390CcwMachineState; typedef struct S390CcwMachineClass { From bd1badf45788930473d271f44f1268a63f2ddbdd Mon Sep 17 00:00:00 2001 From: Farhan Ali Date: Tue, 29 Mar 2016 16:28:40 +0200 Subject: [PATCH 02/12] hw/s390x/ipl: enable LOADPARM in IPIB for a boot device Insert the LOADPARM value to the IPL Information Parameter Block. An IPL Information Parameter Block is created when "bootindex" is specified for a device. If a user specifies "loadparm=", then we store the loadparm value in the created IPIB for that boot device. Initial patch from Eugene (jno) Dvurechenski. Signed-off-by: Eugene (jno) Dvurechenski Signed-off-by: Farhan Ali Reviewed-by: Christian Borntraeger Signed-off-by: Cornelia Huck --- hw/s390x/ipl.c | 31 +++++++++++++++++++++++++++++-- hw/s390x/ipl.h | 3 +++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index 7978c7d52a..0711ee927a 100644 --- a/hw/s390x/ipl.c +++ b/hw/s390x/ipl.c @@ -17,8 +17,10 @@ #include "cpu.h" #include "elf.h" #include "hw/loader.h" +#include "hw/boards.h" #include "hw/s390x/virtio-ccw.h" #include "hw/s390x/css.h" +#include "hw/s390x/ebcdic.h" #include "ipl.h" #include "qemu/error-report.h" @@ -243,7 +245,6 @@ static bool s390_gen_initial_iplb(S390IPLState *ipl) ipl->iplb.pbt = S390_IPL_TYPE_CCW; ipl->iplb.ccw.devno = cpu_to_be16(ccw_dev->sch->devno); ipl->iplb.ccw.ssid = ccw_dev->sch->ssid & 3; - return true; } else if (sd) { SCSIBus *bus = scsi_bus_from_device(sd); VirtIOSCSI *vdev = container_of(bus, VirtIOSCSI, bus); @@ -259,13 +260,39 @@ static bool s390_gen_initial_iplb(S390IPLState *ipl) ipl->iplb.scsi.channel = cpu_to_be16(sd->channel); ipl->iplb.scsi.devno = cpu_to_be16(ccw_dev->sch->devno); ipl->iplb.scsi.ssid = ccw_dev->sch->ssid & 3; - return true; + } else { + return false; /* unknown device */ } + + if (!s390_ipl_set_loadparm(ipl->iplb.loadparm)) { + ipl->iplb.flags |= DIAG308_FLAGS_LP_VALID; + } + return true; } return false; } +int s390_ipl_set_loadparm(uint8_t *loadparm) +{ + MachineState *machine = MACHINE(qdev_get_machine()); + char *lp = object_property_get_str(OBJECT(machine), "loadparm", NULL); + + if (lp) { + int i; + + /* lp is an uppercase string without leading/embedded spaces */ + for (i = 0; i < 8 && lp[i]; i++) { + loadparm[i] = ascii2ebcdic[(uint8_t) lp[i]]; + } + + g_free(lp); + return 0; + } + + return -1; +} + static int load_netboot_image(Error **errp) { S390IPLState *ipl = get_ipl_device(); diff --git a/hw/s390x/ipl.h b/hw/s390x/ipl.h index 46930e4c64..8a705e0428 100644 --- a/hw/s390x/ipl.h +++ b/hw/s390x/ipl.h @@ -57,6 +57,8 @@ struct IplBlockQemuScsi { } QEMU_PACKED; typedef struct IplBlockQemuScsi IplBlockQemuScsi; +#define DIAG308_FLAGS_LP_VALID 0x80 + union IplParameterBlock { struct { uint32_t len; @@ -82,6 +84,7 @@ union IplParameterBlock { } QEMU_PACKED; typedef union IplParameterBlock IplParameterBlock; +int s390_ipl_set_loadparm(uint8_t *loadparm); void s390_ipl_update_diag308(IplParameterBlock *iplb); void s390_ipl_prepare_cpu(S390CPU *cpu); IplParameterBlock *s390_ipl_get_iplb(void); From b038411d85b19e058d3909d97738a85c3f402db3 Mon Sep 17 00:00:00 2001 From: Farhan Ali Date: Tue, 29 Mar 2016 16:34:37 +0200 Subject: [PATCH 03/12] hw/s390x/sclp: update LOADPARM in SCP Info LOADPARM has two copies: 1. in SCP Information Block 2. in IPL Information Parameter Block So, update SCLP intrinsics now. We always store LOADPARM in SCP information block even if we don't have a valid IPL Information Parameter Block. Initial patch from Eugene (jno) Dvurechenski. Signed-off-by: Eugene (jno) Dvurechenski Signed-off-by: Farhan Ali Reviewed-by: Christian Borntraeger Signed-off-by: Cornelia Huck --- hw/s390x/sclp.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c index e741da1141..b4f6dd58dd 100644 --- a/hw/s390x/sclp.c +++ b/hw/s390x/sclp.c @@ -23,6 +23,7 @@ #include "hw/s390x/sclp.h" #include "hw/s390x/event-facility.h" #include "hw/s390x/s390-pci-bus.h" +#include "hw/s390x/ipl.h" static inline SCLPDevice *get_sclp_device(void) { @@ -57,6 +58,7 @@ static void read_SCP_info(SCLPDevice *sclp, SCCB *sccb) int cpu_count = 0; int rnsize, rnmax; int slots = MIN(machine->ram_slots, s390_get_memslot_count(kvm_state)); + IplParameterBlock *ipib = s390_ipl_get_iplb(); CPU_FOREACH(cpu) { cpu_count++; @@ -129,6 +131,13 @@ static void read_SCP_info(SCLPDevice *sclp, SCCB *sccb) read_info->rnmax2 = cpu_to_be64(rnmax); } + if (ipib && ipib->flags & DIAG308_FLAGS_LP_VALID) { + memcpy(&read_info->loadparm, &ipib->loadparm, + sizeof(read_info->loadparm)); + } else { + s390_ipl_set_loadparm(read_info->loadparm); + } + sccb->h.response_code = cpu_to_be16(SCLP_RC_NORMAL_READ_COMPLETION); } From 5559716c98ff1afd61b0f6707e261bf9579a37e7 Mon Sep 17 00:00:00 2001 From: Farhan Ali Date: Thu, 15 Dec 2016 13:44:29 -0500 Subject: [PATCH 04/12] util/qemu-config: Add loadparm to qemu machine_opts Add S390CcwMachineState machine parameter "loadparm" to qemu machine_opts so libvirt can query for it. Signed-off-by: Farhan Ali Signed-off-by: Cornelia Huck --- util/qemu-config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/util/qemu-config.c b/util/qemu-config.c index 5527100a01..405dd1a1d7 100644 --- a/util/qemu-config.c +++ b/util/qemu-config.c @@ -227,6 +227,12 @@ static QemuOptsList machine_opts = { .name = "dea-key-wrap", .type = QEMU_OPT_BOOL, .help = "enable/disable DEA key wrapping using the CPACF wrapping key", + },{ + .name = "loadparm", + .type = QEMU_OPT_STRING, + .help = "Up to 8 chars in set of [A-Za-z0-9. ](lower case chars" + " converted to upper case) to pass to machine" + " loader, boot manager, and guest kernel", }, { /* End of list */ } } From cfe2124a7f7285bfe5bf91e068f88437d1f8a591 Mon Sep 17 00:00:00 2001 From: "Eugene (jno) Dvurechenski" Date: Mon, 18 Apr 2016 13:45:10 +0200 Subject: [PATCH 05/12] pc-bios/s390-ccw: Make ebcdic/ascii conversion public Make the ebcdic_to_ascii function public to the rest of the "bios" code, as the volume label is no more the single thing to be converted. Signed-off-by: Eugene (jno) Dvurechenski Signed-off-by: Farhan Ali Reviewed-by: Christian Borntraeger Signed-off-by: Cornelia Huck --- pc-bios/s390-ccw/bootmap.h | 22 ---------------------- pc-bios/s390-ccw/main.c | 11 +++++++++++ pc-bios/s390-ccw/s390-ccw.h | 13 +++++++++++++ 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/pc-bios/s390-ccw/bootmap.h b/pc-bios/s390-ccw/bootmap.h index bea168714b..9073de2238 100644 --- a/pc-bios/s390-ccw/bootmap.h +++ b/pc-bios/s390-ccw/bootmap.h @@ -264,28 +264,6 @@ typedef enum { /* utility code below */ -static const unsigned char ebc2asc[256] = - /* 0123456789abcdef0123456789abcdef */ - "................................" /* 1F */ - "................................" /* 3F */ - " ...........<(+|&.........!$*);." /* 5F first.chr.here.is.real.space */ - "-/.........,%_>?.........`:#@'=\""/* 7F */ - ".abcdefghi.......jklmnopqr......" /* 9F */ - "..stuvwxyz......................" /* BF */ - ".ABCDEFGHI.......JKLMNOPQR......" /* DF */ - "..STUVWXYZ......0123456789......";/* FF */ - -static inline void ebcdic_to_ascii(const char *src, - char *dst, - unsigned int size) -{ - unsigned int i; - for (i = 0; i < size; i++) { - unsigned c = src[i]; - dst[i] = ebc2asc[c]; - } -} - static inline void print_volser(const void *volser) { char ascii[8]; diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index 0946766d86..393d732353 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -15,6 +15,17 @@ char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE))); static SubChannelId blk_schid = { .one = 1 }; IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE))); +const unsigned char ebc2asc[256] = + /* 0123456789abcdef0123456789abcdef */ + "................................" /* 1F */ + "................................" /* 3F */ + " ...........<(+|&.........!$*);." /* 5F first.chr.here.is.real.space */ + "-/.........,%_>?.........`:#@'=\""/* 7F */ + ".abcdefghi.......jklmnopqr......" /* 9F */ + "..stuvwxyz......................" /* BF */ + ".ABCDEFGHI.......JKLMNOPQR......" /* DF */ + "..STUVWXYZ......0123456789......";/* FF */ + /* * Priniciples of Operations (SA22-7832-09) chapter 17 requires that * a subsystem-identification is at 184-187 and bytes 188-191 are zero diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h index ded67bcbc6..4e0aab27d3 100644 --- a/pc-bios/s390-ccw/s390-ccw.h +++ b/pc-bios/s390-ccw/s390-ccw.h @@ -189,4 +189,17 @@ static inline void IPL_check(bool term, const char *message) } } +extern const unsigned char ebc2asc[256]; +static inline void ebcdic_to_ascii(const char *src, + char *dst, + unsigned int size) +{ + unsigned int i; + + for (i = 0; i < size; i++) { + unsigned c = src[i]; + dst[i] = ebc2asc[c]; + } +} + #endif /* S390_CCW_H */ From 9a22473c70f3d07068a673e91562947b19e02995 Mon Sep 17 00:00:00 2001 From: Farhan Ali Date: Wed, 30 Nov 2016 14:22:07 -0500 Subject: [PATCH 06/12] pc-bios/s390-ccw: get LOADPARM stored in SCP Read Info Obtain the loadparm value stored in SCP Read Info by performing a SCLP Read Info request. Rename sclp-ascii.c to sclp.c to reflect the changed scope of the file. Signed-off-by: Farhan Ali Reviewed-by: Christian Borntraeger Signed-off-by: Cornelia Huck --- pc-bios/s390-ccw/Makefile | 2 +- pc-bios/s390-ccw/s390-ccw.h | 3 ++- pc-bios/s390-ccw/{sclp-ascii.c => sclp.c} | 12 ++++++++++++ pc-bios/s390-ccw/sclp.h | 2 ++ 4 files changed, 17 insertions(+), 2 deletions(-) rename pc-bios/s390-ccw/{sclp-ascii.c => sclp.c} (87%) diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile index 0339c24789..79a46b6735 100644 --- a/pc-bios/s390-ccw/Makefile +++ b/pc-bios/s390-ccw/Makefile @@ -9,7 +9,7 @@ $(call set-vpath, $(SRC_PATH)/pc-bios/s390-ccw) .PHONY : all clean build-all -OBJECTS = start.o main.o bootmap.o sclp-ascii.o virtio.o virtio-scsi.o +OBJECTS = start.o main.o bootmap.o sclp.o virtio.o virtio-scsi.o QEMU_CFLAGS := $(filter -W%, $(QEMU_CFLAGS)) QEMU_CFLAGS += -ffreestanding -fno-delete-null-pointer-checks -msoft-float QEMU_CFLAGS += -march=z900 -fPIE -fno-strict-aliasing diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h index 4e0aab27d3..903d2ce816 100644 --- a/pc-bios/s390-ccw/s390-ccw.h +++ b/pc-bios/s390-ccw/s390-ccw.h @@ -63,9 +63,10 @@ void panic(const char *string); void write_subsystem_identification(void); extern char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE))); -/* sclp-ascii.c */ +/* sclp.c */ void sclp_print(const char *string); void sclp_setup(void); +void sclp_get_loadparm_ascii(char *loadparm); /* virtio.c */ unsigned long virtio_load_direct(ulong rec_list1, ulong rec_list2, diff --git a/pc-bios/s390-ccw/sclp-ascii.c b/pc-bios/s390-ccw/sclp.c similarity index 87% rename from pc-bios/s390-ccw/sclp-ascii.c rename to pc-bios/s390-ccw/sclp.c index dc1c3e4f4d..a1639baed7 100644 --- a/pc-bios/s390-ccw/sclp-ascii.c +++ b/pc-bios/s390-ccw/sclp.c @@ -80,3 +80,15 @@ void sclp_print(const char *str) sclp_service_call(SCLP_CMD_WRITE_EVENT_DATA, sccb); } + +void sclp_get_loadparm_ascii(char *loadparm) +{ + + ReadInfo *sccb = (void *)_sccb; + + memset((char *)_sccb, 0, sizeof(ReadInfo)); + sccb->h.length = sizeof(ReadInfo); + if (!sclp_service_call(SCLP_CMDW_READ_SCP_INFO, sccb)) { + ebcdic_to_ascii((char *) sccb->loadparm, loadparm, 8); + } +} diff --git a/pc-bios/s390-ccw/sclp.h b/pc-bios/s390-ccw/sclp.h index 3cbfb78930..0dd987ff5d 100644 --- a/pc-bios/s390-ccw/sclp.h +++ b/pc-bios/s390-ccw/sclp.h @@ -55,6 +55,8 @@ typedef struct ReadInfo { SCCBHeader h; uint16_t rnmax; uint8_t rnsize; + uint8_t reserved[13]; + uint8_t loadparm[8]; } __attribute__((packed)) ReadInfo; typedef struct SCCB { From 95fa1af8540e0edad5e86590c67a726e6906b7d8 Mon Sep 17 00:00:00 2001 From: Farhan Ali Date: Mon, 16 Jan 2017 10:45:49 -0500 Subject: [PATCH 07/12] pc-bios/s390-ccw: provide a function to interpret LOADPARM value The LOADPARM value is fetched from SCP Read Info, but it's applied only at the phase of bootmap interpretation. So let's read the LOARPARM value and store it. Also provide a parsing function to detect numbers in the LOADPARM which can be used during bootmap interpretation. Remove a stray whitespace. Initial patch from Eugene (jno) Dvurechenski. Signed-off-by: Eugene (jno) Dvurechenski Signed-off-by: Farhan Ali Signed-off-by: Cornelia Huck --- pc-bios/s390-ccw/main.c | 27 ++++++++++++++++++++++++++- pc-bios/s390-ccw/s390-ccw.h | 1 + 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index 393d732353..1cacc1b46f 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -14,6 +14,7 @@ char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE))); static SubChannelId blk_schid = { .one = 1 }; IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE))); +static char loadparm[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; const unsigned char ebc2asc[256] = /* 0123456789abcdef0123456789abcdef */ @@ -40,7 +41,6 @@ void write_subsystem_identification(void) *zeroes = 0; } - void panic(const char *string) { sclp_print(string); @@ -48,6 +48,26 @@ void panic(const char *string) while (1) { } } +unsigned int get_loadparm_index(void) +{ + const char *lp = loadparm; + int i; + unsigned int idx = 0; + + for (i = 0; i < 8; i++) { + char c = lp[i]; + + if (c < '0' || c > '9') { + break; + } + + idx *= 10; + idx += c - '0'; + } + + return idx; +} + static bool find_dev(Schib *schib, int dev_no) { int i, r; @@ -84,6 +104,7 @@ static void virtio_setup(void) int ssid; bool found = false; uint16_t dev_no; + char ldp[] = "LOADPARM=[________]\n"; VDev *vdev = virtio_get_device(); /* @@ -93,6 +114,10 @@ static void virtio_setup(void) */ enable_mss_facility(); + sclp_get_loadparm_ascii(loadparm); + memcpy(ldp + 10, loadparm, 8); + sclp_print(ldp); + if (store_iplb(&iplb)) { switch (iplb.pbt) { case S390_IPL_TYPE_CCW: diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h index 903d2ce816..07d8cbcb20 100644 --- a/pc-bios/s390-ccw/s390-ccw.h +++ b/pc-bios/s390-ccw/s390-ccw.h @@ -62,6 +62,7 @@ void consume_sclp_int(void); void panic(const char *string); void write_subsystem_identification(void); extern char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE))); +unsigned int get_loadparm_index(void); /* sclp.c */ void sclp_print(const char *string); From 9dd7823b70ccbc812b4a977345dd0a28be0c4b3e Mon Sep 17 00:00:00 2001 From: Farhan Ali Date: Mon, 18 Apr 2016 13:45:31 +0200 Subject: [PATCH 08/12] pc-bios/s390-ccw: provide entry selection on LOADPARM for SCSI disk Fix SCSI bootmap interpreter to make use of any specified entry of the Program Table using the leftmost numeric value from the LOADPARM, if specified. Initial patch from Eugene (jno) Dvurechenski. Signed-off-by: Eugene (jno) Dvurechenski Signed-off-by: Farhan Ali Reviewed-by: Christian Borntraeger Signed-off-by: Cornelia Huck --- pc-bios/s390-ccw/bootmap.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c index b21c877b53..e39e67e07b 100644 --- a/pc-bios/s390-ccw/bootmap.c +++ b/pc-bios/s390-ccw/bootmap.c @@ -444,7 +444,8 @@ static void ipl_scsi(void) uint8_t *ns, *ns_end; int program_table_entries = 0; const int pte_len = sizeof(ScsiBlockPtr); - ScsiBlockPtr *prog_table_entry; + ScsiBlockPtr *prog_table_entry = NULL; + unsigned int loadparm = get_loadparm_index(); /* Grab the MBR */ memset(sec, FREE_SPACE_FILLER, sizeof(sec)); @@ -467,6 +468,7 @@ static void ipl_scsi(void) IPL_assert(magic_match(sec, ZIPL_MAGIC), "No zIPL magic in PT"); + debug_print_int("loadparm index", loadparm); ns_end = sec + virtio_get_block_size(); for (ns = (sec + pte_len); (ns + pte_len) < ns_end; ns += pte_len) { prog_table_entry = (ScsiBlockPtr *)ns; @@ -475,16 +477,15 @@ static void ipl_scsi(void) } program_table_entries++; + if (program_table_entries == loadparm + 1) { + break; /* selected entry found */ + } } debug_print_int("program table entries", program_table_entries); IPL_assert(program_table_entries != 0, "Empty Program Table"); - /* Run the default entry */ - - prog_table_entry = (ScsiBlockPtr *)(sec + pte_len); - zipl_run(prog_table_entry); /* no return */ } From 82ca394194342dd050034e25c5a61a854d82911a Mon Sep 17 00:00:00 2001 From: Farhan Ali Date: Mon, 18 Apr 2016 13:45:32 +0200 Subject: [PATCH 09/12] pc-bios/s390-ccw: add boot entry selection for ECKD DASD 1. change a bit definition of ScsiMbr to allow an array of pointers 2. add loadparm fetch to boot script processing 3. apply loadparm index to boot entry selection, if any Initial patch from Eugene (jno) Dvurechenski. Signed-off-by: Eugene (jno) Dvurechenski Signed-off-by: Farhan Ali Reviewed-by: Christian Borntraeger Signed-off-by: Cornelia Huck --- pc-bios/s390-ccw/bootmap.c | 16 +++++++++++----- pc-bios/s390-ccw/bootmap.h | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c index e39e67e07b..e974350b6f 100644 --- a/pc-bios/s390-ccw/bootmap.c +++ b/pc-bios/s390-ccw/bootmap.c @@ -183,15 +183,21 @@ static block_number_t load_eckd_segments(block_number_t blk, uint64_t *address) static void run_eckd_boot_script(block_number_t mbr_block_nr) { int i; + unsigned int loadparm = get_loadparm_index(); block_number_t block_nr; uint64_t address; - ScsiMbr *scsi_mbr = (void *)sec; + ScsiMbr *bte = (void *)sec; /* Eckd bootmap table entry */ BootMapScript *bms = (void *)sec; + debug_print_int("loadparm", loadparm); + IPL_assert(loadparm < 31, "loadparm value greater than" + " maximum number of boot entries allowed"); + memset(sec, FREE_SPACE_FILLER, sizeof(sec)); read_block(mbr_block_nr, sec, "Cannot read MBR"); - block_nr = eckd_block_num((void *)&(scsi_mbr->blockptr)); + block_nr = eckd_block_num((void *)&(bte->blockptr[loadparm])); + IPL_assert(block_nr != -1, "No Boot Map"); memset(sec, FREE_SPACE_FILLER, sizeof(sec)); read_block(block_nr, sec, "Cannot read Boot Map Script"); @@ -459,11 +465,11 @@ static void ipl_scsi(void) debug_print_int("MBR Version", mbr->version_id); IPL_check(mbr->version_id == 1, "Unknown MBR layout version, assuming version 1"); - debug_print_int("program table", mbr->blockptr.blockno); - IPL_assert(mbr->blockptr.blockno, "No Program Table"); + debug_print_int("program table", mbr->blockptr[0].blockno); + IPL_assert(mbr->blockptr[0].blockno, "No Program Table"); /* Parse the program table */ - read_block(mbr->blockptr.blockno, sec, + read_block(mbr->blockptr[0].blockno, sec, "Error reading Program Table"); IPL_assert(magic_match(sec, ZIPL_MAGIC), "No zIPL magic in PT"); diff --git a/pc-bios/s390-ccw/bootmap.h b/pc-bios/s390-ccw/bootmap.h index 9073de2238..7f367820f3 100644 --- a/pc-bios/s390-ccw/bootmap.h +++ b/pc-bios/s390-ccw/bootmap.h @@ -70,7 +70,7 @@ typedef struct ScsiMbr { uint8_t magic[4]; uint32_t version_id; uint8_t reserved[8]; - ScsiBlockPtr blockptr; + ScsiBlockPtr blockptr[]; } __attribute__ ((packed)) ScsiMbr; #define ZIPL_MAGIC "zIPL" From 7a9762bf89a490d82cd8de3dc7a973f8df3f1efe Mon Sep 17 00:00:00 2001 From: "Eugene (jno) Dvurechenski" Date: Mon, 18 Apr 2016 13:45:36 +0200 Subject: [PATCH 10/12] pc-bios/s390-ccw: add boot entry selection to El Torito routine If there is no LOADPARM given or '0' specified, then IPL the first matched entry. Otherwise IPL the matching entry of that number. Signed-off-by: Eugene (jno) Dvurechenski Signed-off-by: Farhan Ali Reviewed-by: Christian Borntraeger Signed-off-by: Cornelia Huck --- pc-bios/s390-ccw/bootmap.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c index e974350b6f..523fa78c5f 100644 --- a/pc-bios/s390-ccw/bootmap.c +++ b/pc-bios/s390-ccw/bootmap.c @@ -655,6 +655,7 @@ static IsoBcSection *find_iso_bc_entry(void) IsoBcEntry *e = (IsoBcEntry *)sec; uint32_t offset = find_iso_bc(); int i; + unsigned int loadparm = get_loadparm_index(); if (!offset) { return NULL; @@ -675,7 +676,11 @@ static IsoBcSection *find_iso_bc_entry(void) for (i = 1; i < ISO_BC_ENTRY_PER_SECTOR; i++) { if (e[i].id == ISO_BC_BOOTABLE_SECTION) { if (is_iso_bc_entry_compatible(&e[i].body.sect)) { - return &e[i].body.sect; + if (loadparm <= 1) { + /* found, default, or unspecified */ + return &e[i].body.sect; + } + loadparm--; } } } From c55144ec3262e8aeaf3e2e1e8fc48b07c993a654 Mon Sep 17 00:00:00 2001 From: Cornelia Huck Date: Mon, 24 Apr 2017 15:34:22 +0200 Subject: [PATCH 11/12] pc-bios/s390-ccw.img: update image Contains the following commits: - pc-bios/s390-ccw: Make ebcdic/ascii conversion public - pc-bios/s390-ccw: get LOADPARM stored in SCP Read Info - pc-bios/s390-ccw: provide a function to interpret LOADPARM value - pc-bios/s390-ccw: provide entry selection on LOADPARM for SCSI disk - pc-bios/s390-ccw: add boot entry selection for ECKD DASD - pc-bios/s390-ccw: add boot entry selection to El Torito routine Signed-off-by: Cornelia Huck --- pc-bios/s390-ccw.img | Bin 26456 -> 26472 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pc-bios/s390-ccw.img b/pc-bios/s390-ccw.img index 2a4adfa654844040dbc84e90a9c2e0af56fdb9fa..0b01d49495c607b67d3f1b2359395534631deb88 100644 GIT binary patch delta 10797 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 delta 10116 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 Date: Tue, 25 Apr 2017 15:18:47 +0200 Subject: [PATCH 12/12] hw/s390x/ipl: Fix crash with virtio-scsi-pci device qemu-system-s390x currently crashes when it is started with a virtio-scsi-pci device, e.g.: qemu-system-s390x -nographic -enable-kvm -device virtio-scsi-pci \ -drive file=/tmp/disk.dat,if=none,id=d1,format=raw \ -device scsi-cd,drive=d1,bootindex=1 The problem is that the code in s390_gen_initial_iplb() currently assumes that all SCSI devices are also CCW devices, which is not the case for virtio-scsi-pci of course. Fix it by adding an appropriate check for TYPE_CCW_DEVICE here. Signed-off-by: Thomas Huth Signed-off-by: Christian Borntraeger Message-Id: <1493126327-13162-1-git-send-email-thuth@redhat.com> Reviewed-by: Christian Borntraeger Signed-off-by: Cornelia Huck --- hw/s390x/ipl.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index 0711ee927a..75d3c681a4 100644 --- a/hw/s390x/ipl.c +++ b/hw/s390x/ipl.c @@ -249,7 +249,13 @@ static bool s390_gen_initial_iplb(S390IPLState *ipl) SCSIBus *bus = scsi_bus_from_device(sd); VirtIOSCSI *vdev = container_of(bus, VirtIOSCSI, bus); VirtIOSCSICcw *scsi_ccw = container_of(vdev, VirtIOSCSICcw, vdev); - CcwDevice *ccw_dev = CCW_DEVICE(scsi_ccw); + CcwDevice *ccw_dev; + + ccw_dev = (CcwDevice *)object_dynamic_cast(OBJECT(scsi_ccw), + TYPE_CCW_DEVICE); + if (!ccw_dev) { /* It might be a PCI device instead */ + return false; + } ipl->iplb.len = cpu_to_be32(S390_IPLB_MIN_QEMU_SCSI_LEN); ipl->iplb.blk0_len =