From 9bfc04f9ef6802fff0fc77130ff345a541783363 Mon Sep 17 00:00:00 2001 From: Janosch Frank Date: Wed, 4 Mar 2020 06:42:31 -0500 Subject: [PATCH 1/4] pc-bios: s390x: Save iplb location in lowcore The POP states that for a list directed IPL the IPLB is stored into memory by the machine loader and its address is stored at offset 0x14 of the lowcore. ZIPL currently uses the address in offset 0x14 to access the IPLB and acquire flags about secure boot. If the IPLB address points into memory which has an unsupported mix of flags set, ZIPL will panic instead of booting the OS. As the lowcore can have quite a high entropy for a guest that did drop out of protected mode (i.e. rebooted) we encountered the ZIPL panic quite often. Signed-off-by: Janosch Frank Tested-by: Marc Hartmayer Message-Id: <20200304114231.23493-19-frankja@linux.ibm.com> Reviewed-by: Christian Borntraeger Reviewed-by: David Hildenbrand Signed-off-by: Christian Borntraeger --- pc-bios/s390-ccw/jump2ipl.c | 1 + pc-bios/s390-ccw/main.c | 8 +++++++- pc-bios/s390-ccw/netmain.c | 1 + pc-bios/s390-ccw/s390-arch.h | 10 ++++++++-- pc-bios/s390-ccw/s390-ccw.h | 1 + 5 files changed, 18 insertions(+), 3 deletions(-) diff --git a/pc-bios/s390-ccw/jump2ipl.c b/pc-bios/s390-ccw/jump2ipl.c index da13c43cc0..4eba2510b0 100644 --- a/pc-bios/s390-ccw/jump2ipl.c +++ b/pc-bios/s390-ccw/jump2ipl.c @@ -35,6 +35,7 @@ void jump_to_IPL_code(uint64_t address) { /* store the subsystem information _after_ the bootmap was loaded */ write_subsystem_identification(); + write_iplb_location(); /* prevent unknown IPL types in the guest */ if (iplb.pbt == S390_IPL_TYPE_QEMU_SCSI) { diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index a21b386280..4e65b411e1 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -9,6 +9,7 @@ */ #include "libc.h" +#include "helper.h" #include "s390-arch.h" #include "s390-ccw.h" #include "cio.h" @@ -22,7 +23,7 @@ QemuIplParameters qipl; IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE))); static bool have_iplb; static uint16_t cutype; -LowCore const *lowcore; /* Yes, this *is* a pointer to address 0 */ +LowCore *lowcore; /* Yes, this *is* a pointer to address 0 */ #define LOADPARM_PROMPT "PROMPT " #define LOADPARM_EMPTY " " @@ -42,6 +43,11 @@ void write_subsystem_identification(void) *zeroes = 0; } +void write_iplb_location(void) +{ + lowcore->ptr_iplb = ptr2u32(&iplb); +} + void panic(const char *string) { sclp_print(string); diff --git a/pc-bios/s390-ccw/netmain.c b/pc-bios/s390-ccw/netmain.c index f2dcc01e27..309ffa30d9 100644 --- a/pc-bios/s390-ccw/netmain.c +++ b/pc-bios/s390-ccw/netmain.c @@ -40,6 +40,7 @@ #define DEFAULT_TFTP_RETRIES 20 extern char _start[]; +void write_iplb_location(void) {} #define KERNEL_ADDR ((void *)0L) #define KERNEL_MAX_SIZE ((long)_start) diff --git a/pc-bios/s390-ccw/s390-arch.h b/pc-bios/s390-ccw/s390-arch.h index 504fc7c2f0..5f36361c02 100644 --- a/pc-bios/s390-ccw/s390-arch.h +++ b/pc-bios/s390-ccw/s390-arch.h @@ -36,7 +36,13 @@ typedef struct LowCore { /* prefix area: defined by architecture */ PSWLegacy ipl_psw; /* 0x000 */ uint32_t ccw1[2]; /* 0x008 */ - uint32_t ccw2[2]; /* 0x010 */ + union { + uint32_t ccw2[2]; /* 0x010 */ + struct { + uint32_t reserved10; + uint32_t ptr_iplb; + }; + }; uint8_t pad1[0x80 - 0x18]; /* 0x018 */ uint32_t ext_params; /* 0x080 */ uint16_t cpu_addr; /* 0x084 */ @@ -85,7 +91,7 @@ typedef struct LowCore { PSW io_new_psw; /* 0x1f0 */ } __attribute__((packed, aligned(8192))) LowCore; -extern LowCore const *lowcore; +extern LowCore *lowcore; static inline void set_prefix(uint32_t address) { diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h index 11bce7d73c..21f27e7990 100644 --- a/pc-bios/s390-ccw/s390-ccw.h +++ b/pc-bios/s390-ccw/s390-ccw.h @@ -57,6 +57,7 @@ void consume_io_int(void); /* main.c */ void panic(const char *string); void write_subsystem_identification(void); +void write_iplb_location(void); extern char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE))); unsigned int get_loadparm_index(void); From 73987ee5102ff646a62c4f4e5b89a1949b9fdbc9 Mon Sep 17 00:00:00 2001 From: Christian Borntraeger Date: Thu, 5 Mar 2020 18:00:52 +0100 Subject: [PATCH 2/4] s390x/bios: rebuild s390-ccw.img contains 98df96d4edae ("pc-bios: s390x: Save iplb location in lowcore") Signed-off-by: Christian Borntraeger --- pc-bios/s390-ccw.img | Bin 42608 -> 42608 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pc-bios/s390-ccw.img b/pc-bios/s390-ccw.img index 91cdee4436ad828fe6cb664cfac270a21f2bde70..b9da9d8ecb10faa484a9a524a202f1f69cb59ad6 100644 GIT binary patch delta 8340 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 delta 8170 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 Date: Mon, 9 Mar 2020 14:32:23 +0100 Subject: [PATCH 3/4] s390/ipl: sync back loadparm We expose loadparm as a r/w machine property, but if loadparm is set by the guest via DIAG 308, we don't update the property. Having a disconnect between the guest view and the QEMU property is not nice in itself, but things get even worse for SCSI, where under certain circumstances (see 789b5a401b "s390: Ensure IPL from SCSI works as expected" for details) we call s390_gen_initial_iplb() on resets effectively overwriting the guest/user supplied loadparm with the stale value. Signed-off-by: Halil Pasic Fixes: 7104bae9de ("hw/s390x: provide loadparm property for the machine") Reported-by: Marc Hartmayer Reviewed-by: Janosch Frank Reviewed-by: Viktor Mihajlovski Tested-by: Marc Hartmayer Reviewed-by: David Hildenbrand Message-Id: <20200309133223.100491-1-pasic@linux.ibm.com> [borntraeger@de.ibm.com: use reverse xmas tree] Signed-off-by: Christian Borntraeger --- hw/s390x/ipl.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index 9c1ecd423c..b81942e1e6 100644 --- a/hw/s390x/ipl.c +++ b/hw/s390x/ipl.c @@ -538,6 +538,30 @@ static bool is_virtio_scsi_device(IplParameterBlock *iplb) return is_virtio_ccw_device_of_type(iplb, VIRTIO_ID_SCSI); } +static void update_machine_ipl_properties(IplParameterBlock *iplb) +{ + Object *machine = qdev_get_machine(); + Error *err = NULL; + + /* Sync loadparm */ + if (iplb->flags & DIAG308_FLAGS_LP_VALID) { + uint8_t *ebcdic_loadparm = iplb->loadparm; + char ascii_loadparm[8]; + int i; + + for (i = 0; i < 8 && ebcdic_loadparm[i]; i++) { + ascii_loadparm[i] = ebcdic2ascii[(uint8_t) ebcdic_loadparm[i]]; + } + ascii_loadparm[i] = 0; + object_property_set_str(machine, ascii_loadparm, "loadparm", &err); + } else { + object_property_set_str(machine, "", "loadparm", &err); + } + if (err) { + warn_report_err(err); + } +} + void s390_ipl_update_diag308(IplParameterBlock *iplb) { S390IPLState *ipl = get_ipl_device(); @@ -545,6 +569,7 @@ void s390_ipl_update_diag308(IplParameterBlock *iplb) ipl->iplb = *iplb; ipl->iplb_valid = true; ipl->netboot = is_virtio_net_device(iplb); + update_machine_ipl_properties(iplb); } IplParameterBlock *s390_ipl_get_iplb(void) From 94c21436e5a89143f8b9cb4d089d1a2f3f4fd377 Mon Sep 17 00:00:00 2001 From: Janosch Frank Date: Tue, 10 Mar 2020 05:09:50 -0400 Subject: [PATCH 4/4] s390x: ipl: Consolidate iplb validity check into one function It's nicer to just call one function than calling a function for each possible iplb type. Signed-off-by: Janosch Frank Reviewed-by: David Hildenbrand Message-Id: <20200310090950.61172-1-frankja@linux.ibm.com> Reviewed-by: Christian Borntraeger Signed-off-by: Christian Borntraeger --- hw/s390x/ipl.h | 18 +++++++++--------- target/s390x/diag.c | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/hw/s390x/ipl.h b/hw/s390x/ipl.h index d4813105db..3e44abe1c6 100644 --- a/hw/s390x/ipl.h +++ b/hw/s390x/ipl.h @@ -173,16 +173,16 @@ static inline bool iplb_valid_len(IplParameterBlock *iplb) return be32_to_cpu(iplb->len) <= sizeof(IplParameterBlock); } -static inline bool iplb_valid_ccw(IplParameterBlock *iplb) +static inline bool iplb_valid(IplParameterBlock *iplb) { - return be32_to_cpu(iplb->len) >= S390_IPLB_MIN_CCW_LEN && - iplb->pbt == S390_IPL_TYPE_CCW; -} - -static inline bool iplb_valid_fcp(IplParameterBlock *iplb) -{ - return be32_to_cpu(iplb->len) >= S390_IPLB_MIN_FCP_LEN && - iplb->pbt == S390_IPL_TYPE_FCP; + switch (iplb->pbt) { + case S390_IPL_TYPE_FCP: + return be32_to_cpu(iplb->len) >= S390_IPLB_MIN_FCP_LEN; + case S390_IPL_TYPE_CCW: + return be32_to_cpu(iplb->len) >= S390_IPLB_MIN_CCW_LEN; + default: + return false; + } } #endif diff --git a/target/s390x/diag.c b/target/s390x/diag.c index b5aec06d6b..54e5670b3f 100644 --- a/target/s390x/diag.c +++ b/target/s390x/diag.c @@ -117,7 +117,7 @@ void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3, uintptr_t ra) cpu_physical_memory_read(addr, iplb, be32_to_cpu(iplb->len)); - if (!iplb_valid_ccw(iplb) && !iplb_valid_fcp(iplb)) { + if (!iplb_valid(iplb)) { env->regs[r1 + 1] = DIAG_308_RC_INVALID; goto out; }