Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 5 Apr 2018 00:41:33 +0000 (UTC)
From:      Kyle Evans <kevans@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r332056 - stable/11/stand/i386/libi386
Message-ID:  <201804050041.w350fXF1009884@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kevans
Date: Thu Apr  5 00:41:33 2018
New Revision: 332056
URL: https://svnweb.freebsd.org/changeset/base/332056

Log:
  MFC r331718: stand: Add workaround for HP BIOS issues
  
  hrs@ and kuriyama@ have found that on some HP BIOS, a system will fail to
  boot immediately after installation with the claim that it can't work out
  which disk they are booting from.
  
  They tracked it down to a buffer overrun, and found that it could be
  alleviated by doing a dummy read before-hand.

Modified:
  stable/11/stand/i386/libi386/biosdisk.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/stand/i386/libi386/biosdisk.c
==============================================================================
--- stable/11/stand/i386/libi386/biosdisk.c	Thu Apr  5 00:32:01 2018	(r332055)
+++ stable/11/stand/i386/libi386/biosdisk.c	Thu Apr  5 00:41:33 2018	(r332056)
@@ -122,6 +122,8 @@ static int nbdinfo = 0;
 
 #define	BD(dev)		(bdinfo[(dev)->d_unit])
 
+static void bd_io_workaround(struct disk_devdesc *dev);
+
 static int bd_read(struct disk_devdesc *dev, daddr_t dblk, int blks,
     caddr_t dest);
 static int bd_write(struct disk_devdesc *dev, daddr_t dblk, int blks,
@@ -726,6 +728,15 @@ bd_chs_io(struct disk_devdesc *dev, daddr_t dblk, int 
     return (0);
 }
 
+static void
+bd_io_workaround(struct disk_devdesc *dev)
+{
+	uint8_t buf[8 * 1024];
+
+	bd_edd_io(dev, 0xffffffff, 1, (caddr_t)buf, 0);
+}
+
+
 static int
 bd_io(struct disk_devdesc *dev, daddr_t dblk, int blks, caddr_t dest, int write)
 {
@@ -738,6 +749,17 @@ bd_io(struct disk_devdesc *dev, daddr_t dblk, int blks
 
     resid = blks;
     p = dest;
+
+    /*
+     * Workaround for a problem with some HP ProLiant BIOS failing to work out
+     * the boot disk after installation. hrs and kuriyama discovered this
+     * problem with an HP ProLiant DL320e Gen 8 with a 3TB HDD, and discovered
+     * that an int13h call seems to cause a buffer overrun in the bios. The
+     * problem is alleviated by doing an extra read before the buggy read. It
+     * is not immediately known whether other models are similarly affected.
+     */
+    if (dblk >= 0x100000000)
+	bd_io_workaround(dev);
 
     /* Decide whether we have to bounce */
     if (VTOP(dest) >> 20 != 0 || (BD(dev).bd_unit < 0x80 &&



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