• Arnd Bergmann's avatar
    asm-generic: unaligned always use struct helpers · 778aaefb
    Arnd Bergmann authored
    As found by Vineet Gupta and Linus Torvalds, gcc has somewhat unexpected
    behavior when faced with overlapping unaligned pointers. The kernel's
    unaligned/access-ok.h header technically invokes undefined behavior
    that happens to usually work on the architectures using it, but if the
    compiler optimizes code based on the assumption that undefined behavior
    doesn't happen, it can create output that actually causes data corruption.
    
    A related problem was previously found on 32-bit ARMv7, where most
    instructions can be used on unaligned data, but 64-bit ldrd/strd causes
    an exception. The workaround was to always use the unaligned/le_struct.h
    helper instead of unaligned/access-ok.h, in commit 1cce91df ("ARM:
    8715/1: add a private asm/unaligned.h").
    
    The same solution should work on all other architectures as well, so
    remove the access-ok.h variant and use the other one unconditionally on
    all architectures, picking either the big-endian or little-endian version.
    
    With this, the arm specific header can be removed as well, and the
    only file including linux/unaligned/access_ok.h gets moved to including
    the normal file.
    
    Fortunately, this made almost no difference to the object code produced
    by gcc-11. On x86, s390, powerpc, and arc, the resulting binary appears
    to be identical to the previous version, while on arm64 and m68k there
    are minimal differences that looks like an optimization pass went into
    a different direction, usually using fewer stack spills on the new
    version.
    Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
    Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100363
    778aaefb
crc32-mips.c 7.46 KB