• W
    include/linux/unaligned: pack the whole struct rather than just the field · 4e06fd14
    Will Newton 提交于
    The current packed struct implementation of unaligned access adds the
    packed attribute only to the field within the unaligned struct rather than
    to the struct as a whole.  This is not sufficient to enforce proper
    behaviour on architectures with a default struct alignment of more than
    one byte.
    
    For example, the current implementation of __get_unaligned_cpu16 when
    compiled for arm with gcc -O1 -mstructure-size-boundary=32 assumes the
    struct is on a 4 byte boundary so performs the load of the 16bit packed
    field as if it were on a 4 byte boundary:
    
    __get_unaligned_cpu16:
            ldrh    r0, [r0, #0]
            bx      lr
    
    Moving the packed attribute to the struct rather than the field causes the
    proper unaligned access code to be generated:
    
    __get_unaligned_cpu16:
    	ldrb	r3, [r0, #0]	@ zero_extendqisi2
    	ldrb	r0, [r0, #1]	@ zero_extendqisi2
    	orr	r0, r3, r0, asl #8
    	bx	lr
    Signed-off-by: NWill Newton <will.newton@gmail.com>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    4e06fd14
packed_struct.h 1.1 KB