On Wed, Dec 25, 2013 at 09:15:51AM -0800, H.J. Lu wrote: > X32 uses the 32-bit compat layer for 32-bit kernel interface, which is > also used by ia32. But long long is 4-byte aligned for ia32 and 8-byte > aligned for x32. When the long long field in a system call struct has > different offsets between ia32 and x32 due to alignment padding, like > struct snd_ctl_elem_value in include/uapi/sound/asound.h, we need to > either add a special case for x32 or we can use 4-byte aligned long > long in the system call struct so that x32 can share the same compat > system cal with ia32. This patch adds __compat_aligned_s64 and > __compat_aligned_u64 to include/uapi/asm-generic/int-ll64.h. By > default, they are the same as __s64/__u64. It does the following > things: > > 1. Add default __compat_aligned_s64/__compat_aligned_u64 to > include/uapi/asm-generic/int-ll64.h. > 2. Add arch/x86/include/asm/types.h for kernel internal use, which is the > same as before, i.e., . > 3. Change arch/x86/include/uapi/asm/types.h not to use the default > include/uapi/asm-generic/int-ll64.h. Instead, it has a modified copy > of include/uapi/asm-generic/int-ll64.h with 4-byte aligned > __compat_aligned_s64 and __compat_aligned_u64 for x32 and ia32. > > When building x86 kernel, nothing is changed. The difference is > x32 can use 4-byte aligned long long for system calls so that it > can share the same 32-bit compat system call with ia32. > > Signed-off-by: H.J. Lu > --- > arch/x86/include/asm/types.h | 6 ++++++ > arch/x86/include/uapi/asm/types.h | 35 ++++++++++++++++++++++++++++++++++- > include/uapi/asm-generic/int-ll64.h | 3 +++ > 3 files changed, 43 insertions(+), 1 deletion(-) > create mode 100644 arch/x86/include/asm/types.h ... > diff --git a/arch/x86/include/uapi/asm/types.h b/arch/x86/include/uapi/asm/types.h > index 8e8c23f..7dac28b 100644 > --- a/arch/x86/include/uapi/asm/types.h > +++ b/arch/x86/include/uapi/asm/types.h ... > +#if defined(__i386__) || defined(__ILP32__) > +typedef s64 __attribute__((aligned(4))) __compat_aligned_s64; > +typedef u64 __attribute__((aligned(4))) __compat_aligned_u64; Here are 2 typos. They should be __s64 and __u64. > +#else > +typedef __s64 __compat_aligned_s64; > +typedef __u64 __compat_aligned_u64; > +#endif Here is the updated patch. H.J.