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