Skip to content

Commit 4683661

Browse files
author
Al Viro
committed
COMPAT_SYSCALL_DEFINE: infrastructure
Signed-off-by: Al Viro <[email protected]>
1 parent 541880d commit 4683661

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

arch/s390/include/asm/compat.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
#include <linux/sched.h>
88
#include <linux/thread_info.h>
99

10+
#define __TYPE_IS_PTR(t) (!__builtin_types_compatible_p(typeof(0?(t)0:0ULL), u64))
11+
#define __SC_DELOUSE(t,v) (t)(__TYPE_IS_PTR(t) ? ((v) & 0x7fffffff) : (v))
12+
1013
#define PSW32_MASK_PER 0x40000000UL
1114
#define PSW32_MASK_DAT 0x04000000UL
1215
#define PSW32_MASK_IO 0x02000000UL

include/linux/compat.h

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,48 @@
2323
#define COMPAT_USE_64BIT_TIME 0
2424
#endif
2525

26+
#ifndef __SC_DELOUSE
27+
#define __SC_DELOUSE(t,v) ((t)(unsigned long)(v))
28+
#endif
29+
30+
#define __SC_CCAST1(t1, a1) __SC_DELOUSE(t1,a1)
31+
#define __SC_CCAST2(t2, a2, ...) __SC_DELOUSE(t2,a2), __SC_CCAST1(__VA_ARGS__)
32+
#define __SC_CCAST3(t3, a3, ...) __SC_DELOUSE(t3,a3), __SC_CCAST2(__VA_ARGS__)
33+
#define __SC_CCAST4(t4, a4, ...) __SC_DELOUSE(t4,a4), __SC_CCAST3(__VA_ARGS__)
34+
#define __SC_CCAST5(t5, a5, ...) __SC_DELOUSE(t5,a5), __SC_CCAST4(__VA_ARGS__)
35+
#define __SC_CCAST6(t6, a6, ...) __SC_DELOUSE(t6,a6), __SC_CCAST5(__VA_ARGS__)
36+
#define COMPAT_SYSCALL_DEFINE1(name, ...) \
37+
COMPAT_SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
38+
#define COMPAT_SYSCALL_DEFINE2(name, ...) \
39+
COMPAT_SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
40+
#define COMPAT_SYSCALL_DEFINE3(name, ...) \
41+
COMPAT_SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
42+
#define COMPAT_SYSCALL_DEFINE4(name, ...) \
43+
COMPAT_SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
44+
#define COMPAT_SYSCALL_DEFINE5(name, ...) \
45+
COMPAT_SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
46+
#define COMPAT_SYSCALL_DEFINE6(name, ...) \
47+
COMPAT_SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
48+
49+
#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
50+
51+
#define COMPAT_SYSCALL_DEFINEx(x, name, ...) \
52+
asmlinkage long compat_sys##name(__SC_DECL##x(__VA_ARGS__)); \
53+
static inline long C_SYSC##name(__SC_DECL##x(__VA_ARGS__)); \
54+
asmlinkage long compat_SyS##name(__SC_LONG##x(__VA_ARGS__)) \
55+
{ \
56+
return (long) C_SYSC##name(__SC_CCAST##x(__VA_ARGS__)); \
57+
} \
58+
SYSCALL_ALIAS(compat_sys##name, compat_SyS##name); \
59+
static inline long C_SYSC##name(__SC_DECL##x(__VA_ARGS__))
60+
61+
#else /* CONFIG_HAVE_SYSCALL_WRAPPERS */
62+
63+
#define COMPAT_SYSCALL_DEFINEx(x, name, ...) \
64+
asmlinkage long compat_sys##name(__SC_DECL##x(__VA_ARGS__))
65+
66+
#endif /* CONFIG_HAVE_SYSCALL_WRAPPERS */
67+
2668
#define compat_jiffies_to_clock_t(x) \
2769
(((unsigned long)(x) * COMPAT_USER_HZ) / HZ)
2870

0 commit comments

Comments
 (0)