On May 23 08:41:50, mpieuc...@nolizard.org wrote: > On 26/12/12(Wed) 20:54, Miod Vallat wrote: > > > Just upgraded to a current again, with the same problem, > > > and the same solution: > > > > [...] > > > wdc1 at kauaiata0 irq 39: DMA > > > atapiscsi0 at wdc1 channel 0 drive 0 > > > scsibus0 at atapiscsi0: 2 targets > > > cd0 at scsibus0 targ 0 lun 0: <MATSHITA, DVD-R UJ-825, DAND> ATAPI > > > 5/cdrom removable > > > wd0 at wdc1 channel 0 drive 1: <ST9808211A> > > > wd0: 16-sector PIO, LBA, 76319MB, 156301488 sectors > > [...] > > > bootpath: /pci@f4000000/ata-6@d/disk@1:/bsd > > > > I think I understand what goes wrong. The code responsible for matching > > the boot device to the actual kernel device on macppc is quite crude, > > especially for non-SCSI disks. > > > > Your bootpath specifies `disk@1' because the disk drive is the second > > device (slave) on the ATA channel, the cdrom drive being master. > > However, the kernel wants to match this information against a `wd1' > > device (as if there were two hard disks on the ATA channel). > > > > The kernel code needs to be fixed to use device_register() to match the > > boot path against actual attachment information, instead of walking the > > device tree at the end of autoconf. If nobody beats me to do this, I'll > > try to cook a diff in a few days. > > Were you thinking of something like that? It works for me (c) tm, with > my PowerBooks (disk@0/wd0), I haven't tried NFS boot yet. > > Jan, does it improve something for you?
Yes it does: with this patch, I don't need to hardcode config bsd root on wd0a into my kernel, it figures the bootpath itself. Thank you! Jan [ using 500872 bytes of bsd ELF symbol table ] console out [ATY,RockHopper2_A]console in [keyboard] , using USB using parent ATY,RockHopper2Paren:: memaddr 98000000 size 8000000, : consaddr 9c008000, : ioaddr 90020000, size 20000: memtag 8000, iotag 8000: width 1280 linebytes 1280 height 1024 depth 8 Copyright (c) 1982, 1986, 1989, 1991, 1993 The Regents of the University of California. All rights reserved. Copyright (c) 1995-2013 OpenBSD. All rights reserved. http://www.OpenBSD.org OpenBSD 5.3-current (GENERIC.MP) #5: Thu May 23 09:02:44 CEST 2013 r...@www.stare.cz:/usr/src/sys/arch/macppc/compile/GENERIC.MP real mem = 1073741824 (1024MB) avail mem = 1032151040 (984MB) mainbus0 at root: model PowerMac10,2 cpu0 at mainbus0: 7447A (Revision 0x102): 1499 MHz: 512KB L2 cache mem0 at mainbus0 spdmem0 at mem0: 1GB DDR SDRAM non-parity PC3200CL3.0 memc0 at mainbus0: uni-n rev 0xd2 "hw-clock" at memc0 not configured kiic0 at memc0 offset 0xf8001000 iic0 at kiic0 mpcpcibr0 at mainbus0 pci: uni-north pci0 at mpcpcibr0 bus 0 pchb0 at pci0 dev 11 function 0 "Apple UniNorth AGP" rev 0x00 appleagp0 at pchb0 agp0 at appleagp0: aperture at 0x0, size 0x10000000 vgafb0 at pci0 dev 16 function 0 "ATI Radeon 9200" rev 0x01, mmio wsdisplay0 at vgafb0 mux 1: console (std, vt100 emulation) mpcpcibr1 at mainbus0 pci: uni-north pci1 at mpcpcibr1 bus 0 pchb1 at pci1 dev 11 function 0 "Apple UniNorth PCI" rev 0x00 bwi0 at pci1 dev 18 function 0 "Broadcom BCM4318" rev 0x02: irq 52, address 00:11:24:bf:cb:2a macobio0 at pci1 dev 23 function 0 "Apple Intrepid" rev 0x00 openpic0 at macobio0 offset 0x40000: version 0x4614 feature 3f0302 LE macgpio0 at macobio0 offset 0x50 "modem-reset" at macgpio0 offset 0x1d not configured "modem-power" at macgpio0 offset 0x1c not configured macgpio1 at macgpio0 offset 0x9 irq 47 "programmer-switch" at macgpio0 offset 0x11 not configured "gpio5" at macgpio0 offset 0x6f not configured "gpio6" at macgpio0 offset 0x70 not configured "extint-gpio15" at macgpio0 offset 0x67 not configured "escc-legacy" at macobio0 offset 0x12000 not configured zsc0 at macobio0 offset 0x13000: irq 22,23 zstty0 at zsc0 channel 0 zstty1 at zsc0 channel 1 aoa0 at macobio0 offset 0x10000: irq 30,1,2 audio0 at aoa0 "timer" at macobio0 offset 0x15000 not configured adb0 at macobio0 offset 0x16000apm0 at adb0: battery flags 0x0, 0% charged piic0 at adb0 iic1 at piic0 maxtmp0 at iic1 addr 0xc8: max6642 kiic1 at macobio0 offset 0x18000 iic2 at kiic1 wdc0 at macobio0 offset 0x20000 irq 24: DMA ohci0 at pci1 dev 24 function 0 "Apple Intrepid USB" rev 0x00: couldn't map interrupt ohci1 at pci1 dev 25 function 0 "Apple Intrepid USB" rev 0x00: couldn't map interrupt ohci2 at pci1 dev 26 function 0 "Apple Intrepid USB" rev 0x00: irq 29, version 1.0, legacy support ohci3 at pci1 dev 27 function 0 "NEC USB" rev 0x43: irq 63, version 1.0 ohci4 at pci1 dev 27 function 1 "NEC USB" rev 0x43: irq 63, version 1.0 ehci0 at pci1 dev 27 function 2 "NEC USB" rev 0x04: irq 63 usb0 at ehci0: USB revision 2.0 uhub0 at usb0 "NEC EHCI root hub" rev 2.00/1.00 addr 1 usb1 at ohci2: USB revision 1.0 uhub1 at usb1 "Apple OHCI root hub" rev 1.00/1.00 addr 1 usb2 at ohci3: USB revision 1.0 uhub2 at usb2 "NEC OHCI root hub" rev 1.00/1.00 addr 1 usb3 at ohci4: USB revision 1.0 uhub3 at usb3 "NEC OHCI root hub" rev 1.00/1.00 addr 1 mpcpcibr2 at mainbus0 pci: uni-north pci2 at mpcpcibr2 bus 0 pchb2 at pci2 dev 11 function 0 "Apple UniNorth PCI" rev 0x00 kauaiata0 at pci2 dev 13 function 0 "Apple Intrepid ATA" rev 0x00 wdc1 at kauaiata0 irq 39: DMA atapiscsi0 at wdc1 channel 0 drive 0 scsibus0 at atapiscsi0: 2 targets cd0 at scsibus0 targ 0 lun 0: <MATSHITA, DVD-R UJ-825, DAND> ATAPI 5/cdrom removable wd0 at wdc1 channel 0 drive 1: <ST9808211A> wd0: 16-sector PIO, LBA, 76319MB, 156301488 sectors cd0(wdc1:0:0): using PIO mode 4, DMA mode 2, Ultra-DMA mode 4 wd0(wdc1:0:1): using PIO mode 4, DMA mode 2, Ultra-DMA mode 4 "Apple UniNorth Firewire" rev 0x81 at pci2 dev 14 function 0 not configured gem0 at pci2 dev 15 function 0 "Apple Uni-N2 GMAC" rev 0x80: irq 41, address 00:14:51:17:42:34 bmtphy0 at gem0 phy 0: BCM5221 100baseTX PHY, rev. 4 umass0 at uhub0 port 1 configuration 1 interface 0 "Prolific Technology Inc. Mass Storage Device" rev 2.00/1.00 addr 2 umass0: using SCSI over Bulk-Only scsibus1 at umass0: 2 targets, initiator 0 sd0 at scsibus1 targ 1 lun 0: <ST980815, A, 3.AL> SCSI0 0/direct fixed serial.067b2506000000000000 sd0: 76319MB, 512 bytes/sector, 156301488 sectors uhidev0 at uhub1 port 1 configuration 1 interface 0 "Apple Computer HID-proxy" rev 2.00/19.65 addr 2 uhidev0: iclass 3/1 ukbd0 at uhidev0: 8 variable keys, 6 key codes wskbd0 at ukbd0: console keyboard, using wsdisplay0 uhidev1 at uhub1 port 1 configuration 1 interface 1 "Apple Computer HID-proxy" rev 2.00/19.65 addr 2 uhidev1: iclass 3/1 ums0 at uhidev1: 5 buttons wsmouse0 at ums0 mux 0 uhidev2 at uhub3 port 1 configuration 1 interface 0 "Chicony USB Keyboard" rev 1.10/1.02 addr 2 uhidev2: iclass 3/1 ukbd1 at uhidev2: 8 variable keys, 6 key codes wskbd1 at ukbd1 mux 1 wskbd1: connecting to wsdisplay0 uhidev3 at uhub3 port 1 configuration 1 interface 1 "Chicony USB Keyboard" rev 1.10/1.02 addr 2 uhidev3: iclass 3/0, 3 report ids uhid0 at uhidev3 reportid 1: input=1, output=0, feature=0 uhid1 at uhidev3 reportid 2: input=1, output=0, feature=2 uhid2 at uhidev3 reportid 3: input=3, output=0, feature=0 vscsi0 at root scsibus2 at vscsi0: 256 targets softraid0 at root scsibus3 at softraid0: 256 targets bootpath: /pci@f4000000/ata-6@d/disk@1:/bsd root on wd0a (5d2ade1fc5a8d569.a) swap on wd0b dump on wd0b > Index: autoconf.c > =================================================================== > RCS file: /cvs/src/sys/arch/macppc/macppc/autoconf.c,v > retrieving revision 1.39 > diff -u -p -r1.39 autoconf.c > --- autoconf.c 11 Nov 2010 17:58:21 -0000 1.39 > +++ autoconf.c 22 May 2013 19:00:45 -0000 > @@ -68,7 +68,7 @@ > > void dumpconf(void); > static struct devmap *findtype(char **); > -void makebootdev(char *cp); > +void parseofwbp(char *); > int getpno(char **); > > /* > @@ -79,6 +79,9 @@ int getpno(char **); > int cold = 1; /* if 1, still working on cold-start */ > char bootdev[16]; /* to hold boot dev name */ > struct device *bootdv = NULL; > +enum devclass bootdev_class = DV_DULL; > +int bootdev_type = 0; > +int bootdev_unit = 0; > > struct dumpmem dumpmem[VM_PHYSSEG_MAX]; > u_int ndumpmem; > @@ -165,9 +168,9 @@ findtype(char **s) > * '/ht@0,f2000000/pci@2/bcom5704@4/bsd' > */ > void > -makebootdev(char *bp) > +parseofwbp(char *bp) > { > - int unit, ptype; > + int ptype; > char *dev, *cp; > struct devmap *dp; > > @@ -184,6 +187,8 @@ makebootdev(char *bp) > } while((dp->type & T_IFACE) == 0); > > if (dp->att && dp->type == T_IFACE) { > + bootdev_class = DV_IFNET; > + bootdev_type = dp->type; > strlcpy(bootdev, dp->dev, sizeof bootdev); > return; > } > @@ -193,24 +198,9 @@ makebootdev(char *bp) > ptype = dp->type; > dp = findtype(&cp); > if (dp->att && dp->type == T_DISK) { > - unit = getpno(&cp); > - if (ptype == T_SCSI) { > - struct device *dv; > - struct sd_softc *sd; > - > - TAILQ_FOREACH(dv, &alldevs, dv_list) { > - if (dv->dv_class != DV_DISK || > - strcmp(dv->dv_cfdata->cf_driver->cd_name, > "sd")) > - continue; > - sd = (struct sd_softc *)dv; > - if (sd->sc_link->target != unit) > - continue; > - snprintf(bootdev, sizeof bootdev, > - "%s%c", dv->dv_xname, 'a'); > - return; > - } > - } > - snprintf(bootdev, sizeof bootdev, "%s%d%c", dev, unit, 'a'); > + bootdev_class = DV_DISK; > + bootdev_type = ptype; > + bootdev_unit = getpno(&cp); > return; > } > printf("Warning: boot device unrecognized: %s\n", bp); > @@ -239,25 +229,44 @@ getpno(char **cp) > void > device_register(struct device *dev, void *aux) > { > + const char *drvrname = dev->dv_cfdata->cf_driver->cd_name; > + const char *name = dev->dv_xname; > + > + if (bootdv != NULL || dev->dv_class != bootdev_class) > + return; > + > + switch (bootdev_type) { > + case T_SCSI: > + if (strcmp(drvrname, "sd") == 0) { > + struct sd_softc *sd = (struct sd_softc *)dev; > + > + if (sd->sc_link->target == bootdev_unit) > + bootdv = dev; > + } > + case T_IDE: > + /* > + * Do not require the bootpath unit number to match > + * against the driver's one, a slave disk on the ATA > + * channel `disk@1' can attach as `wd0'. > + */ > + if (strcmp(drvrname, "wd") == 0) > + bootdv = dev; > + break; > + case T_IFACE: > + if (strcmp(name, bootdev) == 0) > + bootdv = dev; > + break; > + default: > + break; > + } > } > > -/* > - * Now that we are fully operational, we can checksum the > - * disks, and using some heuristics, hopefully are able to > - * always determine the correct root disk. > - */ > void > diskconf(void) > { > - dev_t temp; > - int part = 0; > - > printf("bootpath: %s\n", bootpath); > - makebootdev(bootpath); > > - /* Lookup boot device from boot if not set by configuration */ > - bootdv = parsedisk(bootdev, strlen(bootdev), 0, &temp); > - setroot(bootdv, part, RB_USERREQ); > + setroot(bootdv, 0, RB_USERREQ); > dumpconf(); > } > > Index: machdep.c > =================================================================== > RCS file: /cvs/src/sys/arch/macppc/macppc/machdep.c,v > retrieving revision 1.135 > diff -u -p -r1.135 machdep.c > --- machdep.c 6 Dec 2012 12:35:22 -0000 1.135 > +++ machdep.c 22 May 2013 18:24:25 -0000 > @@ -114,6 +114,9 @@ char ofw_eth_addr[6]; /* Save address o > char *bootpath; > char bootpathbuf[512]; > > +/* from autoconf.c */ > +extern void parseofwbp(char *); > + > struct firmware *fw = NULL; > > #ifdef DDB > @@ -367,7 +370,8 @@ initppc(startkernel, endkernel, args) > } > } > } > - bootpath= &bootpathbuf[0]; > + bootpath = &bootpathbuf[0]; > + parseofwbp(bootpath); > > #ifdef DDB > ddb_init();