svn commit: r232962 - in stable/9/sys: boot/common i386/conf
Marius Strobl
marius at FreeBSD.org
Wed Mar 14 10:02:36 UTC 2012
Author: marius
Date: Wed Mar 14 10:02:35 2012
New Revision: 232962
URL: http://svn.freebsd.org/changeset/base/232962
Log:
MFC: r232822
Fix a bug introduced in r223938; 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.
Modified:
stable/9/sys/boot/common/ufsread.c
Directory Properties:
stable/9/sys/ (props changed)
stable/9/sys/amd64/include/xen/ (props changed)
stable/9/sys/boot/ (props changed)
stable/9/sys/boot/i386/efi/ (props changed)
stable/9/sys/boot/ia64/efi/ (props changed)
stable/9/sys/boot/ia64/ski/ (props changed)
stable/9/sys/boot/powerpc/boot1.chrp/ (props changed)
stable/9/sys/boot/powerpc/ofw/ (props changed)
stable/9/sys/cddl/contrib/opensolaris/ (props changed)
stable/9/sys/conf/ (props changed)
stable/9/sys/contrib/dev/acpica/ (props changed)
stable/9/sys/contrib/octeon-sdk/ (props changed)
stable/9/sys/contrib/pf/ (props changed)
stable/9/sys/contrib/x86emu/ (props changed)
stable/9/sys/i386/conf/XENHVM (props changed)
Modified: stable/9/sys/boot/common/ufsread.c
==============================================================================
--- stable/9/sys/boot/common/ufsread.c Wed Mar 14 09:44:46 2012 (r232961)
+++ stable/9/sys/boot/common/ufsread.c Wed Mar 14 10:02:35 2012 (r232962)
@@ -46,6 +46,8 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <sys/endian.h>
+
#include <ufs/ufs/dinode.h>
#include <ufs/ufs/dir.h>
#include <ufs/ffs/fs.h>
@@ -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));
More information about the svn-src-stable-9
mailing list