aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarius Strobl <marius@FreeBSD.org>2012-03-14 13:08:16 +0000
committerMarius Strobl <marius@FreeBSD.org>2012-03-14 13:08:16 +0000
commitf57b9fbbd3558dfad6fee7ffea61726dfc19dd79 (patch)
tree4ed20db7568fc2560c0fa828ea09a991bce06a1d
parent16dc3d4688494efbd1be4d702cc96560779d4f3b (diff)
downloadsrc-f57b9fbbd3558dfad6fee7ffea61726dfc19dd79.tar.gz
src-f57b9fbbd3558dfad6fee7ffea61726dfc19dd79.zip
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)
Notes
Notes: svn path=/releng/8.3/; revision=232965
-rw-r--r--sys/boot/common/ufsread.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/sys/boot/common/ufsread.c b/sys/boot/common/ufsread.c
index b7677329b196..d87853fd227a 100644
--- a/sys/boot/common/ufsread.c
+++ b/sys/boot/common/ufsread.c
@@ -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 nbyte)
}
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));