[SeaBIOS] [PATCH] pretty boot menu entry for cdrom drives
Kevin O'Connor
kevin at koconnor.net
Tue Sep 25 17:34:23 CEST 2018
On Fri, Sep 21, 2018 at 09:48:01AM +0200, Gerd Hoffmann wrote:
> Signed-off-by: Gerd Hoffmann <kraxel at redhat.com>
> ---
> src/util.h | 1 +
> src/boot.c | 7 +++++++
> src/cdrom.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 59 insertions(+)
>
> diff --git a/src/util.h b/src/util.h
> index 7a23b518fc..6dd080f673 100644
> --- a/src/util.h
> +++ b/src/util.h
> @@ -50,6 +50,7 @@ struct disk_op_s;
> int cdemu_process_op(struct disk_op_s *op);
> void cdrom_prepboot(void);
> int cdrom_boot(struct drive_s *drive_g);
> +char *cdrom_media_info(struct drive_s *drive_g);
>
> // clock.c
> void clock_setup(void);
> diff --git a/src/boot.c b/src/boot.c
> index ff705fd47f..80bcc13535 100644
> --- a/src/boot.c
> +++ b/src/boot.c
> @@ -395,6 +395,13 @@ boot_add_hd(struct drive_s *drive, const char *desc, int prio)
> void
> boot_add_cd(struct drive_s *drive, const char *desc, int prio)
> {
> + if (GET_GLOBAL(PlatformRunningOn) & PF_QEMU) {
> + // We want short boot times. But on physical hardware even
> + // the test unit ready can take several seconds. So do media
> + // access on qemu only, where we know it will be fast.
> + char *extra = cdrom_media_info(drive);
> + desc = znprintf(MAXDESCSIZE, "%s (%s)", desc, extra);
> + }
> bootentry_add(IPL_TYPE_CDROM, defPrio(prio, DefaultCDPrio)
> , (u32)drive, desc);
> }
> diff --git a/src/cdrom.c b/src/cdrom.c
> index 828fb3b842..b4c36622ae 100644
> --- a/src/cdrom.c
> +++ b/src/cdrom.c
> @@ -274,3 +274,54 @@ cdrom_boot(struct drive_s *drive)
>
> return 0;
> }
> +
> +// go figure some cdrom information, for a pretty boot menu entry.
> +char*
> +cdrom_media_info(struct drive_s *drive)
> +{
> + ASSERT32FLAT();
> +
> + struct disk_op_s dop;
> + memset(&dop, 0, sizeof(dop));
> + dop.drive_fl = drive;
> +
> + int ret = scsi_is_ready(&dop);
> + if (ret)
> + return "empty";
> +
> + // Read the Boot Record Volume Descriptor
> + u8 buffer[CDROM_SECTOR_SIZE];
> + dop.command = CMD_READ;
> + dop.lba = 0x11;
> + dop.count = 1;
> + dop.buf_fl = buffer;
> + ret = process_op(&dop);
> + if (ret)
> + return "read error";
> +
> + // Is it bootable?
> + if (buffer[0])
> + return "not bootable";
> + if (strcmp((char*)&buffer[1], "CD001\001EL TORITO SPECIFICATION") != 0)
> + return "not bootable";
> +
> + // Read the Primary Volume Descriptor
> + dop.command = CMD_READ;
> + dop.lba = 0x10;
> + dop.count = 1;
> + dop.buf_fl = buffer;
> + ret = process_op(&dop);
> + if (ret)
> + return "read error";
> +
> + // Read volume id, trim trailing spaces
> + char *volume = znprintf(30, "%s", buffer + 40);
> + char *h = volume + strlen(volume);
> + while (h > volume) {
> + h--;
> + if (*h != ' ')
> + break;
> + *h = 0;
> + }
> + return volume;
> +}
Thanks. In general, looks fine to me.
Some minor comments:
If there's a read error or non-bootable device, shouldn't it just
revert to the original description?
There's a nullTrailingSpace() function to remove trailing spaces.
-Kevin
More information about the SeaBIOS
mailing list