提交 60262e58 编写于 作者: A Al Viro 提交者: Linus Torvalds

arm unaligned.h annotations

	Have put_unaligned() warn if types would be wrong
for assignment, slap force-casts where needed.  Cast the
result of get_unaligned to typeof(*ptr).  With that in
place we get proper typechecking, both from gcc and from sparse,
including that for bitwise types.
Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 e7cf261b
...@@ -60,24 +60,24 @@ extern int __bug_unaligned_x(const void *ptr); ...@@ -60,24 +60,24 @@ extern int __bug_unaligned_x(const void *ptr);
__get_unaligned_4_be((__p+4))) __get_unaligned_4_be((__p+4)))
#define __get_unaligned_le(ptr) \ #define __get_unaligned_le(ptr) \
({ \ ((__force typeof(*(ptr)))({ \
const __u8 *__p = (const __u8 *)(ptr); \ const __u8 *__p = (const __u8 *)(ptr); \
__builtin_choose_expr(sizeof(*(ptr)) == 1, *__p, \ __builtin_choose_expr(sizeof(*(ptr)) == 1, *__p, \
__builtin_choose_expr(sizeof(*(ptr)) == 2, __get_unaligned_2_le(__p), \ __builtin_choose_expr(sizeof(*(ptr)) == 2, __get_unaligned_2_le(__p), \
__builtin_choose_expr(sizeof(*(ptr)) == 4, __get_unaligned_4_le(__p), \ __builtin_choose_expr(sizeof(*(ptr)) == 4, __get_unaligned_4_le(__p), \
__builtin_choose_expr(sizeof(*(ptr)) == 8, __get_unaligned_8_le(__p), \ __builtin_choose_expr(sizeof(*(ptr)) == 8, __get_unaligned_8_le(__p), \
(void)__bug_unaligned_x(__p))))); \ (void)__bug_unaligned_x(__p))))); \
}) }))
#define __get_unaligned_be(ptr) \ #define __get_unaligned_be(ptr) \
({ \ ((__force typeof(*(ptr)))({ \
const __u8 *__p = (const __u8 *)(ptr); \ const __u8 *__p = (const __u8 *)(ptr); \
__builtin_choose_expr(sizeof(*(ptr)) == 1, *__p, \ __builtin_choose_expr(sizeof(*(ptr)) == 1, *__p, \
__builtin_choose_expr(sizeof(*(ptr)) == 2, __get_unaligned_2_be(__p), \ __builtin_choose_expr(sizeof(*(ptr)) == 2, __get_unaligned_2_be(__p), \
__builtin_choose_expr(sizeof(*(ptr)) == 4, __get_unaligned_4_be(__p), \ __builtin_choose_expr(sizeof(*(ptr)) == 4, __get_unaligned_4_be(__p), \
__builtin_choose_expr(sizeof(*(ptr)) == 8, __get_unaligned_8_be(__p), \ __builtin_choose_expr(sizeof(*(ptr)) == 8, __get_unaligned_8_be(__p), \
(void)__bug_unaligned_x(__p))))); \ (void)__bug_unaligned_x(__p))))); \
}) }))
static inline void __put_unaligned_2_le(__u32 __v, register __u8 *__p) static inline void __put_unaligned_2_le(__u32 __v, register __u8 *__p)
...@@ -131,15 +131,16 @@ static inline void __put_unaligned_8_be(const unsigned long long __v, register _ ...@@ -131,15 +131,16 @@ static inline void __put_unaligned_8_be(const unsigned long long __v, register _
*/ */
#define __put_unaligned_le(val,ptr) \ #define __put_unaligned_le(val,ptr) \
({ \ ({ \
(void)sizeof(*(ptr) = (val)); \
switch (sizeof(*(ptr))) { \ switch (sizeof(*(ptr))) { \
case 1: \ case 1: \
*(ptr) = (val); \ *(ptr) = (val); \
break; \ break; \
case 2: __put_unaligned_2_le((val),(__u8 *)(ptr)); \ case 2: __put_unaligned_2_le((__force u16)(val),(__u8 *)(ptr)); \
break; \ break; \
case 4: __put_unaligned_4_le((val),(__u8 *)(ptr)); \ case 4: __put_unaligned_4_le((__force u32)(val),(__u8 *)(ptr)); \
break; \ break; \
case 8: __put_unaligned_8_le((val),(__u8 *)(ptr)); \ case 8: __put_unaligned_8_le((__force u64)(val),(__u8 *)(ptr)); \
break; \ break; \
default: __bug_unaligned_x(ptr); \ default: __bug_unaligned_x(ptr); \
break; \ break; \
...@@ -149,15 +150,16 @@ static inline void __put_unaligned_8_be(const unsigned long long __v, register _ ...@@ -149,15 +150,16 @@ static inline void __put_unaligned_8_be(const unsigned long long __v, register _
#define __put_unaligned_be(val,ptr) \ #define __put_unaligned_be(val,ptr) \
({ \ ({ \
(void)sizeof(*(ptr) = (val)); \
switch (sizeof(*(ptr))) { \ switch (sizeof(*(ptr))) { \
case 1: \ case 1: \
*(ptr) = (val); \ *(ptr) = (val); \
break; \ break; \
case 2: __put_unaligned_2_be((val),(__u8 *)(ptr)); \ case 2: __put_unaligned_2_be((__force u16)(val),(__u8 *)(ptr)); \
break; \ break; \
case 4: __put_unaligned_4_be((val),(__u8 *)(ptr)); \ case 4: __put_unaligned_4_be((__force u32)(val),(__u8 *)(ptr)); \
break; \ break; \
case 8: __put_unaligned_8_be((val),(__u8 *)(ptr)); \ case 8: __put_unaligned_8_be((__force u64)(val),(__u8 *)(ptr)); \
break; \ break; \
default: __bug_unaligned_x(ptr); \ default: __bug_unaligned_x(ptr); \
break; \ break; \
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册