[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

boot from secondary IDE drive



>                                            千葉市中央区長洲
>                                                    藤原  誠
port-macppc でも話題になったことがあるのですが、
例えば G4 の中の wd0 の隣に、wd1 を slave で増設して、
その中に、sysinst などで netbsd を入れると、ここから 

boot enet:0 /pci@f2000000/pci-bridge@d/mac-io@7/ata-4/disk@1:0

しても、boot はするのですが、boot-device が unknown になるか、
万一 wd0 に設置済だと、そちらを root だと思って mount してしまう
という問題があって、(誰も send-pr していないと思います。多分)
(本当のことを言うと、StarMax の IDE0/IDE1 も少し似た問題が
あって.. それは実はまた全然別の問題らしいのですが)

添付のような printf を入れて何かなぁと見ているのですが、
addr(1) aa_channel(0) does not match, returning.
という表示とその他沢山表示が出て、いまは画面でやっているので効
率が上りませんが、多分問題のところは
 -- dv_xname(wd1)
 -- cp (disk1)
 -- bp (disk@:1/netbsd)
と表示されているような気がします。(不確か。後でもっと良く見て
おきます)

どうも、
   sys/arch/macppc/macppc/autoconf.c の
次の部分が問題なのではないかと思うのですが...
216 行目で /netbsd の部分が問題 ? 
それとも p + 1 でなくて + 2 ?

    204         /* Get the address part of the current path component. The
    205          * last component of the canonical bootpath may have no
    206          * address (eg, "disk"), in which case we need to get the
    207          * address from the original bootpath instead.
    208          */
    209         p = strchr(cp, '@');
    210         if (!p) {
    211                 if (bp)
    212                         p = strchr(bp, '@');
    213                 if (!p)
    214                         addr = 0;
    215                 else {  
    216                         addr = strtoul(p + 1, NULL, 16);
    217                         p = NULL;
    218                 }
    219         } else 
    220                 addr = strtoul(p + 1, &p, 16);
---
(藤原)
http://www.ki.nu/software/NetBSD/iBook2/
--- sys/arch/macppc/macppc/autoconf.c-ooo	Sun Jul 22 20:29:47 2001
+++ sys/arch/macppc/macppc/autoconf.c	Fri Aug 17 17:45:54 2001
@@ -142,6 +142,10 @@
 	 *
 	 * The last component may have no address... so append it.
 	 */
+#if 0
+	printf("\n -- cbootpath(%s)\n -- bootpath(%s)\n -- last(%s)\n",
+	       cbootpath,bootpath,last);
+#endif
 	p = strrchr(cbootpath, '/');
 	if (p != NULL && strchr(p, '@') == NULL) {
 		/* Append it. */
@@ -219,6 +223,9 @@
 	} else
 		addr = strtoul(p + 1, &p, 16);
 
+#if 1
+	printf("\n -- addr(%x)\n -- p(%s)\n",(int) addr, p);
+#endif	
 	if (DEVICE_IS(dev->dv_parent, "mainbus")) {
 		struct confargs *ca = aux;
 
@@ -262,9 +269,17 @@
 			return;
 	} else if (DEVICE_IS(dev->dv_parent, "wdc")) {
 		struct ata_atapi_attach *aa = aux;
+#if 1
+		printf("\n -- dv_xname(%s)\n -- cp (%s)\n -- bp (%s)\n",
+		       dev->dv_xname,cp,bp);
+#endif		
 
 		if (addr != aa->aa_channel)
+		  {
+		  printf("\n -- addr(%x) aa_channel(%x) does not match, returning.\n",
+			 (int) addr, aa->aa_channel );
 			return;
+		  }
 	} else
 		return;