• Harvey Harrison's avatar
    kernel: add common infrastructure for unaligned access · 064106a9
    Harvey Harrison authored
    Create a linux/unaligned directory similar in spirit to the linux/byteorder
    folder to hold generic implementations collected from various arches.
    
    Currently there are five implementations:
    1) packed_struct.h: C-struct based, from asm-generic/unaligned.h
    2) le_byteshift.h: Open coded byte-swapping, heavily based on asm-arm
    3) be_byteshift.h: Open coded byte-swapping, heavily based on asm-arm
    4) memmove.h: taken from multiple implementations in tree
    5) access_ok.h: taken from x86 and others, unaligned access is ok.
    
    All of the new implementations checks for sizes not equal to 1,2,4,8
    and will fail to link.
    
    API additions:
    
    get_unaligned_{le16|le32|le64|be16|be32|be64}(p) which is meant to replace
    code of the form:
    le16_to_cpu(get_unaligned((__le16 *)p));
    
    put_unaligned_{le16|le32|le64|be16|be32|be64}(val, pointer) which is meant to
    replace code of the form:
    put_unaligned(cpu_to_le16(val), (__le16 *)p);
    
    The headers that arches should include from their asm/unaligned.h:
    
    access_ok.h : Wrappers of the byteswapping functions in asm/byteorder
    
    Choose a particular implementation for little-endian access:
    le_byteshift.h
    le_memmove.h (arch must be LE)
    le_struct.h (arch must be LE)
    
    Choose a particular implementation for big-endian access:
    be_byteshift.h
    be_memmove.h (arch must be BE)
    be_struct.h (arch must be BE)
    
    After including as needed from the above, include unaligned/generic.h and
    define your arch's get/put_unaligned as (for LE):
    Signed-off-by: default avatarHarvey Harrison <harvey.harrison@gmail.com>
    Cc: <linux-arch@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    064106a9
be_byteshift.h 1.39 KB