teach SYSCALL_DEFINE/COMPAT_SYSCALL_DEFINE to handle __bitwise arguments
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 8 Jul 2017 15:40:39 +0000 (11:40 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 31 Aug 2017 21:32:37 +0000 (17:32 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/s390/include/asm/compat.h
include/linux/compat.h
include/linux/syscalls.h

index b9300f8aee10a5754909e63946c6f06d0bbc74f1..07a82bc933a775df11a9d2084bcd0b4eeb768311 100644 (file)
@@ -8,11 +8,12 @@
 #include <linux/sched/task_stack.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) ({ \
        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
index 5a6a109b4a508b544882e358def3d11820bce250..e5d3fbe24f7dde4138f3dc1ef514c4f5c32ed99e 100644 (file)
@@ -27,7 +27,7 @@
 #endif
 
 #ifndef __SC_DELOUSE
-#define __SC_DELOUSE(t,v) ((t)(unsigned long)(v))
+#define __SC_DELOUSE(t,v) ((__force t)(unsigned long)(v))
 #endif
 
 #define COMPAT_SYSCALL_DEFINE0(name) \
index 3cb15ea48aeea8414beed8cdd11d1ece13f71d0d..0bc1d2e8cc17b40d9310f76edf4a23eaf38664c6 100644 (file)
@@ -100,11 +100,12 @@ union bpf_attr;
 #define __MAP(n,...) __MAP##n(__VA_ARGS__)
 
 #define __SC_DECL(t, a)        t a
-#define __TYPE_IS_L(t) (__same_type((t)0, 0L))
-#define __TYPE_IS_UL(t)        (__same_type((t)0, 0UL))
-#define __TYPE_IS_LL(t) (__same_type((t)0, 0LL) || __same_type((t)0, 0ULL))
+#define __TYPE_AS(t, v)        __same_type((__force t)0, v)
+#define __TYPE_IS_L(t) (__TYPE_AS(t, 0L))
+#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_CAST(t, a)        (t) a
+#define __SC_CAST(t, a)        (__force t) 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))