pc-bios/s390-ccw: El Torito s390x boot entry check
authorMaxim Samoylov <max7255@linux.vnet.ibm.com>
Mon, 12 Oct 2015 15:50:20 +0000 (17:50 +0200)
committerCornelia Huck <cornelia.huck@de.ibm.com>
Wed, 11 Nov 2015 16:21:39 +0000 (17:21 +0100)
Boot entry is considered compatible if boot image is Linux kernel
with matching S390 Linux magic string.

Empty boot images with sector_count == 0 are considered broken.

Signed-off-by: Maxim Samoylov <max7255@linux.vnet.ibm.com>
Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
pc-bios/s390-ccw/bootmap.c
pc-bios/s390-ccw/bootmap.h

index 7c8dce154a1fc9b30ccc8812d84db6c29a4be73f..82cca9c9e86e79a922347850695186f0a99f640d 100644 (file)
@@ -450,7 +450,16 @@ static void ipl_scsi(void)
 
 static bool is_iso_bc_entry_compatible(IsoBcSection *s)
 {
-    return true;
+    uint8_t *magic_sec = (uint8_t *)(sec + ISO_SECTOR_SIZE);
+
+    if (s->unused || !s->sector_count) {
+        return false;
+    }
+    read_iso_sector(bswap32(s->load_rba), magic_sec,
+                    "Failed to read image sector 0");
+
+    /* Checking bytes 8 - 32 for S390 Linux magic */
+    return !_memcmp(magic_sec + 8, linux_s390_magic, 24);
 }
 
 static void load_iso_bc_entry(IsoBcSection *load)
index 4f6f7675842e4db2b27d7232b17b59600157a0e3..cc77fd753c9cc96c7f3f400275877425e83de797 100644 (file)
@@ -495,6 +495,14 @@ typedef struct IsoBcHdr {
     uint8_t id[28];
 } __attribute__((packed)) IsoBcHdr;
 
+/*
+ * Match two CCWs located after PSW and eight filler bytes.
+ * From libmagic and arch/s390/kernel/head.S.
+ */
+const uint8_t linux_s390_magic[] = "\x02\x00\x00\x18\x60\x00\x00\x50\x02\x00"
+                                   "\x00\x68\x60\x00\x00\x50\x40\x40\x40\x40"
+                                   "\x40\x40\x40\x40";
+
 typedef struct IsoBcEntry {
     uint8_t id;
     union {