xref: /openbmc/linux/include/linux/compat.h (revision 4dd595c3)
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