From 554f80896dbdc6ce5bb01eab9659facf05ccf168 Mon Sep 17 00:00:00 2001 From: David Hildenbrand Date: Wed, 18 Jun 2014 14:16:44 +0200 Subject: [PATCH 1/4] pc-bios/s390-ccw: virtio_load_direct() can't load max number of sectors The number of sectors to read is given by the last 16 bit of rec_list2. 1 is added in order to get to the real number of sectors to read (0x0000 -> read 1 block). For now, the maximum number (0xffff) led to 0 sectors being read. This fixes a bug where a large initrd (62MB) could not be ipled anymore. Signed-off-by: David Hildenbrand Signed-off-by: Jens Freimann Reviewed-by: Cornelia Huck Reviewed-by: Alexander Graf Signed-off-by: Cornelia Huck --- pc-bios/s390-ccw/virtio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c index a46914dd68..bbb3c4f36d 100644 --- a/pc-bios/s390-ccw/virtio.c +++ b/pc-bios/s390-ccw/virtio.c @@ -240,7 +240,7 @@ unsigned long virtio_load_direct(ulong rec_list1, ulong rec_list2, { u8 status; int sec = rec_list1; - int sec_num = (((rec_list2 >> 32)+ 1) & 0xffff); + int sec_num = ((rec_list2 >> 32) & 0xffff) + 1; int sec_len = rec_list2 >> 48; ulong addr = (ulong)load_addr; From 962982329029acb6651f81b47cb401e593bb62df Mon Sep 17 00:00:00 2001 From: Christian Borntraeger Date: Wed, 18 Jun 2014 14:16:45 +0200 Subject: [PATCH 2/4] pc-bios/s390-ccw: do a subsystem reset before running the guest The loader BIOS has already activated several devices. Let's do a subsystem reset before jumping into the guest. As there is no direct way of doing so, we use diagnose 308 to bring the system in a defined state. This is similar to what kdump on s390 uses. We have to define a small trampoline function that restores the low bytes to whatever the bootmap has written there. Signed-off-by: Christian Borntraeger Signed-off-by: Jens Freimann Reviewed-by: Alexander Graf Signed-off-by: Cornelia Huck --- pc-bios/s390-ccw/bootmap.c | 55 ++++++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 8 deletions(-) diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c index 53a460df84..c07553ba2a 100644 --- a/pc-bios/s390-ccw/bootmap.c +++ b/pc-bios/s390-ccw/bootmap.c @@ -58,6 +58,52 @@ struct mbr { /* Scratch space */ static uint8_t sec[SECTOR_SIZE] __attribute__((__aligned__(SECTOR_SIZE))); +typedef struct ResetInfo { + uint32_t ipl_mask; + uint32_t ipl_addr; + uint32_t ipl_continue; +} ResetInfo; + +ResetInfo save; + +static void jump_to_IPL_2(void) +{ + ResetInfo *current = 0; + + void (*ipl)(void) = (void *) (uint64_t) current->ipl_continue; + debug_print_addr("set IPL addr to", ipl); + + /* Ensure the guest output starts fresh */ + sclp_print("\n"); + + *current = save; + ipl(); /* should not return */ +} + +static void jump_to_IPL_code(uint64_t address) +{ + /* + * The IPL PSW is at address 0. We also must not overwrite the + * content of non-BIOS memory after we loaded the guest, so we + * save the original content and restore it in jump_to_IPL_2. + */ + ResetInfo *current = 0; + + save = *current; + current->ipl_addr = (uint32_t) (uint64_t) &jump_to_IPL_2; + current->ipl_continue = address & 0x7fffffff; + + /* + * HACK ALERT. + * We use the load normal reset to keep r15 unchanged. jump_to_IPL_2 + * can then use r15 as its stack pointer. + */ + asm volatile("lghi 1,1\n\t" + "diag 1,1,0x308\n\t" + : : : "1", "memory"); + virtio_panic("\n! IPL returns !\n"); +} + /* Check for ZIPL magic. Returns 0 if not matched. */ static int zipl_magic(uint8_t *ptr) { @@ -123,7 +169,6 @@ static int zipl_run(struct scsi_blockptr *pte) { struct component_header *header; struct component_entry *entry; - void (*ipl)(void); uint8_t tmp_sec[SECTOR_SIZE]; virtio_read(pte->blockno, tmp_sec); @@ -157,14 +202,8 @@ static int zipl_run(struct scsi_blockptr *pte) goto fail; } - /* Ensure the guest output starts fresh */ - sclp_print("\n"); - - /* And run the OS! */ - ipl = (void*)(entry->load_address & 0x7fffffff); - debug_print_addr("set IPL addr to", ipl); /* should not return */ - ipl(); + jump_to_IPL_code(entry->load_address); return 0; From c77cd87cf54f003748f29c14ea1ddaecfc5c653f Mon Sep 17 00:00:00 2001 From: "Eugene (jno) Dvurechenski" Date: Wed, 18 Jun 2014 14:16:46 +0200 Subject: [PATCH 3/4] pc-bios/s390-ccw: fix for fragmented SCSI bootmap We need to interpret the last entry of the bootmap with zero block count as "continuation pointer". The "last entry" is being detected by pre-filling of the scratch space with known values and respective look-ahead. Signed-off-by: Eugene (jno) Dvurechenski Signed-off-by: Jens Freimann Tested-by: Christian Borntraeger Reviewed-by: David Hildenbrand Reviewed-by: Cornelia Huck Reviewed-by: Alexander Graf Signed-off-by: Cornelia Huck --- pc-bios/s390-ccw/bootmap.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c index c07553ba2a..5ee3fcb38f 100644 --- a/pc-bios/s390-ccw/bootmap.c +++ b/pc-bios/s390-ccw/bootmap.c @@ -118,10 +118,26 @@ static int zipl_magic(uint8_t *ptr) return 1; } +#define FREE_SPACE_FILLER '\xAA' + +static inline bool unused_space(const void *p, unsigned int size) +{ + int i; + const unsigned char *m = p; + + for (i = 0; i < size; i++) { + if (m[i] != FREE_SPACE_FILLER) { + return false; + } + } + return true; +} + static int zipl_load_segment(struct component_entry *entry) { const int max_entries = (SECTOR_SIZE / sizeof(struct scsi_blockptr)); struct scsi_blockptr *bprs = (void*)sec; + const int bprs_size = sizeof(sec); uint64_t blockno; long address; int i; @@ -133,6 +149,7 @@ static int zipl_load_segment(struct component_entry *entry) debug_print_int("addr", address); do { + memset(bprs, FREE_SPACE_FILLER, bprs_size); if (virtio_read(blockno, (uint8_t *)bprs)) { debug_print_int("failed reading bprs at", blockno); goto fail; @@ -150,6 +167,16 @@ static int zipl_load_segment(struct component_entry *entry) if (i == (max_entries - 1)) break; + if (bprs[i].blockct == 0 && unused_space(&bprs[i + 1], + sizeof(struct scsi_blockptr))) { + /* This is a "continue" pointer. + * This ptr is the last one in the current script section. + * I.e. the next ptr must point to the unused memory area. + * The blockno is not zero, so the upper loop must continue + * reading next section of BPRS. + */ + break; + } address = virtio_load_direct(cur_desc[0], cur_desc[1], 0, (void*)address); if (address == -1) From 4ff51e66374706d22c7e37b094a3b7a464b8ac91 Mon Sep 17 00:00:00 2001 From: Jens Freimann Date: Wed, 18 Jun 2014 14:16:47 +0200 Subject: [PATCH 4/4] pc-bios/s390-ccw: update s390-ccw.img binary Update s390-ccw.img to match with latest fixes Signed-off-by: Jens Freimann Signed-off-by: Cornelia Huck --- pc-bios/s390-ccw.img | Bin 9336 -> 9432 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pc-bios/s390-ccw.img b/pc-bios/s390-ccw.img index f6223e77c2aacfa86652d63b773dc05eca55570d..1c7f7640fc0c5f2505c4f1114a21b3b712852dbc 100644 GIT binary patch literal 9432 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 Sl)Xx<=2T(0?dh~BQEuzi<