teach SYSCALL_DEFINE/COMPAT_SYSCALL_DEFINE to handle __bitwise arguments

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2017-07-08 11:40:39 -04:00
parent cc4a41fe55
commit 4f59c71852
3 changed files with 9 additions and 7 deletions

View File

@ -8,11 +8,12 @@
#include <linux/sched/task_stack.h> #include <linux/sched/task_stack.h>
#include <linux/thread_info.h> #include <linux/thread_info.h>
#define __TYPE_IS_PTR(t) (!__builtin_types_compatible_p(typeof(0?(t)0:0ULL), u64)) #define __TYPE_IS_PTR(t) (!__builtin_types_compatible_p( \
typeof(0?(__force t)0:0ULL), u64))
#define __SC_DELOUSE(t,v) ({ \ #define __SC_DELOUSE(t,v) ({ \
BUILD_BUG_ON(sizeof(t) > 4 && !__TYPE_IS_PTR(t)); \ BUILD_BUG_ON(sizeof(t) > 4 && !__TYPE_IS_PTR(t)); \
(t)(__TYPE_IS_PTR(t) ? ((v) & 0x7fffffff) : (v)); \ (__force t)(__TYPE_IS_PTR(t) ? ((v) & 0x7fffffff) : (v)); \
}) })
#define PSW32_MASK_PER 0x40000000UL #define PSW32_MASK_PER 0x40000000UL

View File

@ -27,7 +27,7 @@
#endif #endif
#ifndef __SC_DELOUSE #ifndef __SC_DELOUSE
#define __SC_DELOUSE(t,v) ((t)(unsigned long)(v)) #define __SC_DELOUSE(t,v) ((__force t)(unsigned long)(v))
#endif #endif
#define COMPAT_SYSCALL_DEFINE0(name) \ #define COMPAT_SYSCALL_DEFINE0(name) \

View File

@ -100,11 +100,12 @@ union bpf_attr;
#define __MAP(n,...) __MAP##n(__VA_ARGS__) #define __MAP(n,...) __MAP##n(__VA_ARGS__)
#define __SC_DECL(t, a) t a #define __SC_DECL(t, a) t a
#define __TYPE_IS_L(t) (__same_type((t)0, 0L)) #define __TYPE_AS(t, v) __same_type((__force t)0, v)
#define __TYPE_IS_UL(t) (__same_type((t)0, 0UL)) #define __TYPE_IS_L(t) (__TYPE_AS(t, 0L))
#define __TYPE_IS_LL(t) (__same_type((t)0, 0LL) || __same_type((t)0, 0ULL)) #define __TYPE_IS_UL(t) (__TYPE_AS(t, 0UL))
#define __TYPE_IS_LL(t) (__TYPE_AS(t, 0LL) || __TYPE_AS(t, 0ULL))
#define __SC_LONG(t, a) __typeof(__builtin_choose_expr(__TYPE_IS_LL(t), 0LL, 0L)) a #define __SC_LONG(t, a) __typeof(__builtin_choose_expr(__TYPE_IS_LL(t), 0LL, 0L)) a
#define __SC_CAST(t, a) (t) a #define __SC_CAST(t, a) (__force t) a
#define __SC_ARGS(t, a) a #define __SC_ARGS(t, a) a
#define __SC_TEST(t, a) (void)BUILD_BUG_ON_ZERO(!__TYPE_IS_LL(t) && sizeof(t) > sizeof(long)) #define __SC_TEST(t, a) (void)BUILD_BUG_ON_ZERO(!__TYPE_IS_LL(t) && sizeof(t) > sizeof(long))