Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 14 Nov 2012 11:05:16 +0000 (UTC)
From:      Andriy Gapon <avg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r243025 - head/sys/boot/i386/common
Message-ID:  <201211141105.qAEB5G85058137@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: avg
Date: Wed Nov 14 11:05:16 2012
New Revision: 243025
URL: http://svnweb.freebsd.org/changeset/base/243025

Log:
  boot: use packed attribute for edd_params* structures and their substructures
  
  The sole purpose of this change is to make sure that sizeof produces
  "canonical" sizes for these structures.  This is to avoid triggering
  bugs in the BIOSes that properly handle only the canonical values of
  input length provided to INT 13h AH=48h.
  The canonical sizes are: 30 for v2, 66 for v3, etc.
  Buggy BIOS code probably looks like:
  if (input_length > 30) {   /* > v2 */
  	assume that input length is 66 /* assume v3 or later */
  }
  
  This should fix boot problems at least on Supermicro X8DT6 and possibly
  on P410i Smart Array Controller (as found in e.g. HP DL360 G7).
  
  Reported by:	gnn, np, rstone
  Debugged by:	rstone
  Discussed with:	ae, np, rstone
  MFC after:	4 days

Modified:
  head/sys/boot/i386/common/edd.h

Modified: head/sys/boot/i386/common/edd.h
==============================================================================
--- head/sys/boot/i386/common/edd.h	Wed Nov 14 10:59:42 2012	(r243024)
+++ head/sys/boot/i386/common/edd.h	Wed Nov 14 11:05:16 2012	(r243025)
@@ -62,7 +62,7 @@ struct edd_params {
 	uint16_t	sector_size;
 	uint16_t	edd_params_seg;
 	uint16_t	edd_params_off;
-};
+} __packed;
 
 struct edd_device_path_v3 {
 	uint16_t	key;
@@ -74,12 +74,12 @@ struct edd_device_path_v3 {
 	uint64_t	device_path;
 	uint8_t		reserved2[1];
 	uint8_t		checksum;
-};
+} __packed;
 
 struct edd_params_v3 {
 	struct edd_params params;
 	struct edd_device_path_v3 device_path;
-};
+} __packed;
 
 struct edd_device_path_v4 {
 	uint16_t	key;
@@ -91,12 +91,12 @@ struct edd_device_path_v4 {
 	uint64_t	device_path[2];
 	uint8_t		reserved2[1];
 	uint8_t		checksum;
-};
+} __packed;
 
 struct edd_params_v4 {
 	struct edd_params params;
 	struct edd_device_path_v4 device_path;
-};
+} __packed;
 
 #define	EDD_FLAGS_DMA_BOUNDARY_HANDLING		0x0001
 #define	EDD_FLAGS_REMOVABLE_MEDIA		0x0002



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