diff --git a/dosfstools-2.11-unaligned.patch b/dosfstools-2.11-unaligned.patch index 7cc49bf..d44837d 100644 --- a/dosfstools-2.11-unaligned.patch +++ b/dosfstools-2.11-unaligned.patch @@ -1,14 +1,10 @@ ---- dosfsck/boot.c -+++ dosfsck/boot.c -@@ -8,6 +8,7 @@ - #include - #include - #include -+#include - - #include "common.h" - #include "dosfsck.h" -@@ -35,18 +36,11 @@ static struct { +--- + dosfsck/boot.c | 131 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 120 insertions(+), 11 deletions(-) + +--- a/dosfsck/boot.c ++++ b/dosfsck/boot.c +@@ -34,18 +34,127 @@ static struct { { 0xff, "5.25\" 320k floppy 2s/40tr/8sec" }, }; @@ -22,10 +18,127 @@ - }) -#else -#define GET_UNALIGNED_W(f) CF_LE_W( *(unsigned short *)&f ) -+#ifndef get_unaligned -+#define get_unaligned(ptr) (*(ptr)) - #endif +-#endif ++/* ++ * For the benefit of those who are trying to port Linux to another ++ * architecture, here are some C-language equivalents. ++ * ++ * This is based almost entirely upon Richard Henderson's ++ * asm-alpha/unaligned.h implementation. Some comments were ++ * taken from David Mosberger's asm-ia64/unaligned.h header. ++ */ ++ ++#include ++ ++/* ++ * The main single-value unaligned transfer routines. ++ */ ++#define get_unaligned(ptr) \ ++ __get_unaligned((ptr), sizeof(*(ptr))) ++#define put_unaligned(x,ptr) \ ++ __put_unaligned((__u64)(x), (ptr), sizeof(*(ptr))) ++ ++/* ++ * This function doesn't actually exist. The idea is that when ++ * someone uses the macros below with an unsupported size (datatype), ++ * the linker will alert us to the problem via an unresolved reference ++ * error. ++ */ ++extern void bad_unaligned_access_length(void) __attribute__((noreturn)); ++ ++struct __una_u64 { __u64 x __attribute__((packed)); }; ++struct __una_u32 { __u32 x __attribute__((packed)); }; ++struct __una_u16 { __u16 x __attribute__((packed)); }; ++ ++/* ++ * Elemental unaligned loads ++ */ ++ ++static inline __u64 __uldq(const __u64 *addr) ++{ ++ const struct __una_u64 *ptr = (const struct __una_u64 *) addr; ++ return ptr->x; ++} ++ ++static inline __u32 __uldl(const __u32 *addr) ++{ ++ const struct __una_u32 *ptr = (const struct __una_u32 *) addr; ++ return ptr->x; ++} ++ ++static inline __u16 __uldw(const __u16 *addr) ++{ ++ const struct __una_u16 *ptr = (const struct __una_u16 *) addr; ++ return ptr->x; ++} ++ ++/* ++ * Elemental unaligned stores ++ */ ++ ++static inline void __ustq(__u64 val, __u64 *addr) ++{ ++ struct __una_u64 *ptr = (struct __una_u64 *) addr; ++ ptr->x = val; ++} ++ ++static inline void __ustl(__u32 val, __u32 *addr) ++{ ++ struct __una_u32 *ptr = (struct __una_u32 *) addr; ++ ptr->x = val; ++} ++ ++static inline void __ustw(__u16 val, __u16 *addr) ++{ ++ struct __una_u16 *ptr = (struct __una_u16 *) addr; ++ ptr->x = val; ++} ++ ++#define __get_unaligned(ptr, size) ({ \ ++ const void *__gu_p = ptr; \ ++ __u64 val; \ ++ switch (size) { \ ++ case 1: \ ++ val = *(const __u8 *)__gu_p; \ ++ break; \ ++ case 2: \ ++ val = __uldw(__gu_p); \ ++ break; \ ++ case 4: \ ++ val = __uldl(__gu_p); \ ++ break; \ ++ case 8: \ ++ val = __uldq(__gu_p); \ ++ break; \ ++ default: \ ++ bad_unaligned_access_length(); \ ++ }; \ ++ (__typeof__(*(ptr)))val; \ ++}) ++ ++#define __put_unaligned(val, ptr, size) \ ++do { \ ++ void *__gu_p = ptr; \ ++ switch (size) { \ ++ case 1: \ ++ *(__u8 *)__gu_p = val; \ ++ break; \ ++ case 2: \ ++ __ustw(val, __gu_p); \ ++ break; \ ++ case 4: \ ++ __ustl(val, __gu_p); \ ++ break; \ ++ case 8: \ ++ __ustq(val, __gu_p); \ ++ break; \ ++ default: \ ++ bad_unaligned_access_length(); \ ++ }; \ ++} while(0) ++ ++ +#define GET_UNALIGNED_W(f) CF_LE_W( get_unaligned ((unsigned short *)&f)) static char *get_media_descr( unsigned char media ) diff --git a/dosfstools.changes b/dosfstools.changes index cf3465e..f7f0c34 100644 --- a/dosfstools.changes +++ b/dosfstools.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Thu Aug 9 17:08:41 CEST 2007 - olh@suse.de + +- remove inclusion of asm/unaligned.h, use private copy of + asm-generic/unaligned.h + ------------------------------------------------------------------- Thu Apr 26 12:14:35 CEST 2007 - lnussel@suse.de diff --git a/dosfstools.spec b/dosfstools.spec index 0ad8306..984d0e7 100644 --- a/dosfstools.spec +++ b/dosfstools.spec @@ -12,12 +12,12 @@ Name: dosfstools Provides: mkdosfs dosfsck -License: GNU General Public License (GPL) +License: GPL v2 or later Group: System/Filesystems Autoreqprov: on Summary: Utilities for Making and Checking MS-DOS FAT File Systems on Linux Version: 2.11 -Release: 51 +Release: 71 URL: ftp://ftp.uni-erlangen.de/pub/Linux/LOCAL/dosfstools Source: %{name}-%{version}.src.tar.bz2 Patch0: %{name}-%{version}-linuxfs.patch @@ -45,7 +45,7 @@ Authors: %prep %setup %patch0 -%patch1 +%patch1 -p1 %patch2 %patch3 %patch4 -p1 @@ -89,6 +89,9 @@ rm -rf $RPM_BUILD_ROOT %{_mandir}/man8/*.gz %changelog +* Thu Aug 09 2007 - olh@suse.de +- remove inclusion of asm/unaligned.h, use private copy of + asm-generic/unaligned.h * Thu Apr 26 2007 - lnussel@suse.de - remove obsolete subfs patch - fix handling of zero heads and sectors