Author: tkreuzer
Date: Sat Aug 20 21:20:33 2011
New Revision: 53348
URL:
http://svn.reactos.org/svn/reactos?rev=53348&view=rev
Log:
[VFATLIB]
Fix completely non-standard, broken and retarded definition of GET_UNALIGNED_W for 64 bit
architectures
The function is supposed to read an unaligned little endian USHORT value. The old version
copied the 2 bytes with memcpy to an aligned stack variable and then (bug bug) read the
unaligned value directly (discarding the result of the previous operation) and passed it
to bswap if neccessary.
The new function simply reads the 2 bytes and combines them using << and |.
Modified:
trunk/reactos/lib/fslib/vfatlib/check/boot.c
Modified: trunk/reactos/lib/fslib/vfatlib/check/boot.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/fslib/vfatlib/check/bo…
==============================================================================
--- trunk/reactos/lib/fslib/vfatlib/check/boot.c [iso-8859-1] (original)
+++ trunk/reactos/lib/fslib/vfatlib/check/boot.c [iso-8859-1] Sat Aug 20 21:20:33 2011
@@ -30,18 +30,17 @@
{ 0xff, "5.25\" 320k floppy 2s/40tr/8sec" },
};
-#if defined __alpha || defined __ia64__ || defined __s390x__ || defined __x86_64__ ||
defined __ppc64__
-/* Unaligned fields must first be copied byte-wise */
-#define GET_UNALIGNED_W(f) \
- ({ \
- unsigned short __v; \
- memcpy( &__v, &f, sizeof(__v) ); \
- CF_LE_W( *(unsigned short *)&f ); \
- })
+#if defined __alpha || defined __ia64__ || defined __x86_64__ || defined __ppc64__
+/* Unaligned fields must first be copied byte-wise (little endian) */
+#define GET_UNALIGNED_W(u) \
+ (((unsigned char*)(&u))[0] | (((unsigned char*)&(u))[1] << 8))
+#elif defined __s390x__
+/* Unaligned fields must first be copied byte-wise (big endian) */
+#define GET_UNALIGNED_W(pu) \
+ (((unsigned char*)&(u))[1] | (((unsigned char*)&(u))[0] << 8))
#else
#define GET_UNALIGNED_W(f) CF_LE_W( *(unsigned short *)&f )
#endif
-
static char *get_media_descr( unsigned char media )
{