From owner-FreeBSD-users-jp@jp.freebsd.org  Thu Mar 23 06:52:55 2000
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id GAA62490;
	Thu, 23 Mar 2000 06:52:55 +0900 (JST)
	(envelope-from owner-FreeBSD-users-jp@jp.FreeBSD.org)
Received: from tkc.att.ne.jp (tkc.att.ne.jp [165.76.16.7])
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) with ESMTP id GAA62485
	for <FreeBSD-users-jp@jp.freebsd.org>; Thu, 23 Mar 2000 06:52:55 +0900 (JST)
	(envelope-from mzaki@e-mail.ne.jp)
Received: from work.mzaki.nom (23.pool5.tokyo.att.ne.jp [165.76.22.38]) by tkc.att.ne.jp (8.8.8+Spin/3.6W-CONS(10/24/99)) id GAA13718; Thu, 23 Mar 2000 06:52:53 +0900 (JST)
Received: from work.mzaki.nom (mzaki@localhost [127.0.0.1])
	by work.mzaki.nom (8.9.3/8.9.3) with ESMTP id GAA00425
	for <FreeBSD-users-jp@jp.freebsd.org>; Thu, 23 Mar 2000 06:52:52 +0900 (JST)
	(envelope-from mzaki@e-mail.ne.jp)
Date: Thu, 23 Mar 2000 06:52:51 +0900
Message-ID: <86vh2evfik.wl@tkc.att.ne.jp>
From: Motomichi Matsuzaki <mzaki@e-mail.ne.jp>
To: FreeBSD-users-jp@jp.freebsd.org
In-Reply-To: In your message of "Thu, 23 Mar 2000 02:03:39 +0900"
	<20000323020339X.nakagawa@kansai.oki.co.jp>
References: <38D7D14E0.267DSHO-RED@ff.iij4u.or.jp>
	<86pusoozkw.wl@tkc.att.ne.jp>
	<38D8DFAE0.267ESHO-RED@ff.iij4u.or.jp>
	<20000323020339X.nakagawa@kansai.oki.co.jp>
X-Mailer: Wanderlust/2.2.12 (Joyride) XEmacs/21.1 (Bryce Canyon)
MIME-Version: 1.0 (generated by WEMI 1.13.7 - "Shimada")
Content-Type: multipart/mixed;
 boundary="Multipart_Thu_Mar_23_06:52:50_2000-1"
Reply-To: FreeBSD-users-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+000315
X-Sequence: FreeBSD-users-jp 50730
Subject: [FreeBSD-users-jp 50730] Re: Booteasy
 =?ISO-2022-JP?B?GyRCJEdCPiROGyhC?= OS
 =?ISO-2022-JP?B?GyRCJCw1L0YwJEckLSReJDskcyEjGyhC?=
Errors-To: owner-FreeBSD-users-jp@jp.freebsd.org
Sender: owner-FreeBSD-users-jp@jp.freebsd.org
X-Originator: mzaki@e-mail.ne.jp

--Multipart_Thu_Mar_23_06:52:50_2000-1
Content-Type: text/plain; charset=ISO-2022-JP


$B>>:j$G$9!#(B

At Thu, 23 Mar 2000 02:03:39 +0900,
Satoshi Nakagawa <nakagawa@kansai.oki.co.jp> wrote:
> $B$G!"9T$1$?$s$G$9$,!"(B/boot/loader $B$N(B LBA $B%5%]!<%H$,$^$@$N$h$&$G!"(B
> /boot.config $B$K(B /kernel $B$H=q$$$F(B /boot/loader $B$r;H$o$J$/$7$F!"$J$s$H$+(B
> boot $B$G$-$^$7$?!#(B
> # $BC/$+!"(B/sys/boot/i386/libi386/biosdisk.c $B$N%Q%C%A:n$C$F$/$l!A(B


$B4JC1$=$&$@$C$?$N$G(B -current $B$X$N%Q%C%A$r:n$C$F$_$^$7$?!#(B
$BE:IU$N$G$$$+$,$G$7$g$&!)(B


$B$H$3$m$G!#(B

$B$3$N(B disk address packet $B$r;H$C$F(B LBA $B$G%"%/%;%9$9$k(B
$B3HD%$5$l$?(B BIOS $B$N%]%T%e%i!<$JL>>N$C$F$J$s$G$7$g$&!D!)(B

Interrupt List $B$K$O!"(B extended disk access functions $B$H$7$+=q$$$F$J$$!#(B

biosdisk.c $B$N%3%a%s%H$@$H!"(B EDD (Enhanced Disk Drive) $B$H$$$&$N$,(B
$B$"$j$^$9$1$I!"$3$l$O$b$C$H9-$$0UL#$J5$$,$9$k!#(B
LILO ver22 $B$b(B option edd $B$C$F=q$$$F$"$k$1$I!D!#(B

-- 
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
|  $B>>:j(B $BAGF;(B (Motomichi Matsuzaki/maki)     $BEl5~Bg3XM}3XIt@8J*3X2J#4G/(B  |
|  mailto:mzaki@e-mail.ne.jp                    $B:YK&@8M}2=3X8&5f<<=jB0(B  |
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+


--Multipart_Thu_Mar_23_06:52:50_2000-1
Content-Type: application/octet-stream; type=patch
Content-Disposition: attachment; filename="biosdisk.c.diff"
Content-Transfer-Encoding: 7bit

--- biosdisk.c.orig	Thu Mar 16 01:36:55 2000
+++ biosdisk.c	Thu Mar 23 06:22:49 2000
@@ -48,6 +48,9 @@
 #include <btxv86.h>
 #include "libi386.h"
 
+/* LBA support by Motomichi Matsuzaki <mzaki@e-mail.ne.jp> */
+#define BIOSDISK_LBA
+
 #define BIOSDISK_SECSIZE	512
 #define BUFSIZE			(1 * BIOSDISK_SECSIZE)
 #define	MAXBDDEV		MAXDEV
@@ -74,7 +77,11 @@
     int			od_flags;
 #define	BD_MODEMASK	0x3
 #define BD_MODEINT13	0x0
+#ifdef BIOSDISK_LBA
+#define BD_MODEPACKET	0x1
+#else /* BIOSDISK_LBA */
 #define BD_MODEEDD1	0x1
+#endif /* BIOSDISK_LBA */
 #define BD_MODEEDD3	0x2
 #define BD_FLOPPY	(1<<2)
     struct disklabel		od_disklabel;
@@ -171,8 +178,14 @@
 		break;
 
 	    /* XXX we need "disk aliases" to make this simpler */
+#ifdef BIOSDISK_LBA
+	    printf("BIOS drive %c: is disk%d%s\n", 
+		   (unit < 0x80) ? ('A' + unit) : ('C' + unit - 0x80), nbdinfo,
+		   (bdinfo[nbdinfo].bd_flags & BD_MODEPACKET) ? " (LBA)" : "");
+#else /* BIOSDISK_LBA */
 	    printf("BIOS drive %c: is disk%d\n", 
 		   (unit < 0x80) ? ('A' + unit) : ('C' + unit - 0x80), nbdinfo);
+#endif /* BIOSDISK_LBA */
 	    nbdinfo++;
 	}
     }
@@ -197,6 +210,26 @@
 	((v86.edx & 0xff) > (bd->bd_unit & 0x7f))) {	/* unit # OK */
 	bd->bd_flags |= BD_MODEINT13;
 	bd->bd_type = v86.ebx & 0xff;
+
+#ifdef BIOSDISK_LBA
+	v86.ctl = V86_FLAGS;
+	v86.addr = 0x13;
+	v86.eax = 0x4100;
+	v86.ebx = 0x55AA;
+	v86.edx = bd->bd_unit;
+	v86int();
+
+	if (!(v86.efl & 0x1) &&				/* carry clear */
+	    (v86.ebx & 0xffff) == 0xAA55) {		/* magic OK */
+	    if ((v86.eax & 0xf000) >= 0x3000) {
+		bd->bd_flags |= BD_MODEEDD3;		/* meanless? */
+	    }
+	    if (v86.ecx & 0x1) {
+		bd->bd_flags |= BD_MODEPACKET;		/* packet access */
+	    }
+	}
+#endif /* BIOSDISK_LBA */
+
 	return(1);
     }
     return(0);
@@ -624,6 +657,17 @@
 /* Max number of sectors to bounce-buffer if the request crosses a 64k boundary */
 #define FLOPPY_BOUNCEBUF	18
 
+#ifdef BIOSDISK_LBA
+struct lba_packet {
+    u_int8_t	len;
+    u_int8_t	rsrv;
+    u_int16_t	blks;
+    u_int16_t	offs;
+    u_int16_t	seg;
+    u_int64_t	blkno;
+};
+#endif /* BIOSDISK_LBA */
+
 static int
 bd_read(struct open_disk *od, daddr_t dblk, int blks, caddr_t dest)
 {
@@ -685,7 +729,33 @@
 		v86.edx = od->od_unit;
 		v86int();
 	    }
-	    
+
+#ifdef BIOSDISK_LBA
+	    /* build request */
+	    if (od->od_flags & BD_MODEPACKET) {
+		struct lba_packet pkt
+		    = {sizeof(pkt), 0, x, VTOPOFF(xp), VTOPSEG(xp), dblk};
+		v86.ctl = V86_FLAGS;
+		v86.addr = 0x13;
+		v86.eax = 0x4200;
+		v86.edx = od->od_unit;
+		v86.ds = VTOPSEG(&pkt);
+		v86.esi = VTOPOFF(&pkt);
+		v86int();
+	    } else {
+		v86.ctl = V86_FLAGS;
+		v86.addr = 0x13;
+		v86.eax = 0x200 | x;
+		v86.ecx = ((cyl & 0xff) << 8) | ((cyl & 0x300) >> 2) | sec;
+		v86.edx = (hd << 8) | od->od_unit;
+		v86.es = VTOPSEG(xp);
+		v86.ebx = VTOPOFF(xp);
+		v86int();
+	    }	    
+	    result = (v86.efl & 0x1);
+	    if (result == 0)
+		break;
+#else /* BIOSDISK_LBA */
 	    /* build request  XXX support EDD requests too */
 	    v86.ctl = V86_FLAGS;
 	    v86.addr = 0x13;
@@ -698,12 +768,27 @@
 	    result = (v86.efl & 0x1);
 	    if (result == 0)
 		break;
+#endif /* BIOSDISK_LBA */
 	}
 	
+#ifdef BIOSDISK_LBA
+	if (od->od_flags & BD_MODEPACKET) {
+	    DEBUG("%d sectors from %d to %p (0x%x) %s",
+		  x, dblk, p, VTOP(p), result ? "failed" : "ok");
+	} else {
+	    DEBUG("%d sectors from %d/%d/%d to %p (0x%x) %s",
+		  x, cyl, hd, sec - 1, p, VTOP(p), result ? "failed" : "ok");
+	    /* BUG here, cannot use v86 in printf because putchar uses it too */
+	    DEBUG("ax = 0x%04x cx = 0x%04x dx = 0x%04x status 0x%x", 
+		  0x200 | x, ((cyl & 0xff) << 8) | ((cyl & 0x300) >> 2) | sec,
+		  (hd << 8) | od->od_unit, (v86.eax >> 8) & 0xff);
+	}
+#else /* BIOSDISK_LBA */
  	DEBUG("%d sectors from %d/%d/%d to %p (0x%x) %s", x, cyl, hd, sec - 1, p, VTOP(p), result ? "failed" : "ok");
 	/* BUG here, cannot use v86 in printf because putchar uses it too */
 	DEBUG("ax = 0x%04x cx = 0x%04x dx = 0x%04x status 0x%x", 
 	      0x200 | x, ((cyl & 0xff) << 8) | ((cyl & 0x300) >> 2) | sec, (hd << 8) | od->od_unit, (v86.eax >> 8) & 0xff);
+#endif /* BIOSDISK_LBA */
 	if (result) {
 	    if (bbuf != NULL)
 		free(bbuf);

--Multipart_Thu_Mar_23_06:52:50_2000-1--
