qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Collin L. Walling" <walling@linux.vnet.ibm.com>
To: qemu-s390x@nongnu.org, qemu-devel@nongnu.org
Cc: borntraeger@de.ibm.com, frankja@linux.vnet.ibm.com,
	cohuck@redhat.com, thuth@redhat.com, david@redhat.com,
	alifm@linux.vnet.ibm.com, eblake@redhat.com,
	mihajlov@linux.vnet.ibm.com
Subject: [Qemu-devel] [PATCH v5 01/12] s390-ccw: refactor boot map table code
Date: Mon,  5 Feb 2018 15:57:15 -0500	[thread overview]
Message-ID: <1517864246-11101-2-git-send-email-walling@linux.vnet.ibm.com> (raw)
In-Reply-To: <1517864246-11101-1-git-send-email-walling@linux.vnet.ibm.com>

- replace ScsiMbr in ECKD code with BootMapTable
- fix read_block messages to reflect BMT
- reduce ipl_scsi code with BMT struct

Signed-off-by: Collin L. Walling <walling@linux.vnet.ibm.com>
---
 pc-bios/s390-ccw/bootmap.c | 53 ++++++++++++++++++----------------------------
 pc-bios/s390-ccw/bootmap.h |  9 +++++++-
 2 files changed, 29 insertions(+), 33 deletions(-)

diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
index 67a6123..8ee9056 100644
--- a/pc-bios/s390-ccw/bootmap.c
+++ b/pc-bios/s390-ccw/bootmap.c
@@ -182,13 +182,13 @@ static block_number_t load_eckd_segments(block_number_t blk, uint64_t *address)
     return block_nr;
 }
 
-static void run_eckd_boot_script(block_number_t mbr_block_nr)
+static void run_eckd_boot_script(block_number_t bmt_block_nr)
 {
     int i;
     unsigned int loadparm = get_loadparm_index();
     block_number_t block_nr;
     uint64_t address;
-    ScsiMbr *bte = (void *)sec; /* Eckd bootmap table entry */
+    BootMapTable *bmt = (void *)sec;
     BootMapScript *bms = (void *)sec;
 
     debug_print_int("loadparm", loadparm);
@@ -196,10 +196,10 @@ static void run_eckd_boot_script(block_number_t mbr_block_nr)
                " maximum number of boot entries allowed");
 
     memset(sec, FREE_SPACE_FILLER, sizeof(sec));
-    read_block(mbr_block_nr, sec, "Cannot read MBR");
+    read_block(bmt_block_nr, sec, "Cannot read Boot Map Table");
 
-    block_nr = eckd_block_num((void *)&(bte->blockptr[loadparm]));
-    IPL_assert(block_nr != -1, "No Boot Map");
+    block_nr = eckd_block_num((void *)&bmt->bte[loadparm]);
+    IPL_assert(block_nr != -1, "Cannot find Boot Map Table Entry");
 
     memset(sec, FREE_SPACE_FILLER, sizeof(sec));
     read_block(block_nr, sec, "Cannot read Boot Map Script");
@@ -223,7 +223,7 @@ static void ipl_eckd_cdl(void)
     XEckdMbr *mbr;
     Ipl2 *ipl2 = (void *)sec;
     IplVolumeLabel *vlbl = (void *)sec;
-    block_number_t block_nr;
+    block_number_t bmt_block_nr;
 
     /* we have just read the block #0 and recognized it as "IPL1" */
     sclp_print("CDL\n");
@@ -238,8 +238,8 @@ static void ipl_eckd_cdl(void)
     IPL_assert(mbr->dev_type == DEV_TYPE_ECKD,
                "Non-ECKD device type in zIPL section of IPL2 record.");
 
-    /* save pointer to Boot Script */
-    block_nr = eckd_block_num((void *)&(mbr->blockptr));
+    /* save pointer to Boot Map Table */
+    bmt_block_nr = eckd_block_num((void *)&mbr->blockptr);
 
     memset(sec, FREE_SPACE_FILLER, sizeof(sec));
     read_block(2, vlbl, "Cannot read Volume Label at block 2");
@@ -249,7 +249,7 @@ static void ipl_eckd_cdl(void)
                "Invalid magic of volser block");
     print_volser(vlbl->f.volser);
 
-    run_eckd_boot_script(block_nr);
+    run_eckd_boot_script(bmt_block_nr);
     /* no return */
 }
 
