From owner-FreeBSD-tech-jp@jp.freebsd.org  Fri Feb  9 07:01:14 2001
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id HAA62874;
	Fri, 9 Feb 2001 07:01:14 +0900 (JST)
	(envelope-from owner-FreeBSD-tech-jp@jp.FreeBSD.org)
Received: from rcpt-expgw.biglobe.ne.jp (rcpt-expgw.biglobe.ne.jp [210.147.6.232])
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) with ESMTP id HAA62866
	for <FreeBSD-tech-jp@jp.freebsd.org>; Fri, 9 Feb 2001 07:01:12 +0900 (JST)
	(envelope-from thasegawa@mta.biglobe.ne.jp)
Received: from smtp-gw.biglobe.ne.jp
	by rcpt-expgw.biglobe.ne.jp (8.9.3+3.2W/3.7W-01020609) with ESMTP id HAA05871
	for <FreeBSD-tech-jp@jp.freebsd.org>; Fri, 9 Feb 2001 07:01:11 +0900 (JST)
X-Biglobe-Sender: <thasegawa@mta.biglobe.ne.jp>
Received: from ngy115DS36.aic.mesh.ad.jp (133.205.105.82 [133.205.105.82]) by smtp-gw.biglobe.ne.jp
	id HCLDC0A8269E; Fri, 09 Feb 2001 07:01:10 +0900 (JST)
Received: (qmail 940 invoked from network); 8 Feb 2001 12:40:47 -0000
Received: from localhost (127.0.0.1)
  by localhost with SMTP; 8 Feb 2001 12:40:47 -0000
Date: Thu, 08 Feb 2001 21:40:47 +0900 (JST)
Message-Id: <20010208.214047.107005607.thasegawa@mta.biglobe.ne.jp>
To: FreeBSD-tech-jp@jp.freebsd.org
From: HASEGAWA Tomoki <thasegawa@mta.biglobe.ne.jp>
X-Mailer: Mew version 1.95b101 on Emacs 20.7 / Mule 4.1 (AOI)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
Reply-To: FreeBSD-tech-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+000315
X-Sequence: FreeBSD-tech-jp 3025
Subject: [FreeBSD-tech-jp 3025] boot from extended partition
Errors-To: owner-FreeBSD-tech-jp@jp.freebsd.org
Sender: owner-FreeBSD-tech-jp@jp.freebsd.org
X-Originator: thasegawa@mta.biglobe.ne.jp

$B$I$b!"D9C+@n$G$9!#(B

$B$U$H$*$b$$$?$C$F!"3HD%%Q!<%F%#%7%g%s$K%$%s%9%H!<%k$7$F$_$?$N$G$9$,!"(B
/boot/loader $B$,3HD%%Q!<%F%#%7%g%s$rG'<1$7$F$/$l$J$/$F%V!<%H$G$-$^$;$s(B
$B$G$7$?!#(BGNU GRUB$B$G(Bkernel$B$rD>@\%m!<%I$9$k$H$&$4$/$N$G$9$,!"(B-a$B$r$o$?$7$F(B
$B$$$A$$$A(Broot $B%Q!<%F%#%7%g%s$r;XDj$7$F$d$i$J$$$H$@$a$J$N$G!"(Bloader$B$NJ}(B
$B$r$$$8$C$F$_$($k$h$&$K$7$F$_$^$7$?!#(B

#1$BHVL\$N3HD%%Q!<%F%#%7%g%s(B(s5)$B$O(Bloader$B$+$i$_$($k$N$G$=$3$K%$%s%9%H!<%k(B
$B$7$F$$$l$PA4A35$$K$;$:$G$-$F$7$^$C$F$$$?$N$+$b$7$l$^$;$s$,!#(B

/sys/kern/subr_diskmbr.c$B$r;29M$K!"3HD%%Q!<%F%#%7%g%s$N$"$D$+$$$r$J$*$7(B
$B$?$N$G$9$,!"$3$s$J$b$s$G$$$$$s$G$7$g$&$+$M!#(Bsubr_diskmbr.c$B$NJ}$G$O$b$&(B
$B$A$g$C$H$J$s$+$d$C$F$k$_$?$$$G$9$,!#(B

Index: biosdisk.c
===================================================================
RCS file: /home/ncvs/src/sys/boot/i386/libi386/biosdisk.c,v
retrieving revision 1.26.2.6
diff -u -r1.26.2.6 biosdisk.c
--- biosdisk.c	2000/12/28 13:10:47	1.26.2.6
+++ biosdisk.c	2001/02/08 12:16:20
@@ -132,7 +132,7 @@
 static int	bd_opendisk(struct open_disk **odp, struct i386_devdesc *dev);
 static void	bd_closedisk(struct open_disk *od);
 static int	bd_bestslice(struct open_disk *od);
-static void	bd_checkextended(struct open_disk *od, int slicenum);
+static void	bd_checkextended(struct open_disk *od, int slicenum, int basenum);
 
 /*
  * Translate between BIOS device numbers and our private unit numbers.
@@ -512,7 +512,7 @@
       sizeof(struct dos_partition) * NDOSPART);
     od->od_nslices = 4;			/* extended slices start here */
     for (i = 0; i < NDOSPART; i++)
-        bd_checkextended(od, i);
+        bd_checkextended(od, i, i);
     od->od_flags |= BD_PARTTABOK;
     dptr = &od->od_slicetab[0];
 
@@ -624,12 +624,12 @@
 }
 
 static void
-bd_checkextended(struct open_disk *od, int slicenum)
+bd_checkextended(struct open_disk *od, int slicenum, int basenum)
 {
 	char	buf[BIOSDISK_SECSIZE];
 	struct dos_partition *dp;
 	u_int base;
-	int i, start, end;
+	int i, start;
 
 	dp = &od->od_slicetab[slicenum];
 	start = od->od_nslices;
@@ -651,17 +651,21 @@
 			continue;
 		if (od->od_nslices == MAX_SLICES)
 			goto done;
-		dp->dp_start += base;
-		bcopy(dp, &od->od_slicetab[od->od_nslices], sizeof(*dp));
-		od->od_nslices++;
+		if (dp->dp_typ == DOSPTYP_EXT) {
+			dp->dp_start += od->od_slicetab[basenum].dp_start;;
+			bcopy(dp, &od->od_slicetab[od->od_nslices], sizeof(*dp));
+		} else {
+			dp->dp_start += base;
+			bcopy(dp, &od->od_slicetab[od->od_nslices], sizeof(*dp));
+			od->od_nslices++;
+		}
 	}
-	end = od->od_nslices;
 
 	/*
 	 * now, recursively check the slices we just added
 	 */
-	for (i = start; i < end; i++)
-		bd_checkextended(od, i);
+	for (i = start; i < start + NDOSPART; i++) 
+		bd_checkextended(od, i, basenum);
 done:
 	return;
 }

