forked from rpms/qemu-kvm
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.8 KiB
103 lines
3.8 KiB
From 64fa56e0520215e3909e442f09d8073c1870648a Mon Sep 17 00:00:00 2001
|
|
From: Thomas Huth <thuth@redhat.com>
|
|
Date: Fri, 8 Jul 2022 20:49:01 +0200
|
|
Subject: [PATCH 07/17] pc-bios/s390-ccw/bootmap: Improve the guessing logic in
|
|
zipl_load_vblk()
|
|
|
|
RH-Author: Thomas Huth <thuth@redhat.com>
|
|
RH-MergeRequest: 106: pc-bios/s390-ccw: Fix boot from disks with 4k sectors that do not have the typical DASD geometry
|
|
RH-Commit: [2/10] ca8f5e847617cf4ac2fd6c38edb2982f32fa3eba (thuth/qemu-kvm-cs9)
|
|
RH-Bugzilla: 2098077
|
|
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
|
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
|
|
|
Bugzilla: http://bugzilla.redhat.com/2098077
|
|
|
|
commit 422865f6672ee1482b98d18321b55c1ecfb06c82
|
|
Author: Thomas Huth <thuth@redhat.com>
|
|
Date: Mon Jul 4 13:18:54 2022 +0200
|
|
|
|
pc-bios/s390-ccw/bootmap: Improve the guessing logic in zipl_load_vblk()
|
|
|
|
The logic of trying an final ISO or ECKD boot on virtio-block devices is
|
|
very weird: Since the geometry hardly ever matches in virtio_disk_is_scsi(),
|
|
virtio_blk_setup_device() always sets a "guessed" disk geometry via
|
|
virtio_assume_scsi() (which is certainly also wrong in a lot of cases).
|
|
|
|
zipl_load_vblk() then sees that there's been a "virtio_guessed_disk_nature"
|
|
and tries to fix up the geometry again via virtio_assume_iso9660() before
|
|
always trying to do ipl_iso_el_torito(). That's a very brain-twisting
|
|
way of attempting to boot from ISO images, which won't work anymore after
|
|
the following patches that will clean up the virtio_assume_scsi() mess
|
|
(and thus get rid of the "virtio_guessed_disk_nature" here).
|
|
|
|
Let's try a better approach instead: ISO files always have a magic
|
|
string "CD001" at offset 0x8001 (see e.g. the ECMA-119 specification)
|
|
which we can use to decide whether we should try to boot in ISO 9660
|
|
mode (which we should also try if we see a sector size of 2048).
|
|
|
|
And if we were not able to boot in ISO mode here, the final boot attempt
|
|
before panicking is to boot in ECKD mode. Since this is our last boot
|
|
attempt anyway, simply always assume the ECKD geometry here (if the sector
|
|
size was not 4096 yet), so that we also do not depend on the guessed disk
|
|
geometry from virtio_blk_setup_device() here anymore.
|
|
|
|
Message-Id: <20220704111903.62400-4-thuth@redhat.com>
|
|
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
|
|
|
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
|
---
|
|
pc-bios/s390-ccw/bootmap.c | 27 +++++++++++++++++++++++----
|
|
1 file changed, 23 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c
|
|
index 56411ab3b6..994e59c0b0 100644
|
|
--- a/pc-bios/s390-ccw/bootmap.c
|
|
+++ b/pc-bios/s390-ccw/bootmap.c
|
|
@@ -780,18 +780,37 @@ static void ipl_iso_el_torito(void)
|
|
}
|
|
}
|
|
|
|
+/**
|
|
+ * Detect whether we're trying to boot from an .ISO image.
|
|
+ * These always have a signature string "CD001" at offset 0x8001.
|
|
+ */
|
|
+static bool has_iso_signature(void)
|
|
+{
|
|
+ int blksize = virtio_get_block_size();
|
|
+
|
|
+ if (!blksize || virtio_read(0x8000 / blksize, sec)) {
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ return !memcmp("CD001", &sec[1], 5);
|
|
+}
|
|
+
|
|
/***********************************************************************
|
|
* Bus specific IPL sequences
|
|
*/
|
|
|
|
static void zipl_load_vblk(void)
|
|
{
|
|
- if (virtio_guessed_disk_nature()) {
|
|
- virtio_assume_iso9660();
|
|
+ int blksize = virtio_get_block_size();
|
|
+
|
|
+ if (blksize == VIRTIO_ISO_BLOCK_SIZE || has_iso_signature()) {
|
|
+ if (blksize != VIRTIO_ISO_BLOCK_SIZE) {
|
|
+ virtio_assume_iso9660();
|
|
+ }
|
|
+ ipl_iso_el_torito();
|
|
}
|
|
- ipl_iso_el_torito();
|
|
|
|
- if (virtio_guessed_disk_nature()) {
|
|
+ if (blksize != VIRTIO_DASD_DEFAULT_BLOCK_SIZE) {
|
|
sclp_print("Using guessed DASD geometry.\n");
|
|
virtio_assume_eckd();
|
|
}
|
|
--
|
|
2.31.1
|
|
|