From nobody Thu Apr 25 21:37:00 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 80.81.252.135 is neither permitted nor denied by domain of seabios.org) client-ip=80.81.252.135; envelope-from=seabios-bounces@seabios.org; helo=mail.coreboot.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 80.81.252.135 is neither permitted nor denied by domain of seabios.org) smtp.mailfrom=seabios-bounces@seabios.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from mail.coreboot.org (mail.coreboot.org [80.81.252.135]) by mx.zohomail.com with SMTPS id 1538132087179507.2506720373875; Fri, 28 Sep 2018 03:54:47 -0700 (PDT) Received: from [127.0.0.1] (helo=ra.coreboot.org) by mail.coreboot.org with esmtp (Exim 4.86_2) (envelope-from ) id 1g5qQ0-0006pE-Na; Fri, 28 Sep 2018 12:54:44 +0200 Received: from mx1.redhat.com ([209.132.183.28]) by mail.coreboot.org with esmtps (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.86_2) (envelope-from ) id 1g5qPp-0006p3-O0 for seabios@seabios.org; Fri, 28 Sep 2018 12:54:43 +0200 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E368FC058CA6 for ; Fri, 28 Sep 2018 10:54:15 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-116-29.ams2.redhat.com [10.36.116.29]) by smtp.corp.redhat.com (Postfix) with ESMTP id 89ABB600CC; Fri, 28 Sep 2018 10:54:13 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id CDD2A9C425; Fri, 28 Sep 2018 12:54:12 +0200 (CEST) From: Gerd Hoffmann To: seabios@seabios.org Date: Fri, 28 Sep 2018 12:54:05 +0200 Message-Id: <20180928105405.10386-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Fri, 28 Sep 2018 10:54:15 +0000 (UTC) X-Spam-Score: -5.6 (-----) Subject: [SeaBIOS] [PATCH v2] pretty boot menu entry for cdrom drives X-BeenThere: seabios@seabios.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: SeaBIOS mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gerd Hoffmann MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: seabios-bounces@seabios.org Sender: "SeaBIOS" X-Duff: Orig. Duff, Duff Lite, Duff Dry, Duff Dark, Raspberry Duff, Lady Duff, Red Duff, Tartar Control Duff X-ZohoMail: RDMRC_1 RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Show the volume label of bootable cdroms. Signed-off-by: Gerd Hoffmann --- src/util.h | 1 + src/boot.c | 10 ++++++++++ src/cdrom.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 57 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); =20 // clock.c void clock_setup(void); diff --git a/src/boot.c b/src/boot.c index ff705fd47f..9f82f3ca0c 100644 --- a/src/boot.c +++ b/src/boot.c @@ -395,6 +395,16 @@ boot_add_hd(struct drive_s *drive, const char *desc, i= nt 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 =3D cdrom_media_info(drive); + if (extra) { + desc =3D znprintf(MAXDESCSIZE, "%s (%s)", desc, extra); + free(extra); + } + } bootentry_add(IPL_TYPE_CDROM, defPrio(prio, DefaultCDPrio) , (u32)drive, desc); } diff --git a/src/cdrom.c b/src/cdrom.c index 828fb3b842..577d69d812 100644 --- a/src/cdrom.c +++ b/src/cdrom.c @@ -274,3 +274,49 @@ cdrom_boot(struct drive_s *drive) =20 return 0; } + +// check if media is present and the drive is bootable. +// in case it is return the volume label. +char* +cdrom_media_info(struct drive_s *drive) +{ + ASSERT32FLAT(); + + struct disk_op_s dop; + memset(&dop, 0, sizeof(dop)); + dop.drive_fl =3D drive; + + int ret =3D scsi_is_ready(&dop); + if (ret) + return NULL; + + // Read the Boot Record Volume Descriptor + u8 buffer[CDROM_SECTOR_SIZE]; + dop.command =3D CMD_READ; + dop.lba =3D 0x11; + dop.count =3D 1; + dop.buf_fl =3D buffer; + ret =3D process_op(&dop); + if (ret) + return NULL; + + // Is it bootable? + if (buffer[0]) + return NULL; + if (strcmp((char*)&buffer[1], "CD001\001EL TORITO SPECIFICATION") !=3D= 0) + return NULL; + + // Read the Primary Volume Descriptor + dop.command =3D CMD_READ; + dop.lba =3D 0x10; + dop.count =3D 1; + dop.buf_fl =3D buffer; + ret =3D process_op(&dop); + if (ret) + return NULL; + + // Read volume id, trim trailing spaces + char *volume =3D znprintf(30, "%s", buffer + 40); + nullTrailingSpace(volume); + return volume; +} --=20 2.9.3 _______________________________________________ SeaBIOS mailing list SeaBIOS@seabios.org https://mail.coreboot.org/mailman/listinfo/seabios