From owner-svn-src-all@FreeBSD.ORG Wed Mar 14 13:08:17 2012 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 6A8E5106566B; Wed, 14 Mar 2012 13:08:17 +0000 (UTC) (envelope-from marius@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 3CDDE8FC19; Wed, 14 Mar 2012 13:08:17 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q2ED8HME014855; Wed, 14 Mar 2012 13:08:17 GMT (envelope-from marius@svn.freebsd.org) Received: (from marius@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q2ED8HcB014853; Wed, 14 Mar 2012 13:08:17 GMT (envelope-from marius@svn.freebsd.org) Message-Id: <201203141308.q2ED8HcB014853@svn.freebsd.org> From: Marius Strobl Date: Wed, 14 Mar 2012 13:08:17 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-releng@freebsd.org X-SVN-Group: releng MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r232965 - in releng/8.3/sys: boot/common i386/conf X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 14 Mar 2012 13:08:17 -0000 Author: marius Date: Wed Mar 14 13:08:16 2012 New Revision: 232965 URL: http://svn.freebsd.org/changeset/base/232965 Log: MFC: r232822 Fix a bug introduced in r223938 (MFC'ed to stable/8 in r224411); on big-endian machines coping a 32-bit quantum bytewise to the address of a 64-bit variable results in writing to the "wrong" 32-bit half so adjust the address accordingly. This fix is implemented in a hackish way for two reasons: o in order to be able to get it into 8.3 with zero impact on the little- endian architectures where this bug has no effect and o to avoid blowing the x86 boot2 out of the water again when compiling it with clang, which all sane versions of this fix tested do. This change fixes booting from UFS1 file systems on big-endian machines. Approved by: re (kib) Modified: releng/8.3/sys/boot/common/ufsread.c Directory Properties: releng/8.3/sys/ (props changed) releng/8.3/sys/amd64/include/xen/ (props changed) releng/8.3/sys/boot/ (props changed) releng/8.3/sys/cddl/contrib/opensolaris/ (props changed) releng/8.3/sys/contrib/dev/acpica/ (props changed) releng/8.3/sys/contrib/pf/ (props changed) releng/8.3/sys/dev/e1000/ (props changed) releng/8.3/sys/i386/conf/XENHVM (props changed) Modified: releng/8.3/sys/boot/common/ufsread.c ============================================================================== --- releng/8.3/sys/boot/common/ufsread.c Wed Mar 14 10:10:15 2012 (r232964) +++ releng/8.3/sys/boot/common/ufsread.c Wed Mar 14 13:08:16 2012 (r232965) @@ -46,6 +46,8 @@ #include __FBSDID("$FreeBSD$"); +#include + #include #include #include @@ -262,15 +264,28 @@ fsread(ino_t inode, void *buf, size_t nb } n = (lbn - NDADDR) & (n - 1); #if defined(UFS1_ONLY) +#if BYTE_ORDER == BIG_ENDIAN + memcpy((char *)&addr + sizeof(addr) - + sizeof(ufs1_daddr_t), (ufs1_daddr_t *)indbuf + n, + sizeof(ufs1_daddr_t)); +#else memcpy(&addr, (ufs1_daddr_t *)indbuf + n, sizeof(ufs1_daddr_t)); +#endif #elif defined(UFS2_ONLY) memcpy(&addr, (ufs2_daddr_t *)indbuf + n, sizeof(ufs2_daddr_t)); #else if (fs.fs_magic == FS_UFS1_MAGIC) +#if BYTE_ORDER == BIG_ENDIAN + memcpy((char *)&addr + sizeof(addr) - + sizeof(ufs1_daddr_t), + (ufs1_daddr_t *)indbuf + n, + sizeof(ufs1_daddr_t)); +#else memcpy(&addr, (ufs1_daddr_t *)indbuf + n, sizeof(ufs1_daddr_t)); +#endif else memcpy(&addr, (ufs2_daddr_t *)indbuf + n, sizeof(ufs2_daddr_t));