mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH] include/linux/unaligned: Pack the whole struct rather than just the field.
@ 2010-12-01 22:11 Will Newton
  2010-12-07 11:12 ` Will Newton
  2010-12-21  5:44 ` Andrew Morton
  0 siblings, 2 replies; 7+ messages in thread
From: Will Newton @ 2010-12-01 22:11 UTC (permalink / raw)
  To: Linux Kernel list

[-- Attachment #1: Type: text/plain, Size: 1695 bytes --]

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: Will Newton <will.newton@gmail.com>
---
 include/linux/unaligned/packed_struct.h |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/include/linux/unaligned/packed_struct.h
b/include/linux/unaligned/packed_struct.h
index 2498bb9..c9a6abd 100644
--- a/include/linux/unaligned/packed_struct.h
+++ b/include/linux/unaligned/packed_struct.h
@@ -3,9 +3,9 @@

 #include <linux/kernel.h>

-struct __una_u16 { u16 x __attribute__((packed)); };
-struct __una_u32 { u32 x __attribute__((packed)); };
-struct __una_u64 { u64 x __attribute__((packed)); };
+struct __una_u16 { u16 x; } __attribute__((packed));
+struct __una_u32 { u32 x; } __attribute__((packed));
+struct __una_u64 { u64 x; } __attribute__((packed));

 static inline u16 __get_unaligned_cpu16(const void *p)
 {
-- 
1.7.0.4

[-- Attachment #2: 0001-include-linux-unaligned-Pack-the-whole-struct-rather.patch --]
[-- Type: text/x-patch, Size: 1943 bytes --]

From bc1a150d8e747a514392279466518431c31c618f Mon Sep 17 00:00:00 2001
From: Will Newton <will.newton@gmail.com>
Date: Wed, 1 Dec 2010 21:45:24 +0000
Subject: [PATCH] include/linux/unaligned: Pack the whole struct rather than just the field.

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: Will Newton <will.newton@gmail.com>
---
 include/linux/unaligned/packed_struct.h |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/include/linux/unaligned/packed_struct.h b/include/linux/unaligned/packed_struct.h
index 2498bb9..c9a6abd 100644
--- a/include/linux/unaligned/packed_struct.h
+++ b/include/linux/unaligned/packed_struct.h
@@ -3,9 +3,9 @@
 
 #include <linux/kernel.h>
 
-struct __una_u16 { u16 x __attribute__((packed)); };
-struct __una_u32 { u32 x __attribute__((packed)); };
-struct __una_u64 { u64 x __attribute__((packed)); };
+struct __una_u16 { u16 x; } __attribute__((packed));
+struct __una_u32 { u32 x; } __attribute__((packed));
+struct __una_u64 { u64 x; } __attribute__((packed));
 
 static inline u16 __get_unaligned_cpu16(const void *p)
 {
-- 
1.7.0.4


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2010-12-22 10:34 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-12-01 22:11 [PATCH] include/linux/unaligned: Pack the whole struct rather than just the field Will Newton
2010-12-07 11:12 ` Will Newton
2010-12-18 12:59   ` Will Newton
2010-12-21  5:44 ` Andrew Morton
2010-12-21 10:43   ` Will Newton
2010-12-21 23:36     ` Harvey Harrison
2010-12-22 10:34       ` Will Newton

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome