Make the address variable a parameter of zipl_load_segment and return segment length.
Modify this function for reuse in the next patch, which allows loading segment or signature data to the destination memory address. Add a comp_len variable to store the length of a segment and return this variable in zipl_load_segment. comp_len variable is necessary to store the calculated segment length and is used during signature verification. Return the length on success, or a negative return code on failure. Signed-off-by: Zhuoying Cai <zy...@linux.ibm.com> --- pc-bios/s390-ccw/bootmap.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c index 485b55f1bf..3dd09fda7e 100644 --- a/pc-bios/s390-ccw/bootmap.c +++ b/pc-bios/s390-ccw/bootmap.c @@ -613,19 +613,18 @@ static int ipl_eckd(void) * IPL a SCSI disk */ -static int zipl_load_segment(ComponentEntry *entry) +static int zipl_load_segment(ComponentEntry *entry, uint64_t address) { const int max_entries = (MAX_SECTOR_SIZE / sizeof(ScsiBlockPtr)); ScsiBlockPtr *bprs = (void *)sec; const int bprs_size = sizeof(sec); block_number_t blockno; - uint64_t address; int i; char err_msg[] = "zIPL failed to read BPRS at 0xZZZZZZZZZZZZZZZZ"; char *blk_no = &err_msg[30]; /* where to print blockno in (those ZZs) */ + int comp_len = 0; blockno = entry->data.blockno; - address = entry->compdat.load_addr; debug_print_int("loading segment at block", blockno); debug_print_int("addr", address); @@ -662,6 +661,9 @@ static int zipl_load_segment(ComponentEntry *entry) */ break; } + + comp_len += (uint64_t)bprs->size * ((uint64_t)bprs[i].blockct + 1); + address = virtio_load_direct(cur_desc[0], cur_desc[1], 0, (void *)address); if (!address) { @@ -671,7 +673,7 @@ static int zipl_load_segment(ComponentEntry *entry) } } while (blockno); - return 0; + return comp_len; } static int zipl_run_normal(ComponentEntry *entry, uint8_t *tmp_sec) @@ -685,7 +687,7 @@ static int zipl_run_normal(ComponentEntry *entry, uint8_t *tmp_sec) continue; } - if (zipl_load_segment(entry)) { + if (zipl_load_segment(entry, entry->compdat.load_addr) < 0) { return -1; } -- 2.49.0