@@ -280,7 +280,7 @@ static void print_eckd_ldl_msg(ECKD_IPL_mode_t mode)
 
 static void ipl_eckd_ldl(ECKD_IPL_mode_t mode)
 {
-    block_number_t block_nr;
+    block_number_t bmt_block_nr;
     BootInfo *bip = (void *)(sec + 0x70); /* BootInfo is MBR for LDL */
 
     if (mode != ECKD_LDL_UNLABELED) {
@@ -299,8 +299,10 @@ static void ipl_eckd_ldl(ECKD_IPL_mode_t mode)
     }
     verify_boot_info(bip);
 
-    block_nr = eckd_block_num((void *)&(bip->bp.ipl.bm_ptr.eckd.bptr));
-    run_eckd_boot_script(block_nr);
+    /* save pointer to Boot Map Table */
+    bmt_block_nr = eckd_block_num((void *)&bip->bp.ipl.bm_ptr.eckd.bptr);
+
+    run_eckd_boot_script(bmt_block_nr);
     /* no return */
 }
 
@@ -325,7 +327,7 @@ static void print_eckd_msg(void)
 
 static void ipl_eckd(void)
 {
-    ScsiMbr *mbr = (void *)sec;
+    XEckdMbr *mbr = (void *)sec;
     LDL_VTOC *vlbl = (void *)sec;
 
     print_eckd_msg();
@@ -449,10 +451,8 @@ static void zipl_run(ScsiBlockPtr *pte)
 static void ipl_scsi(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 = NULL;
+    BootMapTable *bmt = (void *)sec;
     unsigned int loadparm = get_loadparm_index();
 
     /* Grab the MBR */
@@ -467,34 +467,23 @@ static void ipl_scsi(void)
     debug_print_int("MBR Version", mbr->version_id);
     IPL_check(mbr->version_id == 1,
               "Unknown MBR layout version, assuming version 1");
-    debug_print_int("program table", mbr->blockptr[0].blockno);
-    IPL_assert(mbr->blockptr[0].blockno, "No Program Table");
+    debug_print_int("program table", mbr->bmt.blockno);
+    IPL_assert(mbr->bmt.blockno, "No Program Table");
 
     /* Parse the program table */
-    read_block(mbr->blockptr[0].blockno, sec,
-               "Error reading Program Table");
+    read_block(mbr->bmt.blockno, sec, "Error reading Program Table");
 
     IPL_assert(magic_match(sec, ZIPL_MAGIC), "No zIPL magic in PT");
 
     debug_print_int("loadparm index", loadparm);
-    ns_end = sec + virtio_get_block_size();
-    for (ns = (sec + pte_len); (ns + pte_len) < ns_end; ns += pte_len) {
-        prog_table_entry = (ScsiBlockPtr *)ns;
-        if (!prog_table_entry->blockno) {
-            break;
-        }
 
+    while (bmt->bte[program_table_entries].scsi.blockno) {
         program_table_entries++;
-        if (program_table_entries == loadparm + 1) {
-            break; /* selected entry found */
-        }
     }
 
     debug_print_int("program table entries", program_table_entries);
 
-    IPL_assert(program_table_entries != 0, "Empty Program Table");
-
-    zipl_run(prog_table_entry); /* no return */
+    zipl_run(&bmt->bte[loadparm].scsi); /* no return */
 }
 
 /***********************************************************************
diff --git a/pc-bios/s390-ccw/bootmap.h b/pc-bios/s390-ccw/bootmap.h
index cf99a4c..77d56db 100644
--- a/pc-bios/s390-ccw/bootmap.h
+++ b/pc-bios/s390-ccw/bootmap.h
@@ -53,6 +53,13 @@ typedef union BootMapPointer {
     ExtEckdBlockPtr xeckd;
 } __attribute__ ((packed)) BootMapPointer;
 
+/* aka Program Table */
+typedef struct BootMapTable {
+    uint8_t magic[4];
+    uint8_t reserved[12];
+    BootMapPointer bte[];
+} __attribute__ ((packed)) BootMapTable;
+
 typedef struct ComponentEntry {
     ScsiBlockPtr data;
     uint8_t pad[7];
@@ -70,7 +77,7 @@ typedef struct ScsiMbr {
     uint8_t magic[4];
     uint32_t version_id;
     uint8_t reserved[8];
-    ScsiBlockPtr blockptr[];
+    ScsiBlockPtr bmt;
 } __attribute__ ((packed)) ScsiMbr;
 
 #define ZIPL_MAGIC              "zIPL"
-- 
2.7.4

  reply	other threads:[~2018-02-05 21:01 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-05 20:57 [Qemu-devel] [PATCH v5 00/12]Interactive Boot Menu for DASD and SCSI Guests on s390x Collin L. Walling
2018-02-05 20:57 ` Collin L. Walling [this message]
2018-02-06  5:52   ` [Qemu-devel] [qemu-s390x] [PATCH v5 01/12] s390-ccw: refactor boot map table code Thomas Huth
2018-02-06 17:05     ` Collin L. Walling
2018-02-05 20:57 ` [Qemu-devel] [PATCH v5 02/12] s390-ccw: refactor eckd_block_num to use CHS Collin L. Walling
2018-02-06  6:00   ` [Qemu-devel] [qemu-s390x] " Thomas Huth
2018-02-05 20:57 ` [Qemu-devel] [PATCH v5 03/12] s390-ccw: refactor IPL structs Collin L. Walling
2018-02-05 20:57 ` [Qemu-devel] [PATCH v5 04/12] s390-ccw: update libc Collin L. Walling
2018-02-06  6:14   ` [Qemu-devel] [qemu-s390x] " Thomas Huth
2018-02-06 17:07     ` Collin L. Walling
2018-02-05 20:57 ` [Qemu-devel] [PATCH v5 05/12] s390-ccw: move auxiliary IPL data to separate location Collin L. Walling
2018-02-06  9:23   ` [Qemu-devel] [qemu-s390x] " Thomas Huth
2018-02-06 10:13     ` Viktor Mihajlovski
2018-02-06 17:10       ` Collin L. Walling
2018-02-14 14:51       ` Collin L. Walling
2018-02-14 15:07         ` Christian Borntraeger
2018-02-06  9:45   ` [Qemu-devel] " Christian Borntraeger
2018-02-06  9:57     ` Viktor Mihajlovski
2018-02-05 20:57 ` [Qemu-devel] [PATCH v5 06/12] s390-ccw: parse and set boot menu options Collin L. Walling
2018-02-06 10:00   ` Viktor Mihajlovski
2018-02-14 17:46   ` [Qemu-devel] [qemu-s390x] " Collin L. Walling
2018-02-15  6:38     ` Thomas Huth
2018-02-15  7:57       ` Viktor Mihajlovski
2018-02-05 20:57 ` [Qemu-devel] [PATCH v5 07/12] s390-ccw: set up interactive boot menu parameters Collin L. Walling
2018-02-05 20:57 ` [Qemu-devel] [PATCH v5 08/12] s390-ccw: read stage2 boot loader data to find menu Collin L. Walling
2018-02-05 20:57 ` [Qemu-devel] [PATCH v5 09/12] s390-ccw: print zipl boot menu Collin L. Walling
2018-02-05 20:57 ` [Qemu-devel] [PATCH v5 10/12] s390-ccw: read user input for boot index via the SCLP console Collin L. Walling
2018-02-05 20:57 ` [Qemu-devel] [PATCH v5 11/12] s390-ccw: clear pending irqs Collin L. Walling
2018-02-06 10:07   ` [Qemu-devel] [qemu-s390x] " Thomas Huth
2018-02-06 16:37     ` Collin L. Walling
2018-02-14 10:57   ` David Hildenbrand
2018-02-14 15:33     ` Collin L. Walling
2018-02-15  7:04       ` Thomas Huth
2018-02-15 15:47         ` Collin L. Walling
2018-02-15 16:12           ` David Hildenbrand
2018-02-05 20:57 ` [Qemu-devel] [PATCH v5 12/12] s390-ccw: interactive boot menu for scsi Collin L. Walling
2018-02-05 21:20 ` [Qemu-devel] [PATCH v5 00/12]Interactive Boot Menu for DASD and SCSI Guests on s390x no-reply
2018-02-05 21:37   ` [Qemu-devel] [qemu-s390x] " Collin L. Walling

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1517864246-11101-2-git-send-email-walling@linux.vnet.ibm.com \
    --to=walling@linux.vnet.ibm.com \
    --cc=alifm@linux.vnet.ibm.com \
    --cc=borntraeger@de.ibm.com \
    --cc=cohuck@redhat.com \
    --cc=david@redhat.com \
    --cc=eblake@redhat.com \
    --cc=frankja@linux.vnet.ibm.com \
    --cc=mihajlov@linux.vnet.ibm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-s390x@nongnu.org \
    --cc=thuth@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).