On 09/05/2025 00.50, Zhuoying Cai wrote:
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);

So you're doing the multiplication in 64-bit here, but comp_len and the return value is only 32-bit ... that sounds like either the multiplication could be 32-bit only, too, or comp_len and the return type should be 64-bit?

 Thomas


              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;
          }


Reply via email to