Port-i386 archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: boot device detection on cdboot
In article <080913123524.M0125024%mirage.ceres.dti.ne.jp@localhost>
I wrote:
> Is there any good way to detect boot device on cdboot?
>
> It will be useful on one CD system with cd9660 root file system
> and working dirs on tmpfs/mfs, like restorecd for cobalt.
> (recompiling a whole kernel only for "root on cd0a" is a bit pain)
>
> Current arch/x86/x86/x86_autoconf.c:findroot() doesn't
> check cd(4) for the booted device.
>
> On the other hand, arch/i386/stand/lib/biosdisk_ll.c:set_geometry()
> checks a number of BIOS disks via get_harddrives() and sets
> BIOSDISK_TYPE_CD in struct biosdisk_extinfo.
I notice the number of BIOS disks is stored in BTINFO_BIOSGEOM
so we can check it in findroot() function.
How about this patch?
---
Index: x86_autoconf.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x86/x86/x86_autoconf.c,v
retrieving revision 1.34
diff -u -r1.34 x86_autoconf.c
--- x86_autoconf.c 16 Apr 2008 16:06:52 -0000 1.34
+++ x86_autoconf.c 11 Oct 2008 20:03:42 -0000
@@ -305,6 +305,7 @@
struct btinfo_rootdevice *biv;
struct btinfo_bootdisk *bid;
struct btinfo_bootwedge *biw;
+ struct btinfo_biosgeom *big;
device_t dv;
if (booted_device)
@@ -432,6 +433,34 @@
if (booted_device)
return;
+
+ /*
+ * No booted device found; check CD-ROM boot at last.
+ *
+ * Our bootloader assumes CD-ROM boot if biosdev is larger
+ * than the number of hard drives recognized by the BIOS.
+ * The number of drives can be found in BTINFO_BIOSGEOM here.
+ *
+ * See src/sys/arch/i386/stand/boot/devopen.c and
+ * src/sys/arch/i386/stand/lib/bootinfo_biosgeom.c .
+ */
+ if ((big = lookup_bootinfo(BTINFO_BIOSGEOM)) != NULL &&
+ bid->biosdev > 0x80 + big->num) {
+ /*
+ * XXX
+ * There is no proper way to detect which unit is
+ * recognized as a bootable CD-ROM drive by the BIOS.
+ * Assume the first unit is the one.
+ */
+ TAILQ_FOREACH(dv, &alldevs, dv_list) {
+ if (device_class(dv) == DV_DISK &&
+ device_is_a(dv, "cd")) {
+ booted_device = dv;
+ booted_partition = 0;
+ break;
+ }
+ }
+ }
}
}
---
Izumi Tsutsui
Home |
Main Index |
Thread Index |
Old Index