Re: [PATCH] 64bit unaligned access on 32bit kernel

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



>>>>> On Tue, 30 Aug 2005 11:40:56 +0100, Ralf Baechle <ralf@xxxxxxxxxxxxxx> said:
> I've rewriten Atushi's fix for the 64-bit put_unaligned on 32-bit
> systems bug to generate more efficient code.

> This case has buzilla URL http://bugzilla.kernel.org/show_bug.cgi?id=5138.

> Signed-off-by: Ralf Baechle <ralf@xxxxxxxxxxxxxx>
...
>  #define __get_unaligned(ptr, size) ({		\
>  	const void *__gu_p = ptr;		\
> -	unsigned long val;			\
> +	__typeof__(*(ptr)) val;			\
>  	switch (size) {				\
>  	case 1:					\
>  		val = *(const __u8 *)__gu_p;	\

It looks gcc 4.x strike back.  If the 'ptr' is a const, this code
cause "assignment of read-only variable" error on gcc 4.x.  Let's step
a back, or do you have any other good idea?


Use __u64 instead of __typeof__(*(ptr)) for temporary variable to get
rid of errors on gcc 4.x.

Signed-off-by: Atsushi Nemoto <anemo@xxxxxxxxxxxxx>

diff --git a/include/asm-generic/unaligned.h b/include/asm-generic/unaligned.h
index 4dc8ddb..09ec447 100644
--- a/include/asm-generic/unaligned.h
+++ b/include/asm-generic/unaligned.h
@@ -78,7 +78,7 @@ static inline void __ustw(__u16 val, __u
 
 #define __get_unaligned(ptr, size) ({		\
 	const void *__gu_p = ptr;		\
-	__typeof__(*(ptr)) val;			\
+	__u64 val;				\
 	switch (size) {				\
 	case 1:					\
 		val = *(const __u8 *)__gu_p;	\
@@ -95,7 +95,7 @@ static inline void __ustw(__u16 val, __u
 	default:				\
 		bad_unaligned_access_length();	\
 	};					\
-	val;					\
+	(__typeof__(*(ptr)))val;		\
 })
 
 #define __put_unaligned(val, ptr, size)		\


[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux