History

types.h: define __aligned_u64 and expose to userspace

We currently have a kernel internal type called aligned_u64 which aligns __u64's on 8 bytes boundaries even on systems which would normally align them on 4 byte boundaries. This patch creates a new type __aligned_u64 which does the same thing but which is exposed to userspace rather than being kernel internal. [akpm: merge early as both the net and audit trees want this] [akpm@linux-foundation.org: enhance the comment describing the reasons for using aligned_u64. Via Andreas and Andi.] Based-on-patch-by: Andreas Gruenbacher <agruen@suse.de> Signed-off-by: Eric Paris <eparis@redhat.com> Cc: Jan Engelhardt <jengelh@medozas.de> Cc: David Miller <davem@davemloft.net> Cc: Andi Kleen <andi@firstfloor.org> Cc: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Eric Paris committed 16 years ago

Commit 79b5dc01 parent e3c6cf61 file · +14 −1Browse files

Showing the changes to include/linux (1 of 1 file). Show all

Unified · Split

include/linux/types.h+14−1
@@ -121,7 +121,15 @@ typedef __u64 u_int64_t; · 120 unmodified lines
121121 typedef __s64 int64_t;
122122 #endif
123123
124−/* this is a special 64bit data type that is 8-byte aligned */
124+/*
125+ * aligned_u64 should be used in defining kernel<->userspace ABIs to avoid
126+ * common 32/64-bit compat problems.
127+ * 64-bit values align to 4-byte boundaries on x86_32 (and possibly other
128+ * architectures) and to 8-byte boundaries on 64-bit architetures. The new
129+ * aligned_64 type enforces 8-byte alignment so that structs containing
130+ * aligned_64 values have the same alignment on 32-bit and 64-bit architectures.
131+ * No conversions are necessary between 32-bit user-space and a 64-bit kernel.
132+ */
125133 #define aligned_u64 __u64 __attribute__((aligned(8)))
126134 #define aligned_be64 __be64 __attribute__((aligned(8)))
127135 #define aligned_le64 __le64 __attribute__((aligned(8)))
@@ -178,6 +186,11 @@ typedef __u64 __bitwise __be64; · 50 unmodified lines
178186 typedef __u16 __bitwise __sum16;
179187 typedef __u32 __bitwise __wsum;
180188
189+/* this is a special 64bit data type that is 8-byte aligned */
190+#define __aligned_u64 __u64 __attribute__((aligned(8)))
191+#define __aligned_be64 __be64 __attribute__((aligned(8)))
192+#define __aligned_le64 __le64 __attribute__((aligned(8)))
193+
181194 #ifdef __KERNEL__
182195 typedef unsigned __bitwise__ gfp_t;
183196 typedef unsigned __bitwise__ fmode_t;