Skip to content
  • Dave Hansen's avatar
    mm/pkeys: Fix siginfo ABI breakage caused by new u64 field · 49cd53bf
    Dave Hansen authored
    Stephen Rothwell reported this linux-next build failure:
    
    	http://lkml.kernel.org/r/20160226164406.065a1ffc@canb.auug.org.au
    
    
    
    ... caused by the Memory Protection Keys patches from the tip tree triggering
    a newly introduced build-time sanity check on an ARM build, because they changed
    the ABI of siginfo in an unexpected way.
    
    If u64 has a natural alignment of 8 bytes (which is the case on most mainstream
    platforms, with the notable exception of x86-32), then the leadup to the
    _sifields union matters:
    
    typedef struct siginfo {
            int si_signo;
            int si_errno;
            int si_code;
    
            union {
    	...
            } _sifields;
    } __ARCH_SI_ATTRIBUTES siginfo_t;
    
    Note how the first 3 fields give us 12 bytes, so _sifields is not 8
    naturally bytes aligned.
    
    Before the _pkey field addition the largest element of _sifields (on
    32-bit platforms) was 32 bits. With the u64 added, the minimum alignment
    requirement increased to 8 bytes on those (rare) 32-bit platforms. Thus
    GCC padded the space after si_code with 4 extra bytes, and shifted all
    _sifields offsets by 4 bytes - breaking the ABI of all of those
    remaining fields.
    
    On 64-bit platforms this problem was hidden due to _sifields already
    having numerous fields with natural 8 bytes alignment (pointers).
    
    To fix this, we replace the u64 with an '__u32'.  The __u32 does not
    increase the minimum alignment requirement of the union, and it is
    also large enough to store the 16-bit pkey we have today on x86.
    
    Reported-by: default avatarStehen Rothwell <sfr@canb.auug.org.au>
    Signed-off-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
    Acked-by: default avatarStehen Rothwell <sfr@canb.auug.org.au>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Dave Hansen <dave@sr71.net>
    Cc: Helge Deller <deller@gmx.de>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: linux-next@vger.kernel.org
    Fixes: cd0ea35f ("signals, pkeys: Notify userspace about protection key faults")
    Link: http://lkml.kernel.org/r/20160301125451.02C7426D@viggo.jf.intel.com
    
    
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    49cd53bf