diff options
-rw-r--r-- | pc-bios/s390-ccw/bootmap.c | 11 | ||||
-rw-r--r-- | pc-bios/s390-ccw/bootmap.h | 8 |
2 files changed, 18 insertions, 1 deletions
diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c index 7c8dce154a..82cca9c9e8 100644 --- a/pc-bios/s390-ccw/bootmap.c +++ b/pc-bios/s390-ccw/bootmap.c @@ -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) diff --git a/pc-bios/s390-ccw/bootmap.h b/pc-bios/s390-ccw/bootmap.h index 4f6f767584..cc77fd753c 100644 --- a/pc-bios/s390-ccw/bootmap.h +++ b/pc-bios/s390-ccw/bootmap.h @@ -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 { |