Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP1:GA
qemu.8405
0175-pc-bios-s390-ccw-Unify-error-handli.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0175-pc-bios-s390-ccw-Unify-error-handli.patch of Package qemu.8405
From 1204b03e249d566e7016d77783b5b9f7429a3bb5 Mon Sep 17 00:00:00 2001 From: "Eugene (jno) Dvurechenski" <jno@linux.vnet.ibm.com> Date: Mon, 19 May 2014 20:11:07 +0200 Subject: [PATCH] pc-bios/s390-ccw: Unify error handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convert to IPL_assert and friends Acked-by: Christian Borntraeger <borntraeger@de.ibm.com> Signed-off-by: Eugene (jno) Dvurechenski <jno@linux.vnet.ibm.com> Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com> (cherry picked from commit 60612d5cbbf0e02123214f4a2d7d20f7dd87925e) Signed-off-by: Andreas Färber <afaerber@suse.de> --- pc-bios/s390-ccw/bootmap.c | 82 ++++++++++--------------------------- pc-bios/s390-ccw/main.c | 13 ++++-- pc-bios/s390-ccw/s390-ccw.h | 2 +- 3 files changed, 31 insertions(+), 66 deletions(-) diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c index e8db75d65a..b57d4e1a07 100644 --- a/pc-bios/s390-ccw/bootmap.c +++ b/pc-bios/s390-ccw/bootmap.c @@ -88,7 +88,7 @@ static int zipl_magic(uint8_t *ptr) return 1; } -static int zipl_load_segment(ComponentEntry *entry) +static void zipl_load_segment(ComponentEntry *entry) { const int max_entries = (MAX_SECTOR_SIZE / sizeof(ScsiBlockPtr)); ScsiBlockPtr *bprs = (void *)sec; @@ -105,10 +105,8 @@ static int zipl_load_segment(ComponentEntry *entry) 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; - } + debug_print_int("reading bprs at", blockno); + read_block(blockno, bprs, "zipl_load_segment: cannot read block"); for (i = 0;; i++) { u64 *cur_desc = (void *)&bprs[i]; @@ -136,21 +134,13 @@ static int zipl_load_segment(ComponentEntry *entry) } address = virtio_load_direct(cur_desc[0], cur_desc[1], 0, (void *)address); - if (address == -1) { - goto fail; - } + IPL_assert(address != -1, "zipl_load_segment: wrong IPL address"); } } while (blockno); - - return 0; - -fail: - sclp_print("failed loading segment\n"); - return -1; } /* Run a zipl program */ -static int zipl_run(ScsiBlockPtr *pte) +static void zipl_run(ScsiBlockPtr *pte) { ComponentHeader *header; ComponentEntry *entry; @@ -159,75 +149,53 @@ static int zipl_run(ScsiBlockPtr *pte) virtio_read(pte->blockno, tmp_sec); header = (ComponentHeader *)tmp_sec; - if (!zipl_magic(tmp_sec)) { - goto fail; - } + IPL_assert(zipl_magic(tmp_sec), "zipl_run: zipl_magic"); - if (header->type != ZIPL_COMP_HEADER_IPL) { - goto fail; - } + IPL_assert(header->type == ZIPL_COMP_HEADER_IPL, + "zipl_run: wrong header type"); dputs("start loading images\n"); /* Load image(s) into RAM */ entry = (ComponentEntry *)(&header[1]); while (entry->component_type == ZIPL_COMP_ENTRY_LOAD) { - if (zipl_load_segment(entry) < 0) { - goto fail; - } + zipl_load_segment(entry); entry++; - if ((uint8_t *)(&entry[1]) > (tmp_sec + MAX_SECTOR_SIZE)) { - goto fail; - } + IPL_assert((uint8_t *)(&entry[1]) <= (tmp_sec + MAX_SECTOR_SIZE), + "zipl_run: wrong entry size"); } - if (entry->component_type != ZIPL_COMP_ENTRY_EXEC) { - goto fail; - } + IPL_assert(entry->component_type == ZIPL_COMP_ENTRY_EXEC, + "zipl_run: no EXEC entry"); /* should not return */ jump_to_IPL_code(entry->load_address); - - return 0; - -fail: - sclp_print("failed running zipl\n"); - return -1; } -int zipl_load(void) +void zipl_load(void) { ScsiMbr *mbr = (void *)sec; uint8_t *ns, *ns_end; int program_table_entries = 0; const int pte_len = sizeof(ScsiBlockPtr); ScsiBlockPtr *prog_table_entry; - const char *error = ""; /* Grab the MBR */ - virtio_read(0, (void *)mbr); + read_block(0, mbr, "zipl_load: cannot read block 0"); dputs("checking magic\n"); - if (!zipl_magic(mbr->magic)) { - error = "zipl_magic 1"; - goto fail; - } + IPL_assert(zipl_magic(mbr->magic), "zipl_load: zipl_magic 1"); debug_print_int("program table", mbr->blockptr.blockno); /* Parse the program table */ - if (virtio_read(mbr->blockptr.blockno, sec)) { - error = "virtio_read"; - goto fail; - } + read_block(mbr->blockptr.blockno, sec, + "zipl_load: cannot read program table"); - if (!zipl_magic(sec)) { - error = "zipl_magic 2"; - goto fail; - } + IPL_assert(zipl_magic(sec), "zipl_load: zipl_magic 2"); ns_end = sec + virtio_get_block_size(); for (ns = (sec + pte_len); (ns + pte_len) < ns_end; ns++) { @@ -241,19 +209,11 @@ int zipl_load(void) debug_print_int("program table entries", program_table_entries); - if (!program_table_entries) { - goto fail; - } + IPL_assert(program_table_entries, "zipl_load: no program table"); /* Run the default entry */ prog_table_entry = (ScsiBlockPtr *)(sec + pte_len); - return zipl_run(prog_table_entry); - -fail: - sclp_print("failed loading zipl: "); - sclp_print(error); - sclp_print("\n"); - return -1; + zipl_run(prog_table_entry); /* no return */ } diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index 014ae09e71..f9ec2157ad 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -9,6 +9,7 @@ */ #include "s390-ccw.h" +#include "virtio.h" char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE))); uint64_t boot_value; @@ -79,6 +80,10 @@ static void virtio_setup(uint64_t dev_info) } virtio_setup_block(blk_schid); + + if (!virtio_ipl_disk_is_valid()) { + virtio_panic("No valid hard disk detected.\n"); + } } int main(void) @@ -87,8 +92,8 @@ int main(void) debug_print_int("boot reg[7] ", boot_value); virtio_setup(boot_value); - if (zipl_load() < 0) - sclp_print("Failed to load OS from hard disk\n"); - disabled_wait(); - while (1) { } + zipl_load(); /* no return */ + + virtio_panic("Failed to load OS from hard disk\n"); + return 0; /* make compiler happy */ } diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h index a7015ab943..075519b203 100644 --- a/pc-bios/s390-ccw/s390-ccw.h +++ b/pc-bios/s390-ccw/s390-ccw.h @@ -65,7 +65,7 @@ int virtio_read(ulong sector, void *load_addr); int enable_mss_facility(void); /* bootmap.c */ -int zipl_load(void); +void zipl_load(void); static inline void *memset(void *s, int c, size_t n) {
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor