Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 27 Mar 2000 21:07:33 +0900
From:      Motomichi Matsuzaki <mzaki@e-mail.ne.jp>
To:        FreeBSD-current@FreeBSD.ORG
Subject:   Please test for 8G-OVER-Booting with /boot/loader
Message-ID:  <86n1nkvcoq.wl@tkc.att.ne.jp>

next in thread | raw e-mail | index | archive | help
--Multipart_Mon_Mar_27_21:07:33_2000-1
Content-Type: text/plain; charset=US-ASCII


Hi.

I made a patch for /sys/boot/i386/libi386/biosdisk.c (attached).
This aimed to enable /boot/loader to manage 8G-OVER-Disks.

0. you need 8G-OVER-ENABLED BIOS for your motherboard
   (check whether your BIOS has Int 13 Extended Interface)

1. teach boot0 using extended BIOS (See boot0cfg(8))

    # boot0cfg -o packet YOUR-BOOT-DEVICE

2. install boot2 which have extended BIOS support

    # cd /sys/boot/i386/boot2; make B1FLAGS=0x80 clean install

3. patch to libi386 and install new /boot/loader

    # cd /sys/boot/i386/libi386/; patch <THIS-MAIL; make
    # cd /sys/boot/i386/loader; make install


-- 
Motomichi Matsuzaki <mzaki@e-mail.ne.jp> 
Dept. of Biological Science, Faculty of Sciences, Univ. of Tokyo, Japan 


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

--- biosdisk.c	Thu Mar 16 01:36:55 2000
+++ biosdisk.c.new	Mon Mar 27 20:50:38 2000
@@ -74,7 +74,7 @@
     int			od_flags;
 #define	BD_MODEMASK	0x3
 #define BD_MODEINT13	0x0
-#define BD_MODEEDD1	0x1
+#define BD_MODEPACKET	0x1
 #define BD_MODEEDD3	0x2
 #define BD_FLOPPY	(1<<2)
     struct disklabel		od_disklabel;
@@ -166,13 +166,13 @@
 	    bdinfo[nbdinfo].bd_unit = unit;
 	    bdinfo[nbdinfo].bd_flags = (unit < 0x80) ? BD_FLOPPY : 0;
 
-	    /* XXX add EDD probes */
 	    if (!bd_int13probe(&bdinfo[nbdinfo]))
 		break;
 
 	    /* XXX we need "disk aliases" to make this simpler */
-	    printf("BIOS drive %c: is disk%d\n", 
-		   (unit < 0x80) ? ('A' + unit) : ('C' + unit - 0x80), nbdinfo);
+	    printf("BIOS drive %c: is disk%d%s\n", 
+		   (unit < 0x80) ? ('A' + unit) : ('C' + unit - 0x80), nbdinfo,
+		   (bdinfo[nbdinfo].bd_flags & BD_MODEPACKET) ? " (LBA)" : "");
 	    nbdinfo++;
 	}
     }
@@ -180,7 +180,7 @@
 }
 
 /*
- * Try to detect a device supported by the legacy int13 BIOS
+ * Try to detect a device supported by the int13 BIOS
  */
 
 static int
@@ -197,6 +197,26 @@
 	((v86.edx & 0xff) > (bd->bd_unit & 0x7f))) {	/* unit # OK */
 	bd->bd_flags |= BD_MODEINT13;
 	bd->bd_type = v86.ebx & 0xff;
+
+	/* LBA support by Motomichi Matsuzaki <mzaki@e-mail.ne.jp> */
+
+	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 */
+	    }
+	}
+
 	return(1);
     }
     return(0);
@@ -624,6 +644,15 @@
 /* Max number of sectors to bounce-buffer if the request crosses a 64k boundary */
 #define FLOPPY_BOUNCEBUF	18
 
+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;
+};
+
 static int
 bd_read(struct open_disk *od, daddr_t dblk, int blks, caddr_t dest)
 {
@@ -685,25 +714,44 @@
 		v86.edx = od->od_unit;
 		v86int();
 	    }
-	    
-	    /* build request  XXX support EDD requests too */
-	    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();
+
+	    /* 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;
 	}
 	
- 	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);
+	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);
+	}
 	if (result) {
 	    if (bbuf != NULL)
 		free(bbuf);

--Multipart_Mon_Mar_27_21:07:33_2000-1--


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?86n1nkvcoq.wl>