1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds #ifndef _LINUX_COMPAT_H
31da177e4SLinus Torvalds #define _LINUX_COMPAT_H
41da177e4SLinus Torvalds /*
51da177e4SLinus Torvalds * These are the type definitions for the architecture specific
61da177e4SLinus Torvalds * syscall compatibility layer.
71da177e4SLinus Torvalds */
81da177e4SLinus Torvalds
95180e3e2SAndy Lutomirski #include <linux/types.h>
109afc5eeeSArnd Bergmann #include <linux/time.h>
111da177e4SLinus Torvalds
121da177e4SLinus Torvalds #include <linux/stat.h>
131da177e4SLinus Torvalds #include <linux/param.h> /* for HZ */
141da177e4SLinus Torvalds #include <linux/sem.h>
152dceba14SArnd Bergmann #include <linux/socket.h>
162dceba14SArnd Bergmann #include <linux/if.h>
17be84cb43SChris Metcalf #include <linux/fs.h>
1845e9683eSStephen Rothwell #include <linux/aio_abi.h> /* for aio_context_t */
19fde9fc76SMatt Redfearn #include <linux/uaccess.h>
20f5b972e9SHeiko Carstens #include <linux/unistd.h>
211da177e4SLinus Torvalds
221da177e4SLinus Torvalds #include <asm/compat.h>
231da177e4SLinus Torvalds #include <asm/siginfo.h>
243f2e05e9SDavid Howells #include <asm/signal.h>
251da177e4SLinus Torvalds
267303e30eSDominik Brodowski #ifdef CONFIG_ARCH_HAS_SYSCALL_WRAPPER
277303e30eSDominik Brodowski /*
287303e30eSDominik Brodowski * It may be useful for an architecture to override the definitions of the
297303e30eSDominik Brodowski * COMPAT_SYSCALL_DEFINE0 and COMPAT_SYSCALL_DEFINEx() macros, in particular
307303e30eSDominik Brodowski * to use a different calling convention for syscalls. To allow for that,
317303e30eSDominik Brodowski + the prototypes for the compat_sys_*() functions below will *not* be included
327303e30eSDominik Brodowski * if CONFIG_ARCH_HAS_SYSCALL_WRAPPER is enabled.
337303e30eSDominik Brodowski */
347303e30eSDominik Brodowski #include <asm/syscall_wrapper.h>
357303e30eSDominik Brodowski #endif /* CONFIG_ARCH_HAS_SYSCALL_WRAPPER */
367303e30eSDominik Brodowski
3745e87781SH. J. Lu #ifndef COMPAT_USE_64BIT_TIME
3845e87781SH. J. Lu #define COMPAT_USE_64BIT_TIME 0
3945e87781SH. J. Lu #endif
4045e87781SH. J. Lu
4146836613SAl Viro #ifndef __SC_DELOUSE
424f59c718SAl Viro #define __SC_DELOUSE(t,v) ((__force t)(unsigned long)(v))
4346836613SAl Viro #endif
4446836613SAl Viro
457303e30eSDominik Brodowski #ifndef COMPAT_SYSCALL_DEFINE0
46217f4433SHeiko Carstens #define COMPAT_SYSCALL_DEFINE0(name) \
47c9a21195SHoward McLauchlan asmlinkage long compat_sys_##name(void); \
48c9a21195SHoward McLauchlan ALLOW_ERROR_INJECTION(compat_sys_##name, ERRNO); \
49217f4433SHeiko Carstens asmlinkage long compat_sys_##name(void)
507303e30eSDominik Brodowski #endif /* COMPAT_SYSCALL_DEFINE0 */
51217f4433SHeiko Carstens
5246836613SAl Viro #define COMPAT_SYSCALL_DEFINE1(name, ...) \
5346836613SAl Viro COMPAT_SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
5446836613SAl Viro #define COMPAT_SYSCALL_DEFINE2(name, ...) \
5546836613SAl Viro COMPAT_SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
5646836613SAl Viro #define COMPAT_SYSCALL_DEFINE3(name, ...) \
5746836613SAl Viro COMPAT_SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
5846836613SAl Viro #define COMPAT_SYSCALL_DEFINE4(name, ...) \
5946836613SAl Viro COMPAT_SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
6046836613SAl Viro #define COMPAT_SYSCALL_DEFINE5(name, ...) \
6146836613SAl Viro COMPAT_SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
6246836613SAl Viro #define COMPAT_SYSCALL_DEFINE6(name, ...) \
6346836613SAl Viro COMPAT_SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
6446836613SAl Viro
655ac9efa3SDominik Brodowski /*
665ac9efa3SDominik Brodowski * The asmlinkage stub is aliased to a function named __se_compat_sys_*() which
675ac9efa3SDominik Brodowski * sign-extends 32-bit ints to longs whenever needed. The actual work is
685ac9efa3SDominik Brodowski * done within __do_compat_sys_*().
695ac9efa3SDominik Brodowski */
707303e30eSDominik Brodowski #ifndef COMPAT_SYSCALL_DEFINEx
7146836613SAl Viro #define COMPAT_SYSCALL_DEFINEx(x, name, ...) \
72bee20031SArnd Bergmann __diag_push(); \
73bee20031SArnd Bergmann __diag_ignore(GCC, 8, "-Wattribute-alias", \
74bee20031SArnd Bergmann "Type aliasing is used to sanitize syscall arguments");\
7583460ec8SAndi Kleen asmlinkage long compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__)) \
765ac9efa3SDominik Brodowski __attribute__((alias(__stringify(__se_compat_sys##name)))); \
77c9a21195SHoward McLauchlan ALLOW_ERROR_INJECTION(compat_sys##name, ERRNO); \
785ac9efa3SDominik Brodowski static inline long __do_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));\
795ac9efa3SDominik Brodowski asmlinkage long __se_compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)); \
805ac9efa3SDominik Brodowski asmlinkage long __se_compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__)) \
8146836613SAl Viro { \
82bee20031SArnd Bergmann long ret = __do_compat_sys##name(__MAP(x,__SC_DELOUSE,__VA_ARGS__));\
83bee20031SArnd Bergmann __MAP(x,__SC_TEST,__VA_ARGS__); \
84bee20031SArnd Bergmann return ret; \
8546836613SAl Viro } \
86bee20031SArnd Bergmann __diag_pop(); \
875ac9efa3SDominik Brodowski static inline long __do_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))
887303e30eSDominik Brodowski #endif /* COMPAT_SYSCALL_DEFINEx */
8946836613SAl Viro
90bfdc5970SChristoph Hellwig struct compat_iovec {
91bfdc5970SChristoph Hellwig compat_uptr_t iov_base;
92bfdc5970SChristoph Hellwig compat_size_t iov_len;
93bfdc5970SChristoph Hellwig };
94bfdc5970SChristoph Hellwig
959b064fc3SAl Viro #ifndef compat_user_stack_pointer
969b064fc3SAl Viro #define compat_user_stack_pointer() current_user_stack_pointer()
979b064fc3SAl Viro #endif
9890268439SAl Viro #ifndef compat_sigaltstack /* we'll need that for MIPS */
9990268439SAl Viro typedef struct compat_sigaltstack {
10090268439SAl Viro compat_uptr_t ss_sp;
10190268439SAl Viro int ss_flags;
10290268439SAl Viro compat_size_t ss_size;
10390268439SAl Viro } compat_stack_t;
10490268439SAl Viro #endif
10522839869SWill Deacon #ifndef COMPAT_MINSIGSTKSZ
10622839869SWill Deacon #define COMPAT_MINSIGSTKSZ MINSIGSTKSZ
10722839869SWill Deacon #endif
10890268439SAl Viro
1091da177e4SLinus Torvalds #define compat_jiffies_to_clock_t(x) \
1101da177e4SLinus Torvalds (((unsigned long)(x) * COMPAT_USER_HZ) / HZ)
1111da177e4SLinus Torvalds
112202e5979SStephen Rothwell typedef __compat_uid32_t compat_uid_t;
113202e5979SStephen Rothwell typedef __compat_gid32_t compat_gid_t;
114202e5979SStephen Rothwell
1155d0e5283SChristoph Hellwig struct compat_sel_arg_struct;
1161da177e4SLinus Torvalds struct rusage;
1171da177e4SLinus Torvalds
118c1745f84SArnd Bergmann struct old_itimerval32;
11954ad9c46SAl Viro
1201da177e4SLinus Torvalds struct compat_tms {
1211da177e4SLinus Torvalds compat_clock_t tms_utime;
1221da177e4SLinus Torvalds compat_clock_t tms_stime;
1231da177e4SLinus Torvalds compat_clock_t tms_cutime;
1241da177e4SLinus Torvalds compat_clock_t tms_cstime;
1251da177e4SLinus Torvalds };
1261da177e4SLinus Torvalds
1271da177e4SLinus Torvalds #define _COMPAT_NSIG_WORDS (_COMPAT_NSIG / _COMPAT_NSIG_BPW)
1281da177e4SLinus Torvalds
1291da177e4SLinus Torvalds typedef struct {
1301da177e4SLinus Torvalds compat_sigset_word sig[_COMPAT_NSIG_WORDS];
1311da177e4SLinus Torvalds } compat_sigset_t;
1321da177e4SLinus Torvalds
133b772434bSOleg Nesterov int set_compat_user_sigmask(const compat_sigset_t __user *umask,
134ded653ccSDeepa Dinamani size_t sigsetsize);
135ded653ccSDeepa Dinamani
13608d32fe5SAl Viro struct compat_sigaction {
1372a148698SDavid Howells #ifndef __ARCH_HAS_IRIX_SIGACTION
13808d32fe5SAl Viro compat_uptr_t sa_handler;
13908d32fe5SAl Viro compat_ulong_t sa_flags;
14008d32fe5SAl Viro #else
1412a148698SDavid Howells compat_uint_t sa_flags;
14208d32fe5SAl Viro compat_uptr_t sa_handler;
14308d32fe5SAl Viro #endif
14408d32fe5SAl Viro #ifdef __ARCH_HAS_SA_RESTORER
14508d32fe5SAl Viro compat_uptr_t sa_restorer;
14608d32fe5SAl Viro #endif
14708d32fe5SAl Viro compat_sigset_t sa_mask __packed;
14808d32fe5SAl Viro };
14908d32fe5SAl Viro
150b713da69SAl Viro typedef union compat_sigval {
151b713da69SAl Viro compat_int_t sival_int;
152b713da69SAl Viro compat_uptr_t sival_ptr;
153b713da69SAl Viro } compat_sigval_t;
154b713da69SAl Viro
155b713da69SAl Viro typedef struct compat_siginfo {
156b713da69SAl Viro int si_signo;
157b713da69SAl Viro #ifndef __ARCH_HAS_SWAPPED_SIGINFO
158b713da69SAl Viro int si_errno;
159b713da69SAl Viro int si_code;
160b713da69SAl Viro #else
161b713da69SAl Viro int si_code;
162b713da69SAl Viro int si_errno;
163b713da69SAl Viro #endif
164b713da69SAl Viro
165b713da69SAl Viro union {
166b713da69SAl Viro int _pad[128/sizeof(int) - 3];
167b713da69SAl Viro
168b713da69SAl Viro /* kill() */
169b713da69SAl Viro struct {
170b713da69SAl Viro compat_pid_t _pid; /* sender's pid */
171b713da69SAl Viro __compat_uid32_t _uid; /* sender's uid */
172b713da69SAl Viro } _kill;
173b713da69SAl Viro
174b713da69SAl Viro /* POSIX.1b timers */
175b713da69SAl Viro struct {
176b713da69SAl Viro compat_timer_t _tid; /* timer id */
177b713da69SAl Viro int _overrun; /* overrun count */
178b713da69SAl Viro compat_sigval_t _sigval; /* same as below */
179b713da69SAl Viro } _timer;
180b713da69SAl Viro
181b713da69SAl Viro /* POSIX.1b signals */
182b713da69SAl Viro struct {
183b713da69SAl Viro compat_pid_t _pid; /* sender's pid */
184b713da69SAl Viro __compat_uid32_t _uid; /* sender's uid */
185b713da69SAl Viro compat_sigval_t _sigval;
186b713da69SAl Viro } _rt;
187b713da69SAl Viro
188b713da69SAl Viro /* SIGCHLD */
189b713da69SAl Viro struct {
190b713da69SAl Viro compat_pid_t _pid; /* which child */
191b713da69SAl Viro __compat_uid32_t _uid; /* sender's uid */
192b713da69SAl Viro int _status; /* exit code */
193b713da69SAl Viro compat_clock_t _utime;
194b713da69SAl Viro compat_clock_t _stime;
195b713da69SAl Viro } _sigchld;
196b713da69SAl Viro
197b713da69SAl Viro #ifdef CONFIG_X86_X32_ABI
198b713da69SAl Viro /* SIGCHLD (x32 version) */
199b713da69SAl Viro struct {
200b713da69SAl Viro compat_pid_t _pid; /* which child */
201b713da69SAl Viro __compat_uid32_t _uid; /* sender's uid */
202b713da69SAl Viro int _status; /* exit code */
203b713da69SAl Viro compat_s64 _utime;
204b713da69SAl Viro compat_s64 _stime;
205b713da69SAl Viro } _sigchld_x32;
206b713da69SAl Viro #endif
207b713da69SAl Viro
208b713da69SAl Viro /* SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP, SIGEMT */
209b713da69SAl Viro struct {
210b713da69SAl Viro compat_uptr_t _addr; /* faulting insn/memory ref. */
2118420f719SEric W. Biederman #define __COMPAT_ADDR_BND_PKEY_PAD (__alignof__(compat_uptr_t) < sizeof(short) ? \
2128420f719SEric W. Biederman sizeof(short) : __alignof__(compat_uptr_t))
213b713da69SAl Viro union {
214add0b32eSEric W. Biederman /* used on alpha and sparc */
215add0b32eSEric W. Biederman int _trapno; /* TRAP # which caused the signal */
216b68a68d3SEric W. Biederman /*
217b68a68d3SEric W. Biederman * used when si_code=BUS_MCEERR_AR or
218b68a68d3SEric W. Biederman * used when si_code=BUS_MCEERR_AO
219b68a68d3SEric W. Biederman */
220b68a68d3SEric W. Biederman short int _addr_lsb; /* Valid LSB of the reported address. */
221b713da69SAl Viro /* used when si_code=SEGV_BNDERR */
222b713da69SAl Viro struct {
2238420f719SEric W. Biederman char _dummy_bnd[__COMPAT_ADDR_BND_PKEY_PAD];
224b713da69SAl Viro compat_uptr_t _lower;
225b713da69SAl Viro compat_uptr_t _upper;
226b713da69SAl Viro } _addr_bnd;
227b713da69SAl Viro /* used when si_code=SEGV_PKUERR */
228b68a68d3SEric W. Biederman struct {
2298420f719SEric W. Biederman char _dummy_pkey[__COMPAT_ADDR_BND_PKEY_PAD];
230b713da69SAl Viro u32 _pkey;
231b68a68d3SEric W. Biederman } _addr_pkey;
232fb6cc127SMarco Elver /* used when si_code=TRAP_PERF */
2330683b531SEric W. Biederman struct {
2340683b531SEric W. Biederman compat_ulong_t _data;
2350683b531SEric W. Biederman u32 _type;
23678ed93d7SMarco Elver u32 _flags;
2370683b531SEric W. Biederman } _perf;
238b713da69SAl Viro };
239b713da69SAl Viro } _sigfault;
240b713da69SAl Viro
241b713da69SAl Viro /* SIGPOLL */
242b713da69SAl Viro struct {
243b713da69SAl Viro compat_long_t _band; /* POLL_IN, POLL_OUT, POLL_MSG */
244b713da69SAl Viro int _fd;
245b713da69SAl Viro } _sigpoll;
246b713da69SAl Viro
247b713da69SAl Viro struct {
248b713da69SAl Viro compat_uptr_t _call_addr; /* calling user insn */
249b713da69SAl Viro int _syscall; /* triggering system call number */
250b713da69SAl Viro unsigned int _arch; /* AUDIT_ARCH_* of syscall */
251b713da69SAl Viro } _sigsys;
252b713da69SAl Viro } _sifields;
253b713da69SAl Viro } compat_siginfo_t;
254b713da69SAl Viro
2551da177e4SLinus Torvalds struct compat_rlimit {
2561da177e4SLinus Torvalds compat_ulong_t rlim_cur;
2571da177e4SLinus Torvalds compat_ulong_t rlim_max;
2581da177e4SLinus Torvalds };
2591da177e4SLinus Torvalds
2603ce0f237SChristoph Hellwig #ifdef __ARCH_NEED_COMPAT_FLOCK64_PACKED
2613ce0f237SChristoph Hellwig #define __ARCH_COMPAT_FLOCK64_PACK __attribute__((packed))
2623ce0f237SChristoph Hellwig #else
2633ce0f237SChristoph Hellwig #define __ARCH_COMPAT_FLOCK64_PACK
2643ce0f237SChristoph Hellwig #endif
2653ce0f237SChristoph Hellwig
2663ce0f237SChristoph Hellwig struct compat_flock {
2673ce0f237SChristoph Hellwig short l_type;
2683ce0f237SChristoph Hellwig short l_whence;
2693ce0f237SChristoph Hellwig compat_off_t l_start;
2703ce0f237SChristoph Hellwig compat_off_t l_len;
2713ce0f237SChristoph Hellwig #ifdef __ARCH_COMPAT_FLOCK_EXTRA_SYSID
2723ce0f237SChristoph Hellwig __ARCH_COMPAT_FLOCK_EXTRA_SYSID
2733ce0f237SChristoph Hellwig #endif
2743ce0f237SChristoph Hellwig compat_pid_t l_pid;
2753ce0f237SChristoph Hellwig #ifdef __ARCH_COMPAT_FLOCK_PAD
2763ce0f237SChristoph Hellwig __ARCH_COMPAT_FLOCK_PAD
2773ce0f237SChristoph Hellwig #endif
2783ce0f237SChristoph Hellwig };
2793ce0f237SChristoph Hellwig
2803ce0f237SChristoph Hellwig struct compat_flock64 {
2813ce0f237SChristoph Hellwig short l_type;
2823ce0f237SChristoph Hellwig short l_whence;
2833ce0f237SChristoph Hellwig compat_loff_t l_start;
2843ce0f237SChristoph Hellwig compat_loff_t l_len;
2853ce0f237SChristoph Hellwig compat_pid_t l_pid;
2863ce0f237SChristoph Hellwig #ifdef __ARCH_COMPAT_FLOCK64_PAD
2873ce0f237SChristoph Hellwig __ARCH_COMPAT_FLOCK64_PAD
2883ce0f237SChristoph Hellwig #endif
2893ce0f237SChristoph Hellwig } __ARCH_COMPAT_FLOCK64_PACK;
2903ce0f237SChristoph Hellwig
2911da177e4SLinus Torvalds struct compat_rusage {
2929afc5eeeSArnd Bergmann struct old_timeval32 ru_utime;
2939afc5eeeSArnd Bergmann struct old_timeval32 ru_stime;
2941da177e4SLinus Torvalds compat_long_t ru_maxrss;
2951da177e4SLinus Torvalds compat_long_t ru_ixrss;
2961da177e4SLinus Torvalds compat_long_t ru_idrss;
2971da177e4SLinus Torvalds compat_long_t ru_isrss;
2981da177e4SLinus Torvalds compat_long_t ru_minflt;
2991da177e4SLinus Torvalds compat_long_t ru_majflt;
3001da177e4SLinus Torvalds compat_long_t ru_nswap;
3011da177e4SLinus Torvalds compat_long_t ru_inblock;
3021da177e4SLinus Torvalds compat_long_t ru_oublock;
3031da177e4SLinus Torvalds compat_long_t ru_msgsnd;
3041da177e4SLinus Torvalds compat_long_t ru_msgrcv;
3051da177e4SLinus Torvalds compat_long_t ru_nsignals;
3061da177e4SLinus Torvalds compat_long_t ru_nvcsw;
3071da177e4SLinus Torvalds compat_long_t ru_nivcsw;
3081da177e4SLinus Torvalds };
3091da177e4SLinus Torvalds
3104800a5bbSChris Metcalf extern int put_compat_rusage(const struct rusage *,
3114800a5bbSChris Metcalf struct compat_rusage __user *);
3121da177e4SLinus Torvalds
3131da177e4SLinus Torvalds struct compat_siginfo;
3147a074e96SChristoph Hellwig struct __compat_aio_sigset;
3151da177e4SLinus Torvalds
3161da177e4SLinus Torvalds struct compat_dirent {
3171da177e4SLinus Torvalds u32 d_ino;
3181da177e4SLinus Torvalds compat_off_t d_off;
3191da177e4SLinus Torvalds u16 d_reclen;
3201da177e4SLinus Torvalds char d_name[256];
3211da177e4SLinus Torvalds };
3221da177e4SLinus Torvalds
3232b1c6bd7SChristoph Hellwig struct compat_ustat {
3242b1c6bd7SChristoph Hellwig compat_daddr_t f_tfree;
3252b1c6bd7SChristoph Hellwig compat_ino_t f_tinode;
3262b1c6bd7SChristoph Hellwig char f_fname[6];
3272b1c6bd7SChristoph Hellwig char f_fpack[6];
3282b1c6bd7SChristoph Hellwig };
3292b1c6bd7SChristoph Hellwig
3301da177e4SLinus Torvalds #define COMPAT_SIGEV_PAD_SIZE ((SIGEV_MAX_SIZE/sizeof(int)) - 3)
3311da177e4SLinus Torvalds
3321da177e4SLinus Torvalds typedef struct compat_sigevent {
3331da177e4SLinus Torvalds compat_sigval_t sigev_value;
3341da177e4SLinus Torvalds compat_int_t sigev_signo;
3351da177e4SLinus Torvalds compat_int_t sigev_notify;
3361da177e4SLinus Torvalds union {
3371da177e4SLinus Torvalds compat_int_t _pad[COMPAT_SIGEV_PAD_SIZE];
3381da177e4SLinus Torvalds compat_int_t _tid;
3391da177e4SLinus Torvalds
3401da177e4SLinus Torvalds struct {
3411da177e4SLinus Torvalds compat_uptr_t _function;
3421da177e4SLinus Torvalds compat_uptr_t _attribute;
3431da177e4SLinus Torvalds } _sigev_thread;
3441da177e4SLinus Torvalds } _sigev_un;
3451da177e4SLinus Torvalds } compat_sigevent_t;
3461da177e4SLinus Torvalds
3472dceba14SArnd Bergmann struct compat_ifmap {
3482dceba14SArnd Bergmann compat_ulong_t mem_start;
3492dceba14SArnd Bergmann compat_ulong_t mem_end;
3502dceba14SArnd Bergmann unsigned short base_addr;
3512dceba14SArnd Bergmann unsigned char irq;
3522dceba14SArnd Bergmann unsigned char dma;
3532dceba14SArnd Bergmann unsigned char port;
3542dceba14SArnd Bergmann };
3552dceba14SArnd Bergmann
3564800a5bbSChris Metcalf struct compat_if_settings {
3577a50a240SArnd Bergmann unsigned int type; /* Type of physical device or protocol */
3587a50a240SArnd Bergmann unsigned int size; /* Size of the data allocated by the caller */
3597a50a240SArnd Bergmann compat_uptr_t ifs_ifsu; /* union of pointers */
3607a50a240SArnd Bergmann };
3617a50a240SArnd Bergmann
3622dceba14SArnd Bergmann struct compat_ifreq {
3632dceba14SArnd Bergmann union {
3642dceba14SArnd Bergmann char ifrn_name[IFNAMSIZ]; /* if name, e.g. "en0" */
3652dceba14SArnd Bergmann } ifr_ifrn;
3662dceba14SArnd Bergmann union {
3672dceba14SArnd Bergmann struct sockaddr ifru_addr;
3682dceba14SArnd Bergmann struct sockaddr ifru_dstaddr;
3692dceba14SArnd Bergmann struct sockaddr ifru_broadaddr;
3702dceba14SArnd Bergmann struct sockaddr ifru_netmask;
3712dceba14SArnd Bergmann struct sockaddr ifru_hwaddr;
3722dceba14SArnd Bergmann short ifru_flags;
3732dceba14SArnd Bergmann compat_int_t ifru_ivalue;
3742dceba14SArnd Bergmann compat_int_t ifru_mtu;
3752dceba14SArnd Bergmann struct compat_ifmap ifru_map;
3762dceba14SArnd Bergmann char ifru_slave[IFNAMSIZ]; /* Just fits the size */
3772dceba14SArnd Bergmann char ifru_newname[IFNAMSIZ];
3782dceba14SArnd Bergmann compat_caddr_t ifru_data;
3797a50a240SArnd Bergmann struct compat_if_settings ifru_settings;
3802dceba14SArnd Bergmann } ifr_ifru;
3812dceba14SArnd Bergmann };
3822dceba14SArnd Bergmann
3832dceba14SArnd Bergmann struct compat_ifconf {
3842dceba14SArnd Bergmann compat_int_t ifc_len; /* size of buffer */
3852dceba14SArnd Bergmann compat_caddr_t ifcbuf;
3862dceba14SArnd Bergmann };
3872dceba14SArnd Bergmann
38834f192c6SIngo Molnar struct compat_robust_list {
38934f192c6SIngo Molnar compat_uptr_t next;
39034f192c6SIngo Molnar };
39134f192c6SIngo Molnar
39234f192c6SIngo Molnar struct compat_robust_list_head {
39334f192c6SIngo Molnar struct compat_robust_list list;
39434f192c6SIngo Molnar compat_long_t futex_offset;
39534f192c6SIngo Molnar compat_uptr_t list_op_pending;
39634f192c6SIngo Molnar };
39734f192c6SIngo Molnar
398495dfbf7SAl Viro #ifdef CONFIG_COMPAT_OLD_SIGACTION
399495dfbf7SAl Viro struct compat_old_sigaction {
400495dfbf7SAl Viro compat_uptr_t sa_handler;
401495dfbf7SAl Viro compat_old_sigset_t sa_mask;
402495dfbf7SAl Viro compat_ulong_t sa_flags;
403495dfbf7SAl Viro compat_uptr_t sa_restorer;
404495dfbf7SAl Viro };
405495dfbf7SAl Viro #endif
406495dfbf7SAl Viro
407f1c316a3SStephan Mueller struct compat_keyctl_kdf_params {
408f1c316a3SStephan Mueller compat_uptr_t hashname;
409f1c316a3SStephan Mueller compat_uptr_t otherinfo;
410f1c316a3SStephan Mueller __u32 otherinfolen;
411f1c316a3SStephan Mueller __u32 __spare[8];
412f1c316a3SStephan Mueller };
413f1c316a3SStephan Mueller
4141a33b18bSArnd Bergmann struct compat_stat;
415be84cb43SChris Metcalf struct compat_statfs;
416be84cb43SChris Metcalf struct compat_statfs64;
417be84cb43SChris Metcalf struct compat_old_linux_dirent;
418be84cb43SChris Metcalf struct compat_linux_dirent;
419be84cb43SChris Metcalf struct linux_dirent64;
420be84cb43SChris Metcalf struct compat_msghdr;
421be84cb43SChris Metcalf struct compat_mmsghdr;
422be84cb43SChris Metcalf struct compat_sysinfo;
423be84cb43SChris Metcalf struct compat_sysctl_args;
424be84cb43SChris Metcalf struct compat_kexec_segment;
425be84cb43SChris Metcalf struct compat_mq_attr;
42648b25c43SChris Metcalf struct compat_msgbuf;
427be84cb43SChris Metcalf
428c3b3f524SChristoph Hellwig void copy_siginfo_to_external32(struct compat_siginfo *to,
429c3b3f524SChristoph Hellwig const struct kernel_siginfo *from);
430c3b3f524SChristoph Hellwig int copy_siginfo_from_user32(kernel_siginfo_t *to,
431c3b3f524SChristoph Hellwig const struct compat_siginfo __user *from);
432c3b3f524SChristoph Hellwig int __copy_siginfo_to_user32(struct compat_siginfo __user *to,
433c3b3f524SChristoph Hellwig const kernel_siginfo_t *from);
434c3b3f524SChristoph Hellwig #ifndef copy_siginfo_to_user32
435c3b3f524SChristoph Hellwig #define copy_siginfo_to_user32 __copy_siginfo_to_user32
436c3b3f524SChristoph Hellwig #endif
4371da177e4SLinus Torvalds int get_compat_sigevent(struct sigevent *event,
4381da177e4SLinus Torvalds const struct compat_sigevent __user *u_event);
4391da177e4SLinus Torvalds
4403968cf62SAl Viro extern int get_compat_sigset(sigset_t *set, const compat_sigset_t __user *compat);
441fde9fc76SMatt Redfearn
442fde9fc76SMatt Redfearn /*
443fde9fc76SMatt Redfearn * Defined inline such that size can be compile time constant, which avoids
444fde9fc76SMatt Redfearn * CONFIG_HARDENED_USERCOPY complaining about copies from task_struct
445fde9fc76SMatt Redfearn */
446fde9fc76SMatt Redfearn static inline int
put_compat_sigset(compat_sigset_t __user * compat,const sigset_t * set,unsigned int size)447fde9fc76SMatt Redfearn put_compat_sigset(compat_sigset_t __user *compat, const sigset_t *set,
448fde9fc76SMatt Redfearn unsigned int size)
449fde9fc76SMatt Redfearn {
450fde9fc76SMatt Redfearn /* size <= sizeof(compat_sigset_t) <= sizeof(sigset_t) */
4511a33b18bSArnd Bergmann #if defined(__BIG_ENDIAN) && defined(CONFIG_64BIT)
452fde9fc76SMatt Redfearn compat_sigset_t v;
453fde9fc76SMatt Redfearn switch (_NSIG_WORDS) {
454fde9fc76SMatt Redfearn case 4: v.sig[7] = (set->sig[3] >> 32); v.sig[6] = set->sig[3];
455df561f66SGustavo A. R. Silva fallthrough;
456fde9fc76SMatt Redfearn case 3: v.sig[5] = (set->sig[2] >> 32); v.sig[4] = set->sig[2];
457df561f66SGustavo A. R. Silva fallthrough;
458fde9fc76SMatt Redfearn case 2: v.sig[3] = (set->sig[1] >> 32); v.sig[2] = set->sig[1];
459df561f66SGustavo A. R. Silva fallthrough;
460fde9fc76SMatt Redfearn case 1: v.sig[1] = (set->sig[0] >> 32); v.sig[0] = set->sig[0];
461fde9fc76SMatt Redfearn }
462fde9fc76SMatt Redfearn return copy_to_user(compat, &v, size) ? -EFAULT : 0;
463fde9fc76SMatt Redfearn #else
464fde9fc76SMatt Redfearn return copy_to_user(compat, set, size) ? -EFAULT : 0;
465fde9fc76SMatt Redfearn #endif
466fde9fc76SMatt Redfearn }
467bebfa101SAndi Kleen
46814026b94SChristophe Leroy #ifdef CONFIG_CPU_BIG_ENDIAN
46914026b94SChristophe Leroy #define unsafe_put_compat_sigset(compat, set, label) do { \
47014026b94SChristophe Leroy compat_sigset_t __user *__c = compat; \
47114026b94SChristophe Leroy const sigset_t *__s = set; \
47214026b94SChristophe Leroy \
47314026b94SChristophe Leroy switch (_NSIG_WORDS) { \
47414026b94SChristophe Leroy case 4: \
47514026b94SChristophe Leroy unsafe_put_user(__s->sig[3] >> 32, &__c->sig[7], label); \
47614026b94SChristophe Leroy unsafe_put_user(__s->sig[3], &__c->sig[6], label); \
47714026b94SChristophe Leroy fallthrough; \
47814026b94SChristophe Leroy case 3: \
47914026b94SChristophe Leroy unsafe_put_user(__s->sig[2] >> 32, &__c->sig[5], label); \
48014026b94SChristophe Leroy unsafe_put_user(__s->sig[2], &__c->sig[4], label); \
48114026b94SChristophe Leroy fallthrough; \
48214026b94SChristophe Leroy case 2: \
48314026b94SChristophe Leroy unsafe_put_user(__s->sig[1] >> 32, &__c->sig[3], label); \
48414026b94SChristophe Leroy unsafe_put_user(__s->sig[1], &__c->sig[2], label); \
48514026b94SChristophe Leroy fallthrough; \
48614026b94SChristophe Leroy case 1: \
48714026b94SChristophe Leroy unsafe_put_user(__s->sig[0] >> 32, &__c->sig[1], label); \
48814026b94SChristophe Leroy unsafe_put_user(__s->sig[0], &__c->sig[0], label); \
48914026b94SChristophe Leroy } \
49014026b94SChristophe Leroy } while (0)
491fb05121fSChristophe Leroy
492fb05121fSChristophe Leroy #define unsafe_get_compat_sigset(set, compat, label) do { \
493fb05121fSChristophe Leroy const compat_sigset_t __user *__c = compat; \
494fb05121fSChristophe Leroy compat_sigset_word hi, lo; \
495fb05121fSChristophe Leroy sigset_t *__s = set; \
496fb05121fSChristophe Leroy \
497fb05121fSChristophe Leroy switch (_NSIG_WORDS) { \
498fb05121fSChristophe Leroy case 4: \
499fb05121fSChristophe Leroy unsafe_get_user(lo, &__c->sig[7], label); \
500fb05121fSChristophe Leroy unsafe_get_user(hi, &__c->sig[6], label); \
501fb05121fSChristophe Leroy __s->sig[3] = hi | (((long)lo) << 32); \
502fb05121fSChristophe Leroy fallthrough; \
503fb05121fSChristophe Leroy case 3: \
504fb05121fSChristophe Leroy unsafe_get_user(lo, &__c->sig[5], label); \
505fb05121fSChristophe Leroy unsafe_get_user(hi, &__c->sig[4], label); \
506fb05121fSChristophe Leroy __s->sig[2] = hi | (((long)lo) << 32); \
507fb05121fSChristophe Leroy fallthrough; \
508fb05121fSChristophe Leroy case 2: \
509fb05121fSChristophe Leroy unsafe_get_user(lo, &__c->sig[3], label); \
510fb05121fSChristophe Leroy unsafe_get_user(hi, &__c->sig[2], label); \
511fb05121fSChristophe Leroy __s->sig[1] = hi | (((long)lo) << 32); \
512fb05121fSChristophe Leroy fallthrough; \
513fb05121fSChristophe Leroy case 1: \
514fb05121fSChristophe Leroy unsafe_get_user(lo, &__c->sig[1], label); \
515fb05121fSChristophe Leroy unsafe_get_user(hi, &__c->sig[0], label); \
516fb05121fSChristophe Leroy __s->sig[0] = hi | (((long)lo) << 32); \
517fb05121fSChristophe Leroy } \
518fb05121fSChristophe Leroy } while (0)
51914026b94SChristophe Leroy #else
52014026b94SChristophe Leroy #define unsafe_put_compat_sigset(compat, set, label) do { \
52114026b94SChristophe Leroy compat_sigset_t __user *__c = compat; \
52214026b94SChristophe Leroy const sigset_t *__s = set; \
52314026b94SChristophe Leroy \
52414026b94SChristophe Leroy unsafe_copy_to_user(__c, __s, sizeof(*__c), label); \
52514026b94SChristophe Leroy } while (0)
526fb05121fSChristophe Leroy
527fb05121fSChristophe Leroy #define unsafe_get_compat_sigset(set, compat, label) do { \
528fb05121fSChristophe Leroy const compat_sigset_t __user *__c = compat; \
529fb05121fSChristophe Leroy sigset_t *__s = set; \
530fb05121fSChristophe Leroy \
531fb05121fSChristophe Leroy unsafe_copy_from_user(__s, __c, sizeof(*__c), label); \
532fb05121fSChristophe Leroy } while (0)
53314026b94SChristophe Leroy #endif
53414026b94SChristophe Leroy
535032d82d9SRoland McGrath extern int compat_ptrace_request(struct task_struct *child,
536032d82d9SRoland McGrath compat_long_t request,
537032d82d9SRoland McGrath compat_ulong_t addr, compat_ulong_t data);
538032d82d9SRoland McGrath
539c269f196SRoland McGrath extern long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
540c269f196SRoland McGrath compat_ulong_t addr, compat_ulong_t data);
541c269f196SRoland McGrath
54235280bd4SAl Viro struct epoll_event; /* fortunately, this one is fixed-layout */
5434c696ba7SHeiko Carstens
54490268439SAl Viro int compat_restore_altstack(const compat_stack_t __user *uss);
545c40702c4SAl Viro int __compat_save_altstack(compat_stack_t __user *, unsigned long);
54639f16c1cSAl Viro #define unsafe_compat_save_altstack(uss, sp, label) do { \
547bd1c149aSAl Viro compat_stack_t __user *__uss = uss; \
548bd1c149aSAl Viro struct task_struct *t = current; \
54939f16c1cSAl Viro unsafe_put_user(ptr_to_compat((void __user *)t->sas_ss_sp), \
55039f16c1cSAl Viro &__uss->ss_sp, label); \
55139f16c1cSAl Viro unsafe_put_user(t->sas_ss_flags, &__uss->ss_flags, label); \
55239f16c1cSAl Viro unsafe_put_user(t->sas_ss_size, &__uss->ss_size, label); \
553bd1c149aSAl Viro } while (0);
5548f9c0119SCatalin Marinas
555c679a089SDominik Brodowski /*
556c679a089SDominik Brodowski * These syscall function prototypes are kept in the same order as
5573e2052e5SDominik Brodowski * include/uapi/asm-generic/unistd.h. Deprecated or obsolete system calls
5583e2052e5SDominik Brodowski * go below.
559c679a089SDominik Brodowski *
560c679a089SDominik Brodowski * Please note that these prototypes here are only provided for information
561c679a089SDominik Brodowski * purposes, for static analysis, and for linking from the syscall table.
562c679a089SDominik Brodowski * These functions should not be called elsewhere from kernel code.
5637303e30eSDominik Brodowski *
5647303e30eSDominik Brodowski * As the syscall calling convention may be different from the default
5657303e30eSDominik Brodowski * for architectures overriding the syscall calling convention, do not
5667303e30eSDominik Brodowski * include the prototypes if CONFIG_ARCH_HAS_SYSCALL_WRAPPER is enabled.
567c679a089SDominik Brodowski */
5687303e30eSDominik Brodowski #ifndef CONFIG_ARCH_HAS_SYSCALL_WRAPPER
569c679a089SDominik Brodowski asmlinkage long compat_sys_io_setup(unsigned nr_reqs, u32 __user *ctx32p);
570c679a089SDominik Brodowski asmlinkage long compat_sys_io_submit(compat_aio_context_t ctx_id, int nr,
571c679a089SDominik Brodowski u32 __user *iocb);
5727a074e96SChristoph Hellwig asmlinkage long compat_sys_io_pgetevents(compat_aio_context_t ctx_id,
5737a074e96SChristoph Hellwig compat_long_t min_nr,
5747a074e96SChristoph Hellwig compat_long_t nr,
5757a074e96SChristoph Hellwig struct io_event __user *events,
5769afc5eeeSArnd Bergmann struct old_timespec32 __user *timeout,
5777a074e96SChristoph Hellwig const struct __compat_aio_sigset __user *usig);
5787a35397fSDeepa Dinamani asmlinkage long compat_sys_io_pgetevents_time64(compat_aio_context_t ctx_id,
5797a35397fSDeepa Dinamani compat_long_t min_nr,
5807a35397fSDeepa Dinamani compat_long_t nr,
5817a35397fSDeepa Dinamani struct io_event __user *events,
5827a35397fSDeepa Dinamani struct __kernel_timespec __user *timeout,
5837a35397fSDeepa Dinamani const struct __compat_aio_sigset __user *usig);
584c679a089SDominik Brodowski asmlinkage long compat_sys_lookup_dcookie(u32, u32, char __user *, compat_size_t);
585c679a089SDominik Brodowski asmlinkage long compat_sys_epoll_pwait(int epfd,
586c679a089SDominik Brodowski struct epoll_event __user *events,
587c679a089SDominik Brodowski int maxevents, int timeout,
588c679a089SDominik Brodowski const compat_sigset_t __user *sigmask,
589c679a089SDominik Brodowski compat_size_t sigsetsize);
590b0a0c261SWillem de Bruijn asmlinkage long compat_sys_epoll_pwait2(int epfd,
591b0a0c261SWillem de Bruijn struct epoll_event __user *events,
592b0a0c261SWillem de Bruijn int maxevents,
593b0a0c261SWillem de Bruijn const struct __kernel_timespec __user *timeout,
594b0a0c261SWillem de Bruijn const compat_sigset_t __user *sigmask,
595b0a0c261SWillem de Bruijn compat_size_t sigsetsize);
596c679a089SDominik Brodowski asmlinkage long compat_sys_fcntl(unsigned int fd, unsigned int cmd,
597c679a089SDominik Brodowski compat_ulong_t arg);
598c679a089SDominik Brodowski asmlinkage long compat_sys_fcntl64(unsigned int fd, unsigned int cmd,
599c679a089SDominik Brodowski compat_ulong_t arg);
600c679a089SDominik Brodowski asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd,
601c679a089SDominik Brodowski compat_ulong_t arg);
602c679a089SDominik Brodowski asmlinkage long compat_sys_statfs(const char __user *pathname,
603c679a089SDominik Brodowski struct compat_statfs __user *buf);
604c679a089SDominik Brodowski asmlinkage long compat_sys_statfs64(const char __user *pathname,
605c679a089SDominik Brodowski compat_size_t sz,
606c679a089SDominik Brodowski struct compat_statfs64 __user *buf);
607c679a089SDominik Brodowski asmlinkage long compat_sys_fstatfs(unsigned int fd,
608c679a089SDominik Brodowski struct compat_statfs __user *buf);
609c679a089SDominik Brodowski asmlinkage long compat_sys_fstatfs64(unsigned int fd, compat_size_t sz,
610c679a089SDominik Brodowski struct compat_statfs64 __user *buf);
611c679a089SDominik Brodowski asmlinkage long compat_sys_truncate(const char __user *, compat_off_t);
612c679a089SDominik Brodowski asmlinkage long compat_sys_ftruncate(unsigned int, compat_ulong_t);
613c679a089SDominik Brodowski /* No generic prototype for truncate64, ftruncate64, fallocate */
614c679a089SDominik Brodowski asmlinkage long compat_sys_openat(int dfd, const char __user *filename,
615c679a089SDominik Brodowski int flags, umode_t mode);
616c679a089SDominik Brodowski asmlinkage long compat_sys_getdents(unsigned int fd,
617c679a089SDominik Brodowski struct compat_linux_dirent __user *dirent,
618c679a089SDominik Brodowski unsigned int count);
619c679a089SDominik Brodowski asmlinkage long compat_sys_lseek(unsigned int, compat_off_t, unsigned int);
620c679a089SDominik Brodowski /* No generic prototype for pread64 and pwrite64 */
621c679a089SDominik Brodowski asmlinkage ssize_t compat_sys_preadv(compat_ulong_t fd,
6223523a9d4SChristoph Hellwig const struct iovec __user *vec,
623c679a089SDominik Brodowski compat_ulong_t vlen, u32 pos_low, u32 pos_high);
624c679a089SDominik Brodowski asmlinkage ssize_t compat_sys_pwritev(compat_ulong_t fd,
6253523a9d4SChristoph Hellwig const struct iovec __user *vec,
626c679a089SDominik Brodowski compat_ulong_t vlen, u32 pos_low, u32 pos_high);
627c679a089SDominik Brodowski #ifdef __ARCH_WANT_COMPAT_SYS_PREADV64
628c679a089SDominik Brodowski asmlinkage long compat_sys_preadv64(unsigned long fd,
6293523a9d4SChristoph Hellwig const struct iovec __user *vec,
630c679a089SDominik Brodowski unsigned long vlen, loff_t pos);
631c679a089SDominik Brodowski #endif
632c679a089SDominik Brodowski
633c679a089SDominik Brodowski #ifdef __ARCH_WANT_COMPAT_SYS_PWRITEV64
634c679a089SDominik Brodowski asmlinkage long compat_sys_pwritev64(unsigned long fd,
6353523a9d4SChristoph Hellwig const struct iovec __user *vec,
636c679a089SDominik Brodowski unsigned long vlen, loff_t pos);
637c679a089SDominik Brodowski #endif
638c679a089SDominik Brodowski asmlinkage long compat_sys_sendfile(int out_fd, int in_fd,
639c679a089SDominik Brodowski compat_off_t __user *offset, compat_size_t count);
640c679a089SDominik Brodowski asmlinkage long compat_sys_sendfile64(int out_fd, int in_fd,
641c679a089SDominik Brodowski compat_loff_t __user *offset, compat_size_t count);
6428dabe724SArnd Bergmann asmlinkage long compat_sys_pselect6_time32(int n, compat_ulong_t __user *inp,
643c679a089SDominik Brodowski compat_ulong_t __user *outp,
644c679a089SDominik Brodowski compat_ulong_t __user *exp,
6459afc5eeeSArnd Bergmann struct old_timespec32 __user *tsp,
646c679a089SDominik Brodowski void __user *sig);
647e024707bSDeepa Dinamani asmlinkage long compat_sys_pselect6_time64(int n, compat_ulong_t __user *inp,
648e024707bSDeepa Dinamani compat_ulong_t __user *outp,
649e024707bSDeepa Dinamani compat_ulong_t __user *exp,
650e024707bSDeepa Dinamani struct __kernel_timespec __user *tsp,
651e024707bSDeepa Dinamani void __user *sig);
6528dabe724SArnd Bergmann asmlinkage long compat_sys_ppoll_time32(struct pollfd __user *ufds,
653c679a089SDominik Brodowski unsigned int nfds,
6549afc5eeeSArnd Bergmann struct old_timespec32 __user *tsp,
655c679a089SDominik Brodowski const compat_sigset_t __user *sigmask,
656c679a089SDominik Brodowski compat_size_t sigsetsize);
6578bd27a30SDeepa Dinamani asmlinkage long compat_sys_ppoll_time64(struct pollfd __user *ufds,
6588bd27a30SDeepa Dinamani unsigned int nfds,
6598bd27a30SDeepa Dinamani struct __kernel_timespec __user *tsp,
6608bd27a30SDeepa Dinamani const compat_sigset_t __user *sigmask,
6618bd27a30SDeepa Dinamani compat_size_t sigsetsize);
662c679a089SDominik Brodowski asmlinkage long compat_sys_signalfd4(int ufd,
663c679a089SDominik Brodowski const compat_sigset_t __user *sigmask,
664c679a089SDominik Brodowski compat_size_t sigsetsize, int flags);
665c679a089SDominik Brodowski asmlinkage long compat_sys_newfstatat(unsigned int dfd,
666c679a089SDominik Brodowski const char __user *filename,
667c679a089SDominik Brodowski struct compat_stat __user *statbuf,
668c679a089SDominik Brodowski int flag);
669c679a089SDominik Brodowski asmlinkage long compat_sys_newfstat(unsigned int fd,
670c679a089SDominik Brodowski struct compat_stat __user *statbuf);
671*4dd595c3SSohil Mehta /* No generic prototype for sync_file_range and sync_file_range2 */
672c679a089SDominik Brodowski asmlinkage long compat_sys_waitid(int, compat_pid_t,
673c679a089SDominik Brodowski struct compat_siginfo __user *, int,
674c679a089SDominik Brodowski struct compat_rusage __user *);
675c679a089SDominik Brodowski asmlinkage long
676c679a089SDominik Brodowski compat_sys_set_robust_list(struct compat_robust_list_head __user *head,
677c679a089SDominik Brodowski compat_size_t len);
678c679a089SDominik Brodowski asmlinkage long
679c679a089SDominik Brodowski compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr,
680c679a089SDominik Brodowski compat_size_t __user *len_ptr);
681c679a089SDominik Brodowski asmlinkage long compat_sys_getitimer(int which,
682c1745f84SArnd Bergmann struct old_itimerval32 __user *it);
683c679a089SDominik Brodowski asmlinkage long compat_sys_setitimer(int which,
684c1745f84SArnd Bergmann struct old_itimerval32 __user *in,
685c1745f84SArnd Bergmann struct old_itimerval32 __user *out);
686c679a089SDominik Brodowski asmlinkage long compat_sys_kexec_load(compat_ulong_t entry,
687c679a089SDominik Brodowski compat_ulong_t nr_segments,
688c679a089SDominik Brodowski struct compat_kexec_segment __user *,
689c679a089SDominik Brodowski compat_ulong_t flags);
690c679a089SDominik Brodowski asmlinkage long compat_sys_timer_create(clockid_t which_clock,
691c679a089SDominik Brodowski struct compat_sigevent __user *timer_event_spec,
692c679a089SDominik Brodowski timer_t __user *created_timer_id);
693c679a089SDominik Brodowski asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid,
694c679a089SDominik Brodowski compat_long_t addr, compat_long_t data);
695c679a089SDominik Brodowski asmlinkage long compat_sys_sched_setaffinity(compat_pid_t pid,
696c679a089SDominik Brodowski unsigned int len,
697c679a089SDominik Brodowski compat_ulong_t __user *user_mask_ptr);
698c679a089SDominik Brodowski asmlinkage long compat_sys_sched_getaffinity(compat_pid_t pid,
699c679a089SDominik Brodowski unsigned int len,
700c679a089SDominik Brodowski compat_ulong_t __user *user_mask_ptr);
701c679a089SDominik Brodowski asmlinkage long compat_sys_sigaltstack(const compat_stack_t __user *uss_ptr,
702c679a089SDominik Brodowski compat_stack_t __user *uoss_ptr);
703c679a089SDominik Brodowski asmlinkage long compat_sys_rt_sigsuspend(compat_sigset_t __user *unewset,
704c679a089SDominik Brodowski compat_size_t sigsetsize);
705c679a089SDominik Brodowski #ifndef CONFIG_ODD_RT_SIGACTION
706c679a089SDominik Brodowski asmlinkage long compat_sys_rt_sigaction(int,
707c679a089SDominik Brodowski const struct compat_sigaction __user *,
708c679a089SDominik Brodowski struct compat_sigaction __user *,
709c679a089SDominik Brodowski compat_size_t);
710c679a089SDominik Brodowski #endif
711c679a089SDominik Brodowski asmlinkage long compat_sys_rt_sigprocmask(int how, compat_sigset_t __user *set,
712c679a089SDominik Brodowski compat_sigset_t __user *oset,
713c679a089SDominik Brodowski compat_size_t sigsetsize);
714c679a089SDominik Brodowski asmlinkage long compat_sys_rt_sigpending(compat_sigset_t __user *uset,
715c679a089SDominik Brodowski compat_size_t sigsetsize);
7168dabe724SArnd Bergmann asmlinkage long compat_sys_rt_sigtimedwait_time32(compat_sigset_t __user *uthese,
717c679a089SDominik Brodowski struct compat_siginfo __user *uinfo,
7189afc5eeeSArnd Bergmann struct old_timespec32 __user *uts, compat_size_t sigsetsize);
7192367c4b5SArnd Bergmann asmlinkage long compat_sys_rt_sigtimedwait_time64(compat_sigset_t __user *uthese,
7202367c4b5SArnd Bergmann struct compat_siginfo __user *uinfo,
7212367c4b5SArnd Bergmann struct __kernel_timespec __user *uts, compat_size_t sigsetsize);
722c679a089SDominik Brodowski asmlinkage long compat_sys_rt_sigqueueinfo(compat_pid_t pid, int sig,
723c679a089SDominik Brodowski struct compat_siginfo __user *uinfo);
724c679a089SDominik Brodowski /* No generic prototype for rt_sigreturn */
725c679a089SDominik Brodowski asmlinkage long compat_sys_times(struct compat_tms __user *tbuf);
726c679a089SDominik Brodowski asmlinkage long compat_sys_getrlimit(unsigned int resource,
727c679a089SDominik Brodowski struct compat_rlimit __user *rlim);
728c679a089SDominik Brodowski asmlinkage long compat_sys_setrlimit(unsigned int resource,
729c679a089SDominik Brodowski struct compat_rlimit __user *rlim);
730c679a089SDominik Brodowski asmlinkage long compat_sys_getrusage(int who, struct compat_rusage __user *ru);
7319afc5eeeSArnd Bergmann asmlinkage long compat_sys_gettimeofday(struct old_timeval32 __user *tv,
732c679a089SDominik Brodowski struct timezone __user *tz);
7339afc5eeeSArnd Bergmann asmlinkage long compat_sys_settimeofday(struct old_timeval32 __user *tv,
734c679a089SDominik Brodowski struct timezone __user *tz);
735c679a089SDominik Brodowski asmlinkage long compat_sys_sysinfo(struct compat_sysinfo __user *info);
736c679a089SDominik Brodowski asmlinkage long compat_sys_mq_open(const char __user *u_name,
737c679a089SDominik Brodowski int oflag, compat_mode_t mode,
738c679a089SDominik Brodowski struct compat_mq_attr __user *u_attr);
739c679a089SDominik Brodowski asmlinkage long compat_sys_mq_notify(mqd_t mqdes,
740c679a089SDominik Brodowski const struct compat_sigevent __user *u_notification);
741c679a089SDominik Brodowski asmlinkage long compat_sys_mq_getsetattr(mqd_t mqdes,
742c679a089SDominik Brodowski const struct compat_mq_attr __user *u_mqstat,
743c679a089SDominik Brodowski struct compat_mq_attr __user *u_omqstat);
744c679a089SDominik Brodowski asmlinkage long compat_sys_msgctl(int first, int second, void __user *uptr);
745c679a089SDominik Brodowski asmlinkage long compat_sys_msgrcv(int msqid, compat_uptr_t msgp,
746c679a089SDominik Brodowski compat_ssize_t msgsz, compat_long_t msgtyp, int msgflg);
747c679a089SDominik Brodowski asmlinkage long compat_sys_msgsnd(int msqid, compat_uptr_t msgp,
748c679a089SDominik Brodowski compat_ssize_t msgsz, int msgflg);
749c679a089SDominik Brodowski asmlinkage long compat_sys_semctl(int semid, int semnum, int cmd, int arg);
750c679a089SDominik Brodowski asmlinkage long compat_sys_shmctl(int first, int second, void __user *uptr);
751c679a089SDominik Brodowski asmlinkage long compat_sys_shmat(int shmid, compat_uptr_t shmaddr, int shmflg);
752c679a089SDominik Brodowski asmlinkage long compat_sys_recvfrom(int fd, void __user *buf, compat_size_t len,
753c679a089SDominik Brodowski unsigned flags, struct sockaddr __user *addr,
754c679a089SDominik Brodowski int __user *addrlen);
755c679a089SDominik Brodowski asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg,
756c679a089SDominik Brodowski unsigned flags);
757c679a089SDominik Brodowski asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg,
758c679a089SDominik Brodowski unsigned int flags);
759*4dd595c3SSohil Mehta /* No generic prototype for readahead */
760c679a089SDominik Brodowski asmlinkage long compat_sys_keyctl(u32 option,
761c679a089SDominik Brodowski u32 arg2, u32 arg3, u32 arg4, u32 arg5);
762c679a089SDominik Brodowski asmlinkage long compat_sys_execve(const char __user *filename, const compat_uptr_t __user *argv,
763c679a089SDominik Brodowski const compat_uptr_t __user *envp);
764*4dd595c3SSohil Mehta /* No generic prototype for fadvise64_64 */
765*4dd595c3SSohil Mehta /* CONFIG_MMU only */
766c679a089SDominik Brodowski asmlinkage long compat_sys_rt_tgsigqueueinfo(compat_pid_t tgid,
767c679a089SDominik Brodowski compat_pid_t pid, int sig,
768c679a089SDominik Brodowski struct compat_siginfo __user *uinfo);
769e11d4284SArnd Bergmann asmlinkage long compat_sys_recvmmsg_time64(int fd, struct compat_mmsghdr __user *mmsg,
770e11d4284SArnd Bergmann unsigned vlen, unsigned int flags,
771e11d4284SArnd Bergmann struct __kernel_timespec __user *timeout);
7728dabe724SArnd Bergmann asmlinkage long compat_sys_recvmmsg_time32(int fd, struct compat_mmsghdr __user *mmsg,
773c679a089SDominik Brodowski unsigned vlen, unsigned int flags,
7749afc5eeeSArnd Bergmann struct old_timespec32 __user *timeout);
775c679a089SDominik Brodowski asmlinkage long compat_sys_wait4(compat_pid_t pid,
776c679a089SDominik Brodowski compat_uint_t __user *stat_addr, int options,
777c679a089SDominik Brodowski struct compat_rusage __user *ru);
77891c2e0bcSAl Viro asmlinkage long compat_sys_fanotify_mark(int, unsigned int, __u32, __u32,
77991c2e0bcSAl Viro int, const char __user *);
780c679a089SDominik Brodowski asmlinkage long compat_sys_open_by_handle_at(int mountdirfd,
781c679a089SDominik Brodowski struct file_handle __user *handle,
782c679a089SDominik Brodowski int flags);
783c679a089SDominik Brodowski asmlinkage long compat_sys_sendmmsg(int fd, struct compat_mmsghdr __user *mmsg,
784c679a089SDominik Brodowski unsigned vlen, unsigned int flags);
785c679a089SDominik Brodowski asmlinkage long compat_sys_execveat(int dfd, const char __user *filename,
786c679a089SDominik Brodowski const compat_uptr_t __user *argv,
787c679a089SDominik Brodowski const compat_uptr_t __user *envp, int flags);
788c679a089SDominik Brodowski asmlinkage ssize_t compat_sys_preadv2(compat_ulong_t fd,
7893523a9d4SChristoph Hellwig const struct iovec __user *vec,
790c679a089SDominik Brodowski compat_ulong_t vlen, u32 pos_low, u32 pos_high, rwf_t flags);
791c679a089SDominik Brodowski asmlinkage ssize_t compat_sys_pwritev2(compat_ulong_t fd,
7923523a9d4SChristoph Hellwig const struct iovec __user *vec,
793c679a089SDominik Brodowski compat_ulong_t vlen, u32 pos_low, u32 pos_high, rwf_t flags);
794c679a089SDominik Brodowski #ifdef __ARCH_WANT_COMPAT_SYS_PREADV64V2
795576d0703SChristoph Hellwig asmlinkage long compat_sys_preadv64v2(unsigned long fd,
7963523a9d4SChristoph Hellwig const struct iovec __user *vec,
797c679a089SDominik Brodowski unsigned long vlen, loff_t pos, rwf_t flags);
798c679a089SDominik Brodowski #endif
7995180e3e2SAndy Lutomirski
800c679a089SDominik Brodowski #ifdef __ARCH_WANT_COMPAT_SYS_PWRITEV64V2
801c679a089SDominik Brodowski asmlinkage long compat_sys_pwritev64v2(unsigned long fd,
8023523a9d4SChristoph Hellwig const struct iovec __user *vec,
803c679a089SDominik Brodowski unsigned long vlen, loff_t pos, rwf_t flags);
804c679a089SDominik Brodowski #endif
805c679a089SDominik Brodowski
806c679a089SDominik Brodowski
807c679a089SDominik Brodowski /*
808c679a089SDominik Brodowski * Deprecated system calls which are still defined in
809c679a089SDominik Brodowski * include/uapi/asm-generic/unistd.h and wanted by >= 1 arch
810c679a089SDominik Brodowski */
811c679a089SDominik Brodowski
812c679a089SDominik Brodowski /* __ARCH_WANT_SYSCALL_NO_AT */
813c679a089SDominik Brodowski asmlinkage long compat_sys_open(const char __user *filename, int flags,
814c679a089SDominik Brodowski umode_t mode);
815c679a089SDominik Brodowski
816c679a089SDominik Brodowski /* __ARCH_WANT_SYSCALL_NO_FLAGS */
817c679a089SDominik Brodowski asmlinkage long compat_sys_signalfd(int ufd,
818c679a089SDominik Brodowski const compat_sigset_t __user *sigmask,
819c679a089SDominik Brodowski compat_size_t sigsetsize);
820c679a089SDominik Brodowski
821c679a089SDominik Brodowski /* __ARCH_WANT_SYSCALL_OFF_T */
822c679a089SDominik Brodowski asmlinkage long compat_sys_newstat(const char __user *filename,
823c679a089SDominik Brodowski struct compat_stat __user *statbuf);
824c679a089SDominik Brodowski asmlinkage long compat_sys_newlstat(const char __user *filename,
825c679a089SDominik Brodowski struct compat_stat __user *statbuf);
826c679a089SDominik Brodowski
827c679a089SDominik Brodowski /* __ARCH_WANT_SYSCALL_DEPRECATED */
828c679a089SDominik Brodowski asmlinkage long compat_sys_select(int n, compat_ulong_t __user *inp,
829c679a089SDominik Brodowski compat_ulong_t __user *outp, compat_ulong_t __user *exp,
8309afc5eeeSArnd Bergmann struct old_timeval32 __user *tvp);
831c679a089SDominik Brodowski asmlinkage long compat_sys_ustat(unsigned dev, struct compat_ustat __user *u32);
832c679a089SDominik Brodowski asmlinkage long compat_sys_recv(int fd, void __user *buf, compat_size_t len,
833c679a089SDominik Brodowski unsigned flags);
834c679a089SDominik Brodowski
835*4dd595c3SSohil Mehta /* obsolete */
836c679a089SDominik Brodowski asmlinkage long compat_sys_old_readdir(unsigned int fd,
837c679a089SDominik Brodowski struct compat_old_linux_dirent __user *,
838c679a089SDominik Brodowski unsigned int count);
839c679a089SDominik Brodowski
840*4dd595c3SSohil Mehta /* obsolete */
841c679a089SDominik Brodowski asmlinkage long compat_sys_old_select(struct compat_sel_arg_struct __user *arg);
842c679a089SDominik Brodowski
843*4dd595c3SSohil Mehta /* obsolete */
844c679a089SDominik Brodowski asmlinkage long compat_sys_ipc(u32, int, int, u32, compat_uptr_t, u32);
845c679a089SDominik Brodowski
846*4dd595c3SSohil Mehta /* obsolete */
847c679a089SDominik Brodowski #ifdef __ARCH_WANT_SYS_SIGPENDING
848c679a089SDominik Brodowski asmlinkage long compat_sys_sigpending(compat_old_sigset_t __user *set);
849c679a089SDominik Brodowski #endif
850c679a089SDominik Brodowski
851c679a089SDominik Brodowski #ifdef __ARCH_WANT_SYS_SIGPROCMASK
852c679a089SDominik Brodowski asmlinkage long compat_sys_sigprocmask(int how, compat_old_sigset_t __user *nset,
853c679a089SDominik Brodowski compat_old_sigset_t __user *oset);
854c679a089SDominik Brodowski #endif
855c679a089SDominik Brodowski #ifdef CONFIG_COMPAT_OLD_SIGACTION
856c679a089SDominik Brodowski asmlinkage long compat_sys_sigaction(int sig,
857c679a089SDominik Brodowski const struct compat_old_sigaction __user *act,
858c679a089SDominik Brodowski struct compat_old_sigaction __user *oact);
859c679a089SDominik Brodowski #endif
860c679a089SDominik Brodowski
861*4dd595c3SSohil Mehta /* obsolete */
862c679a089SDominik Brodowski asmlinkage long compat_sys_socketcall(int call, u32 __user *args);
863c679a089SDominik Brodowski
86459c10c52SGuo Ren #ifdef __ARCH_WANT_COMPAT_TRUNCATE64
86559c10c52SGuo Ren asmlinkage long compat_sys_truncate64(const char __user *pathname, compat_arg_u64(len));
86659c10c52SGuo Ren #endif
86759c10c52SGuo Ren
86859c10c52SGuo Ren #ifdef __ARCH_WANT_COMPAT_FTRUNCATE64
86959c10c52SGuo Ren asmlinkage long compat_sys_ftruncate64(unsigned int fd, compat_arg_u64(len));
87059c10c52SGuo Ren #endif
87159c10c52SGuo Ren
87259c10c52SGuo Ren #ifdef __ARCH_WANT_COMPAT_FALLOCATE
87359c10c52SGuo Ren asmlinkage long compat_sys_fallocate(int fd, int mode, compat_arg_u64(offset),
87459c10c52SGuo Ren compat_arg_u64(len));
87559c10c52SGuo Ren #endif
87659c10c52SGuo Ren
87759c10c52SGuo Ren #ifdef __ARCH_WANT_COMPAT_PREAD64
87859c10c52SGuo Ren asmlinkage long compat_sys_pread64(unsigned int fd, char __user *buf, size_t count,
87959c10c52SGuo Ren compat_arg_u64(pos));
88059c10c52SGuo Ren #endif
88159c10c52SGuo Ren
88259c10c52SGuo Ren #ifdef __ARCH_WANT_COMPAT_PWRITE64
88359c10c52SGuo Ren asmlinkage long compat_sys_pwrite64(unsigned int fd, const char __user *buf, size_t count,
88459c10c52SGuo Ren compat_arg_u64(pos));
88559c10c52SGuo Ren #endif
88659c10c52SGuo Ren
88759c10c52SGuo Ren #ifdef __ARCH_WANT_COMPAT_SYNC_FILE_RANGE
88859c10c52SGuo Ren asmlinkage long compat_sys_sync_file_range(int fd, compat_arg_u64(pos),
88959c10c52SGuo Ren compat_arg_u64(nbytes), unsigned int flags);
89059c10c52SGuo Ren #endif
89159c10c52SGuo Ren
89259c10c52SGuo Ren #ifdef __ARCH_WANT_COMPAT_FADVISE64_64
89359c10c52SGuo Ren asmlinkage long compat_sys_fadvise64_64(int fd, compat_arg_u64(pos),
89459c10c52SGuo Ren compat_arg_u64(len), int advice);
89559c10c52SGuo Ren #endif
89659c10c52SGuo Ren
89759c10c52SGuo Ren #ifdef __ARCH_WANT_COMPAT_READAHEAD
89859c10c52SGuo Ren asmlinkage long compat_sys_readahead(int fd, compat_arg_u64(offset), size_t count);
89959c10c52SGuo Ren #endif
90059c10c52SGuo Ren
9017303e30eSDominik Brodowski #endif /* CONFIG_ARCH_HAS_SYSCALL_WRAPPER */
9027303e30eSDominik Brodowski
903cd19c364SFrederic Weisbecker /**
9049afc5eeeSArnd Bergmann * ns_to_old_timeval32 - Compat version of ns_to_timeval
905cd19c364SFrederic Weisbecker * @nsec: the nanoseconds value to be converted
906cd19c364SFrederic Weisbecker *
9079afc5eeeSArnd Bergmann * Returns the old_timeval32 representation of the nsec parameter.
908cd19c364SFrederic Weisbecker */
ns_to_old_timeval32(s64 nsec)9099afc5eeeSArnd Bergmann static inline struct old_timeval32 ns_to_old_timeval32(s64 nsec)
910cd19c364SFrederic Weisbecker {
911693737b6SArnd Bergmann struct __kernel_old_timeval tv;
9129afc5eeeSArnd Bergmann struct old_timeval32 ctv;
913cd19c364SFrederic Weisbecker
914693737b6SArnd Bergmann tv = ns_to_kernel_old_timeval(nsec);
915cd19c364SFrederic Weisbecker ctv.tv_sec = tv.tv_sec;
916cd19c364SFrederic Weisbecker ctv.tv_usec = tv.tv_usec;
917cd19c364SFrederic Weisbecker
918cd19c364SFrederic Weisbecker return ctv;
919cd19c364SFrederic Weisbecker }
920cd19c364SFrederic Weisbecker
9219b54bf9dSMark Rutland /*
9229b54bf9dSMark Rutland * Kernel code should not call compat syscalls (i.e., compat_sys_xyzyyz())
9239b54bf9dSMark Rutland * directly. Instead, use one of the functions which work equivalently, such
9249b54bf9dSMark Rutland * as the kcompat_sys_xyzyyz() functions prototyped below.
9259b54bf9dSMark Rutland */
9269b54bf9dSMark Rutland
9279b54bf9dSMark Rutland int kcompat_sys_statfs64(const char __user * pathname, compat_size_t sz,
9289b54bf9dSMark Rutland struct compat_statfs64 __user * buf);
9299b54bf9dSMark Rutland int kcompat_sys_fstatfs64(unsigned int fd, compat_size_t sz,
9309b54bf9dSMark Rutland struct compat_statfs64 __user * buf);
9319b54bf9dSMark Rutland
9321a33b18bSArnd Bergmann #ifdef CONFIG_COMPAT
9331a33b18bSArnd Bergmann
9341a33b18bSArnd Bergmann /*
9351a33b18bSArnd Bergmann * For most but not all architectures, "am I in a compat syscall?" and
9361a33b18bSArnd Bergmann * "am I a compat task?" are the same question. For architectures on which
9371a33b18bSArnd Bergmann * they aren't the same question, arch code can override in_compat_syscall.
9381a33b18bSArnd Bergmann */
9391a33b18bSArnd Bergmann #ifndef in_compat_syscall
in_compat_syscall(void)9401a33b18bSArnd Bergmann static inline bool in_compat_syscall(void) { return is_compat_task(); }
9411a33b18bSArnd Bergmann #endif
9421a33b18bSArnd Bergmann
943cd19c364SFrederic Weisbecker #else /* !CONFIG_COMPAT */
9443c761ea0SLinus Torvalds
9453c761ea0SLinus Torvalds #define is_compat_task() (0)
946a846446bSDmitry Safonov /* Ensure no one redefines in_compat_syscall() under !CONFIG_COMPAT */
947a846446bSDmitry Safonov #define in_compat_syscall in_compat_syscall
in_compat_syscall(void)9485180e3e2SAndy Lutomirski static inline bool in_compat_syscall(void) { return false; }
9493c761ea0SLinus Torvalds
9501da177e4SLinus Torvalds #endif /* CONFIG_COMPAT */
9515180e3e2SAndy Lutomirski
952e130242dSArnd Bergmann #define BITS_PER_COMPAT_LONG (8*sizeof(compat_long_t))
953e130242dSArnd Bergmann
954e130242dSArnd Bergmann #define BITS_TO_COMPAT_LONGS(bits) DIV_ROUND_UP(bits, BITS_PER_COMPAT_LONG)
955e130242dSArnd Bergmann
956e130242dSArnd Bergmann long compat_get_bitmap(unsigned long *mask, const compat_ulong_t __user *umask,
957e130242dSArnd Bergmann unsigned long bitmap_size);
958e130242dSArnd Bergmann long compat_put_bitmap(compat_ulong_t __user *umask, unsigned long *mask,
959e130242dSArnd Bergmann unsigned long bitmap_size);
960e130242dSArnd Bergmann
961202bf8d7SArnd Bergmann /*
962527c4125SChristoph Hellwig * Some legacy ABIs like the i386 one use less than natural alignment for 64-bit
963527c4125SChristoph Hellwig * types, and will need special compat treatment for that. Most architectures
964527c4125SChristoph Hellwig * don't need that special handling even for compat syscalls.
965527c4125SChristoph Hellwig */
966527c4125SChristoph Hellwig #ifndef compat_need_64bit_alignment_fixup
967527c4125SChristoph Hellwig #define compat_need_64bit_alignment_fixup() false
968527c4125SChristoph Hellwig #endif
969527c4125SChristoph Hellwig
970527c4125SChristoph Hellwig /*
971202bf8d7SArnd Bergmann * A pointer passed in from user mode. This should not
972202bf8d7SArnd Bergmann * be used for syscall parameters, just declare them
973202bf8d7SArnd Bergmann * as pointers because the syscall entry code will have
974202bf8d7SArnd Bergmann * appropriately converted them already.
975202bf8d7SArnd Bergmann */
976202bf8d7SArnd Bergmann #ifndef compat_ptr
compat_ptr(compat_uptr_t uptr)977202bf8d7SArnd Bergmann static inline void __user *compat_ptr(compat_uptr_t uptr)
978202bf8d7SArnd Bergmann {
979202bf8d7SArnd Bergmann return (void __user *)(unsigned long)uptr;
980202bf8d7SArnd Bergmann }
981202bf8d7SArnd Bergmann #endif
982202bf8d7SArnd Bergmann
ptr_to_compat(void __user * uptr)983202bf8d7SArnd Bergmann static inline compat_uptr_t ptr_to_compat(void __user *uptr)
984202bf8d7SArnd Bergmann {
985202bf8d7SArnd Bergmann return (u32)(unsigned long)uptr;
986202bf8d7SArnd Bergmann }
987202bf8d7SArnd Bergmann
9881da177e4SLinus Torvalds #endif /* _LINUX_COMPAT_H */
989