boot - Hack workarounds for chromebook 'SeaBIOS' issues
[dragonfly.git] / sys / boot / pc32 / libi386 / biosdisk.c
index 8e47f3f..c3b1271 100644 (file)
@@ -24,7 +24,6 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/boot/i386/libi386/biosdisk.c,v 1.45 2004/09/21 06:46:44 wes Exp $
- * $DragonFly: src/sys/boot/pc32/libi386/biosdisk.c,v 1.12 2007/06/18 05:13:42 dillon Exp $
  */
 
 /*
@@ -383,6 +382,7 @@ print_partition(u_int8_t fstype, unsigned long long offset,
        if ((fstype == FS_SWAP) ||
            (fstype == FS_VINUM) ||
            (fstype == FS_HAMMER) ||
+           (fstype == FS_HAMMER2) ||
            (fstype == FS_BSDFFS) ||
            (fstype == FS_ZFS) ||
            (fstype == FS_JFS2) ||
@@ -399,6 +399,7 @@ print_partition(u_int8_t fstype, unsigned long long offset,
                            (fstype == FS_SWAP) ? "swap" :
                            (fstype == FS_VINUM) ? "vinum" :
                            (fstype == FS_HAMMER) ? "HAMMER" :
+                           (fstype == FS_HAMMER2) ? "HAMMER2" :
                            (fstype == FS_JFS2) ? "JFS2" :
                            (fstype == FS_ZFS) ? "ZFS" :
                            (fstype == FS_BSDFFS) ? "FFS" :
@@ -415,6 +416,7 @@ print_partition(u_int8_t fstype, unsigned long long offset,
                            (fstype == FS_SWAP) ? "swap" :
                            (fstype == FS_VINUM) ? "vinum" :
                            (fstype == FS_HAMMER) ? "HAMMER" :
+                           (fstype == FS_HAMMER2) ? "HAMMER2" :
                            (fstype == FS_JFS2) ? "JFS2" :
                            (fstype == FS_ZFS) ? "ZFS" :
                            (fstype == FS_BSDFFS) ? "FFS" :
@@ -660,7 +662,7 @@ bd_opendisk(struct open_disk **odp, struct i386_devdesc *dev)
     if ((dptr->dp_typ == DOSPTYP_386BSD) && (dev->d_kind.biosdisk.partition < 0))
        dev->d_kind.biosdisk.partition = 0;
 
- unsliced:
+unsliced:
     /* 
      * Now we have the slice offset, look for the partition in the disklabel if we have
      * a partition to start with.
@@ -1013,24 +1015,32 @@ bd_read(struct open_disk *od, daddr_t dblk, int blks, caddr_t dest)
     resid = blks;
     p = dest;
 
-    /* Decide whether we have to bounce */
+    /*
+     * Decide whether we have to bounce.
+     *
+     * We have to bounce if the destination buffer is not segment addressable
+     * or if it crosses a 64KB boundary.
+     */
     if ((od->od_unit < 0x80) && 
-       ((VTOP(dest) >> 16) != (VTOP(dest + blks * BIOSDISK_SECSIZE) >> 16))) {
+       (VTOP(dest + blks * BIOSDISK_SECSIZE) >= 16384 * 1024 ||
+        ((VTOP(dest) >> 16) != (VTOP(dest + blks * BIOSDISK_SECSIZE) >> 16)))
+     ) {
 
        /* 
-        * There is a 64k physical boundary somewhere in the destination buffer, so we have
-        * to arrange a suitable bounce buffer.  Allocate a buffer twice as large as we
-        * need to.  Use the bottom half unless there is a break there, in which case we
-        * use the top half.
+        * There is a 64k physical boundary somewhere in the destination
+        * buffer, so we have to arrange a suitable bounce buffer.  Allocate
+        * a buffer twice as large as we need to.  Use the bottom half unless
+        * there is a break there, in which case we use the top half.
         */
        x = min(FLOPPY_BOUNCEBUF, (unsigned)blks);
        bbuf = malloc(x * 2 * BIOSDISK_SECSIZE);
-       if (((u_int32_t)VTOP(bbuf) & 0xffff0000) == ((u_int32_t)VTOP(bbuf + x * BIOSDISK_SECSIZE) & 0xffff0000)) {
+       if (((u_int32_t)VTOP(bbuf) & 0xffff0000) ==
+           ((u_int32_t)VTOP(bbuf + x * BIOSDISK_SECSIZE) & 0xffff0000)) {
            breg = bbuf;
        } else {
            breg = bbuf + x * BIOSDISK_SECSIZE;
        }
-       maxfer = x;                     /* limit transfers to bounce region size */
+       maxfer = x;             /* limit transfers to bounce region size */
     } else {
        breg = bbuf = NULL;
        maxfer = 0;
@@ -1115,7 +1125,7 @@ bd_read(struct open_disk *od, daddr_t dblk, int blks, caddr_t dest)
            }
        }
        
-       DEBUG("%d sectors from %d/%d/%d to %p (0x%x) %s", x, cyl, hd, sec - 1, p, VTOP(p), result ? "failed" : "ok");
+       DEBUG("%u sectors from %u/%u/%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);
@@ -1157,10 +1167,10 @@ bd_write(struct open_disk *od, daddr_t dblk, int blks, caddr_t dest)
        ((VTOP(dest) >> 16) != (VTOP(dest + blks * BIOSDISK_SECSIZE) >> 16))) {
 
        /* 
-        * There is a 64k physical boundary somewhere in the destination buffer, so we have
-        * to arrange a suitable bounce buffer.  Allocate a buffer twice as large as we
-        * need to.  Use the bottom half unless there is a break there, in which case we
-        * use the top half.
+        * There is a 64k physical boundary somewhere in the destination
+        * buffer, so we have to arrange a suitable bounce buffer.  Allocate
+        * a buffer twice as large as we need to.  Use the bottom half
+        * unless there is a break there, in which case we use the top half.
         */
 
        x = min(FLOPPY_BOUNCEBUF, (unsigned)blks);
@@ -1266,7 +1276,7 @@ bd_write(struct open_disk *od, daddr_t dblk, int blks, caddr_t dest)
            }
        }
        
-       DEBUG("%d sectors from %d/%d/%d to %p (0x%x) %s", x, cyl, hd, sec - 1, p, VTOP(p), result ? "failed" : "ok");
+       DEBUG("%u sectors from %u/%u/%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);