[PATCH v17 20/34] pc-bios/s390-ccw: Refactor zipl_run()
Zhuoying Cai <[email protected]>
| Newsgroups | gmane.comp.emulators.qemu |
|---|---|
| Message-ID | <[email protected]> |
Refactor to enhance readability before enabling secure IPL in later patches. Signed-off-by: Zhuoying Cai <[email protected]> Reviewed-by: Thomas Huth <[email protected]> Reviewed-by: Jared Rossi <[email protected]> Reviewed-by: Collin Walling <[email protected]> Reviewed-by: Philippe Mathieu-Daudé <[email protected]> --- pc-bios/s390-ccw/bootmap.c | 54 ++++++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c index 420ee32eff..2cf5c9eee3 100644 --- a/pc-bios/s390-ccw/bootmap.c +++ b/pc-bios/s390-ccw/bootmap.c @@ -674,12 +674,42 @@ static int zipl_load_segment(ComponentEntry *entry) return 0; } +static int zipl_run_normal(ComponentEntry **entry_ptr, const uint8_t *tmp_sec) +{ + ComponentEntry *entry = *entry_ptr; + + while (entry->component_type == ZIPL_COMP_ENTRY_LOAD || + entry->component_type == ZIPL_COMP_ENTRY_SIGNATURE) { + + /* Secure boot is off, so we skip signature entries */ + if (entry->component_type == ZIPL_COMP_ENTRY_SIGNATURE) { + entry++; + continue; + } + + if (zipl_load_segment(entry)) { + return -1; + } + + entry++; + + if ((uint8_t *)&entry[1] > tmp_sec + MAX_SECTOR_SIZE) { + puts("Wrong entry value"); + return -EINVAL; + } + } + + *entry_ptr = entry; + return 0; +} + /* Run a zipl program */ static int zipl_run(ScsiBlockPtr *pte) { ComponentHeader *header; ComponentEntry *entry; uint8_t tmp_sec[MAX_SECTOR_SIZE]; + int rc; if (virtio_read(pte->blockno, tmp_sec)) { puts("Cannot read header"); @@ -700,25 +730,10 @@ static int zipl_run(ScsiBlockPtr *pte) /* Load image(s) into RAM */ entry = (ComponentEntry *)(&header[1]); - while (entry->component_type == ZIPL_COMP_ENTRY_LOAD || - entry->component_type == ZIPL_COMP_ENTRY_SIGNATURE) { - - /* We don't support secure boot yet, so we skip signature entries */ - if (entry->component_type == ZIPL_COMP_ENTRY_SIGNATURE) { - entry++; - continue; - } - if (zipl_load_segment(entry)) { - return -1; - } - - entry++; - - if ((uint8_t *)(&entry[1]) > (tmp_sec + MAX_SECTOR_SIZE)) { - puts("Wrong entry value"); - return -EINVAL; - } + rc = zipl_run_normal(&entry, tmp_sec); + if (rc) { + return rc; } if (entry->component_type != ZIPL_COMP_ENTRY_EXEC) { @@ -726,10 +741,9 @@ static int zipl_run(ScsiBlockPtr *pte) return -EINVAL; } - /* should not return */ write_reset_psw(entry->compdat.load_psw); jump_to_IPL_code(0); - return -1; + return -1; /* should not return */ } static int ipl_scsi(void) -- 2.55.0