From: Ralf Baechle <ralf@linux-mips.org>
To: Andrew Morton <akpm@osdl.org>
Cc: Atsushi Nemoto <anemo@mba.ocn.ne.jp>,
linux-mips@linux-mips.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] 64bit unaligned access on 32bit kernel
Date: Tue, 7 Mar 2006 18:09:07 +0000 [thread overview]
Message-ID: <20060307180907.GA13577@linux-mips.org> (raw)
In-Reply-To: <20060306170552.0aab29c5.akpm@osdl.org>
On Mon, Mar 06, 2006 at 05:05:52PM -0800, Andrew Morton wrote:
> I worry about what impact that change might have on code generation.
> Hopefully none, if gcc is good enough.
>
> But I cannot think of a better fix.
Below's fix results in exactly the same code size on all compilers and
configurations I've tested it.
I also have another more elegant fix which as a side effect makes
get_unaligned work for arbitrary data types but it that one results in a
slight code bloat:
gcc 4.1.0 ip22 64-bit
text data bss dec hex filename
2717213 337920 167968 3223101 312e3d vmlinux
2717277 337920 167968 3223165 312e7d vmlinux unaligned-4.patch
Ralf
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
diff --git a/include/asm-generic/unaligned.h b/include/asm-generic/unaligned.h
index 4dc8ddb..9a63564 100644
--- a/include/asm-generic/unaligned.h
+++ b/include/asm-generic/unaligned.h
@@ -26,35 +26,13 @@
* the linker will alert us to the problem via an unresolved reference
* error.
*/
-extern void bad_unaligned_access_length(void) __attribute__((noreturn));
+extern int bad_unaligned_access_length(void) __attribute__((noreturn));
struct __una_u64 { __u64 x __attribute__((packed)); };
struct __una_u32 { __u32 x __attribute__((packed)); };
struct __una_u16 { __u16 x __attribute__((packed)); };
/*
- * Elemental unaligned loads
- */
-
-static inline __u64 __uldq(const __u64 *addr)
-{
- const struct __una_u64 *ptr = (const struct __una_u64 *) addr;
- return ptr->x;
-}
-
-static inline __u32 __uldl(const __u32 *addr)
-{
- const struct __una_u32 *ptr = (const struct __una_u32 *) addr;
- return ptr->x;
-}
-
-static inline __u16 __uldw(const __u16 *addr)
-{
- const struct __una_u16 *ptr = (const struct __una_u16 *) addr;
- return ptr->x;
-}
-
-/*
* Elemental unaligned stores
*/
@@ -76,26 +54,16 @@ static inline void __ustw(__u16 val, __u
ptr->x = val;
}
-#define __get_unaligned(ptr, size) ({ \
- const void *__gu_p = ptr; \
- __typeof__(*(ptr)) val; \
- switch (size) { \
- case 1: \
- val = *(const __u8 *)__gu_p; \
- break; \
- case 2: \
- val = __uldw(__gu_p); \
- break; \
- case 4: \
- val = __uldl(__gu_p); \
- break; \
- case 8: \
- val = __uldq(__gu_p); \
- break; \
- default: \
- bad_unaligned_access_length(); \
- }; \
- val; \
+#define __get_unaligned(ptr, size) \
+({ \
+ const void *__gu_p = ptr; \
+ int __sz = size; \
+ \
+ ((__sz == 1) ? (__typeof__(*(ptr)))*(const __u8 *)__gu_p \
+ : ((__sz == 2) ? (__typeof__(*(ptr)))((struct __una_u16 *)__gu_p)->x \
+ : ((__sz == 4) ? (__typeof__(*(ptr)))((struct __una_u32 *)__gu_p)->x \
+ : ((__sz == 8) ? (__typeof__(*(ptr)))((struct __una_u64 *)__gu_p)->x \
+ : bad_unaligned_access_length())))); \
})
#define __put_unaligned(val, ptr, size) \
next prev parent reply other threads:[~2006-03-07 18:00 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-08-30 10:40 [PATCH] 64bit unaligned access on 32bit kernel Ralf Baechle
2006-03-06 11:32 ` Atsushi Nemoto
2006-03-07 1:05 ` Andrew Morton
2006-03-07 2:03 ` Atsushi Nemoto
2006-03-07 18:09 ` Ralf Baechle [this message]
2006-03-08 4:58 ` Atsushi Nemoto
2006-03-08 5:12 ` Andrew Morton
2007-02-14 21:42 ` [PATCH] Optimize generic get_unaligned / put_unaligned implementations Ralf Baechle
2007-02-15 4:39 ` Andrew Morton
2007-02-15 8:35 ` Marcel Holtmann
2007-02-15 14:34 ` Ralf Baechle
2007-02-15 21:53 ` Andrew Morton
2007-02-15 22:18 ` Ralf Baechle
2007-02-15 23:05 ` Jeremy Fitzhardinge
2007-02-15 23:38 ` Andrew Morton
2007-02-16 0:13 ` Jeremy Fitzhardinge
2007-02-16 0:43 ` Ralf Baechle
2007-02-16 1:27 ` Andrew Morton
2007-02-16 1:59 ` Ralf Baechle
2007-02-20 13:50 ` Pavel Machek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20060307180907.GA13577@linux-mips.org \
--to=ralf@linux-mips.org \
--cc=akpm@osdl.org \
--cc=anemo@mba.ocn.ne.jp \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mips@linux-mips.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.