• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /* SPDX-License-Identifier: GPL-2.0 */
2  #ifndef _LINUX_COMPAT_H
3  #define _LINUX_COMPAT_H
4  /*
5   * These are the type definitions for the architecture specific
6   * syscall compatibility layer.
7   */
8  
9  #include <linux/types.h>
10  #include <linux/time.h>
11  
12  #include <linux/stat.h>
13  #include <linux/param.h>	/* for HZ */
14  #include <linux/sem.h>
15  #include <linux/socket.h>
16  #include <linux/if.h>
17  #include <linux/fs.h>
18  #include <linux/aio_abi.h>	/* for aio_context_t */
19  #include <linux/uaccess.h>
20  #include <linux/unistd.h>
21  
22  #include <asm/compat.h>
23  
24  #ifdef CONFIG_COMPAT
25  #include <asm/siginfo.h>
26  #include <asm/signal.h>
27  #endif
28  
29  #ifdef CONFIG_ARCH_HAS_SYSCALL_WRAPPER
30  /*
31   * It may be useful for an architecture to override the definitions of the
32   * COMPAT_SYSCALL_DEFINE0 and COMPAT_SYSCALL_DEFINEx() macros, in particular
33   * to use a different calling convention for syscalls. To allow for that,
34   + the prototypes for the compat_sys_*() functions below will *not* be included
35   * if CONFIG_ARCH_HAS_SYSCALL_WRAPPER is enabled.
36   */
37  #include <asm/syscall_wrapper.h>
38  #endif /* CONFIG_ARCH_HAS_SYSCALL_WRAPPER */
39  
40  #ifndef COMPAT_USE_64BIT_TIME
41  #define COMPAT_USE_64BIT_TIME 0
42  #endif
43  
44  #ifndef __SC_DELOUSE
45  #define __SC_DELOUSE(t,v) ((__force t)(unsigned long)(v))
46  #endif
47  
48  #ifndef COMPAT_SYSCALL_DEFINE0
49  #define COMPAT_SYSCALL_DEFINE0(name) \
50  	asmlinkage long compat_sys_##name(void); \
51  	ALLOW_ERROR_INJECTION(compat_sys_##name, ERRNO); \
52  	asmlinkage long compat_sys_##name(void)
53  #endif /* COMPAT_SYSCALL_DEFINE0 */
54  
55  #define COMPAT_SYSCALL_DEFINE1(name, ...) \
56          COMPAT_SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
57  #define COMPAT_SYSCALL_DEFINE2(name, ...) \
58  	COMPAT_SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
59  #define COMPAT_SYSCALL_DEFINE3(name, ...) \
60  	COMPAT_SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
61  #define COMPAT_SYSCALL_DEFINE4(name, ...) \
62  	COMPAT_SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
63  #define COMPAT_SYSCALL_DEFINE5(name, ...) \
64  	COMPAT_SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
65  #define COMPAT_SYSCALL_DEFINE6(name, ...) \
66  	COMPAT_SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
67  
68  /*
69   * The asmlinkage stub is aliased to a function named __se_compat_sys_*() which
70   * sign-extends 32-bit ints to longs whenever needed. The actual work is
71   * done within __do_compat_sys_*().
72   */
73  #ifndef COMPAT_SYSCALL_DEFINEx
74  #define COMPAT_SYSCALL_DEFINEx(x, name, ...)					\
75  	__diag_push();								\
76  	__diag_ignore(GCC, 8, "-Wattribute-alias",				\
77  		      "Type aliasing is used to sanitize syscall arguments");\
78  	asmlinkage long compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));	\
79  	asmlinkage long compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))	\
80  		__attribute__((alias(__stringify(__se_compat_sys##name))));	\
81  	ALLOW_ERROR_INJECTION(compat_sys##name, ERRNO);				\
82  	static inline long __do_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));\
83  	asmlinkage long __se_compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__));	\
84  	asmlinkage long __se_compat_sys##name(__MAP(x,__SC_LONG,__VA_ARGS__))	\
85  	{									\
86  		long ret = __do_compat_sys##name(__MAP(x,__SC_DELOUSE,__VA_ARGS__));\
87  		__MAP(x,__SC_TEST,__VA_ARGS__);					\
88  		return ret;							\
89  	}									\
90  	__diag_pop();								\
91  	static inline long __do_compat_sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))
92  #endif /* COMPAT_SYSCALL_DEFINEx */
93  
94  #ifdef CONFIG_COMPAT
95  
96  #ifndef compat_user_stack_pointer
97  #define compat_user_stack_pointer() current_user_stack_pointer()
98  #endif
99  #ifndef compat_sigaltstack	/* we'll need that for MIPS */
100  typedef struct compat_sigaltstack {
101  	compat_uptr_t			ss_sp;
102  	int				ss_flags;
103  	compat_size_t			ss_size;
104  } compat_stack_t;
105  #endif
106  #ifndef COMPAT_MINSIGSTKSZ
107  #define COMPAT_MINSIGSTKSZ	MINSIGSTKSZ
108  #endif
109  
110  #define compat_jiffies_to_clock_t(x)	\
111  		(((unsigned long)(x) * COMPAT_USER_HZ) / HZ)
112  
113  typedef __compat_uid32_t	compat_uid_t;
114  typedef __compat_gid32_t	compat_gid_t;
115  
116  struct compat_sel_arg_struct;
117  struct rusage;
118  
119  struct compat_itimerval {
120  	struct old_timeval32	it_interval;
121  	struct old_timeval32	it_value;
122  };
123  
124  struct itimerval;
125  int get_compat_itimerval(struct itimerval *, const struct compat_itimerval __user *);
126  int put_compat_itimerval(struct compat_itimerval __user *, const struct itimerval *);
127  
128  struct compat_tms {
129  	compat_clock_t		tms_utime;
130  	compat_clock_t		tms_stime;
131  	compat_clock_t		tms_cutime;
132  	compat_clock_t		tms_cstime;
133  };
134  
135  #define _COMPAT_NSIG_WORDS	(_COMPAT_NSIG / _COMPAT_NSIG_BPW)
136  
137  typedef struct {
138  	compat_sigset_word	sig[_COMPAT_NSIG_WORDS];
139  } compat_sigset_t;
140  
141  int set_compat_user_sigmask(const compat_sigset_t __user *umask,
142  			    size_t sigsetsize);
143  
144  struct compat_sigaction {
145  #ifndef __ARCH_HAS_IRIX_SIGACTION
146  	compat_uptr_t			sa_handler;
147  	compat_ulong_t			sa_flags;
148  #else
149  	compat_uint_t			sa_flags;
150  	compat_uptr_t			sa_handler;
151  #endif
152  #ifdef __ARCH_HAS_SA_RESTORER
153  	compat_uptr_t			sa_restorer;
154  #endif
155  	compat_sigset_t			sa_mask __packed;
156  };
157  
158  typedef union compat_sigval {
159  	compat_int_t	sival_int;
160  	compat_uptr_t	sival_ptr;
161  } compat_sigval_t;
162  
163  typedef struct compat_siginfo {
164  	int si_signo;
165  #ifndef __ARCH_HAS_SWAPPED_SIGINFO
166  	int si_errno;
167  	int si_code;
168  #else
169  	int si_code;
170  	int si_errno;
171  #endif
172  
173  	union {
174  		int _pad[128/sizeof(int) - 3];
175  
176  		/* kill() */
177  		struct {
178  			compat_pid_t _pid;	/* sender's pid */
179  			__compat_uid32_t _uid;	/* sender's uid */
180  		} _kill;
181  
182  		/* POSIX.1b timers */
183  		struct {
184  			compat_timer_t _tid;	/* timer id */
185  			int _overrun;		/* overrun count */
186  			compat_sigval_t _sigval;	/* same as below */
187  		} _timer;
188  
189  		/* POSIX.1b signals */
190  		struct {
191  			compat_pid_t _pid;	/* sender's pid */
192  			__compat_uid32_t _uid;	/* sender's uid */
193  			compat_sigval_t _sigval;
194  		} _rt;
195  
196  		/* SIGCHLD */
197  		struct {
198  			compat_pid_t _pid;	/* which child */
199  			__compat_uid32_t _uid;	/* sender's uid */
200  			int _status;		/* exit code */
201  			compat_clock_t _utime;
202  			compat_clock_t _stime;
203  		} _sigchld;
204  
205  #ifdef CONFIG_X86_X32_ABI
206  		/* SIGCHLD (x32 version) */
207  		struct {
208  			compat_pid_t _pid;	/* which child */
209  			__compat_uid32_t _uid;	/* sender's uid */
210  			int _status;		/* exit code */
211  			compat_s64 _utime;
212  			compat_s64 _stime;
213  		} _sigchld_x32;
214  #endif
215  
216  		/* SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP, SIGEMT */
217  		struct {
218  			compat_uptr_t _addr;	/* faulting insn/memory ref. */
219  #ifdef __ARCH_SI_TRAPNO
220  			int _trapno;	/* TRAP # which caused the signal */
221  #endif
222  #define __COMPAT_ADDR_BND_PKEY_PAD  (__alignof__(compat_uptr_t) < sizeof(short) ? \
223  				     sizeof(short) : __alignof__(compat_uptr_t))
224  			union {
225  				/*
226  				 * used when si_code=BUS_MCEERR_AR or
227  				 * used when si_code=BUS_MCEERR_AO
228  				 */
229  				short int _addr_lsb;	/* Valid LSB of the reported address. */
230  				/* used when si_code=SEGV_BNDERR */
231  				struct {
232  					char _dummy_bnd[__COMPAT_ADDR_BND_PKEY_PAD];
233  					compat_uptr_t _lower;
234  					compat_uptr_t _upper;
235  				} _addr_bnd;
236  				/* used when si_code=SEGV_PKUERR */
237  				struct {
238  					char _dummy_pkey[__COMPAT_ADDR_BND_PKEY_PAD];
239  					u32 _pkey;
240  				} _addr_pkey;
241  			};
242  		} _sigfault;
243  
244  		/* SIGPOLL */
245  		struct {
246  			compat_long_t _band;	/* POLL_IN, POLL_OUT, POLL_MSG */
247  			int _fd;
248  		} _sigpoll;
249  
250  		struct {
251  			compat_uptr_t _call_addr; /* calling user insn */
252  			int _syscall;	/* triggering system call number */
253  			unsigned int _arch;	/* AUDIT_ARCH_* of syscall */
254  		} _sigsys;
255  	} _sifields;
256  } compat_siginfo_t;
257  
258  /*
259   * These functions operate on 32- or 64-bit specs depending on
260   * COMPAT_USE_64BIT_TIME, hence the void user pointer arguments.
261   */
262  extern int compat_get_timespec(struct timespec *, const void __user *);
263  extern int compat_put_timespec(const struct timespec *, void __user *);
264  extern int compat_get_timeval(struct timeval *, const void __user *);
265  extern int compat_put_timeval(const struct timeval *, void __user *);
266  
267  struct compat_iovec {
268  	compat_uptr_t	iov_base;
269  	compat_size_t	iov_len;
270  };
271  
272  struct compat_rlimit {
273  	compat_ulong_t	rlim_cur;
274  	compat_ulong_t	rlim_max;
275  };
276  
277  struct compat_rusage {
278  	struct old_timeval32 ru_utime;
279  	struct old_timeval32 ru_stime;
280  	compat_long_t	ru_maxrss;
281  	compat_long_t	ru_ixrss;
282  	compat_long_t	ru_idrss;
283  	compat_long_t	ru_isrss;
284  	compat_long_t	ru_minflt;
285  	compat_long_t	ru_majflt;
286  	compat_long_t	ru_nswap;
287  	compat_long_t	ru_inblock;
288  	compat_long_t	ru_oublock;
289  	compat_long_t	ru_msgsnd;
290  	compat_long_t	ru_msgrcv;
291  	compat_long_t	ru_nsignals;
292  	compat_long_t	ru_nvcsw;
293  	compat_long_t	ru_nivcsw;
294  };
295  
296  extern int put_compat_rusage(const struct rusage *,
297  			     struct compat_rusage __user *);
298  
299  struct compat_siginfo;
300  struct __compat_aio_sigset;
301  
302  struct compat_dirent {
303  	u32		d_ino;
304  	compat_off_t	d_off;
305  	u16		d_reclen;
306  	char		d_name[256];
307  };
308  
309  struct compat_ustat {
310  	compat_daddr_t		f_tfree;
311  	compat_ino_t		f_tinode;
312  	char			f_fname[6];
313  	char			f_fpack[6];
314  };
315  
316  #define COMPAT_SIGEV_PAD_SIZE	((SIGEV_MAX_SIZE/sizeof(int)) - 3)
317  
318  typedef struct compat_sigevent {
319  	compat_sigval_t sigev_value;
320  	compat_int_t sigev_signo;
321  	compat_int_t sigev_notify;
322  	union {
323  		compat_int_t _pad[COMPAT_SIGEV_PAD_SIZE];
324  		compat_int_t _tid;
325  
326  		struct {
327  			compat_uptr_t _function;
328  			compat_uptr_t _attribute;
329  		} _sigev_thread;
330  	} _sigev_un;
331  } compat_sigevent_t;
332  
333  struct compat_ifmap {
334  	compat_ulong_t mem_start;
335  	compat_ulong_t mem_end;
336  	unsigned short base_addr;
337  	unsigned char irq;
338  	unsigned char dma;
339  	unsigned char port;
340  };
341  
342  struct compat_if_settings {
343  	unsigned int type;	/* Type of physical device or protocol */
344  	unsigned int size;	/* Size of the data allocated by the caller */
345  	compat_uptr_t ifs_ifsu;	/* union of pointers */
346  };
347  
348  struct compat_ifreq {
349  	union {
350  		char	ifrn_name[IFNAMSIZ];    /* if name, e.g. "en0" */
351  	} ifr_ifrn;
352  	union {
353  		struct	sockaddr ifru_addr;
354  		struct	sockaddr ifru_dstaddr;
355  		struct	sockaddr ifru_broadaddr;
356  		struct	sockaddr ifru_netmask;
357  		struct	sockaddr ifru_hwaddr;
358  		short	ifru_flags;
359  		compat_int_t	ifru_ivalue;
360  		compat_int_t	ifru_mtu;
361  		struct	compat_ifmap ifru_map;
362  		char	ifru_slave[IFNAMSIZ];   /* Just fits the size */
363  		char	ifru_newname[IFNAMSIZ];
364  		compat_caddr_t	ifru_data;
365  		struct	compat_if_settings ifru_settings;
366  	} ifr_ifru;
367  };
368  
369  struct compat_ifconf {
370  	compat_int_t	ifc_len;                /* size of buffer */
371  	compat_caddr_t  ifcbuf;
372  };
373  
374  struct compat_robust_list {
375  	compat_uptr_t			next;
376  };
377  
378  struct compat_robust_list_head {
379  	struct compat_robust_list	list;
380  	compat_long_t			futex_offset;
381  	compat_uptr_t			list_op_pending;
382  };
383  
384  #ifdef CONFIG_COMPAT_OLD_SIGACTION
385  struct compat_old_sigaction {
386  	compat_uptr_t			sa_handler;
387  	compat_old_sigset_t		sa_mask;
388  	compat_ulong_t			sa_flags;
389  	compat_uptr_t			sa_restorer;
390  };
391  #endif
392  
393  struct compat_keyctl_kdf_params {
394  	compat_uptr_t hashname;
395  	compat_uptr_t otherinfo;
396  	__u32 otherinfolen;
397  	__u32 __spare[8];
398  };
399  
400  struct compat_statfs;
401  struct compat_statfs64;
402  struct compat_old_linux_dirent;
403  struct compat_linux_dirent;
404  struct linux_dirent64;
405  struct compat_msghdr;
406  struct compat_mmsghdr;
407  struct compat_sysinfo;
408  struct compat_sysctl_args;
409  struct compat_kexec_segment;
410  struct compat_mq_attr;
411  struct compat_msgbuf;
412  
413  #define BITS_PER_COMPAT_LONG    (8*sizeof(compat_long_t))
414  
415  #define BITS_TO_COMPAT_LONGS(bits) DIV_ROUND_UP(bits, BITS_PER_COMPAT_LONG)
416  
417  long compat_get_bitmap(unsigned long *mask, const compat_ulong_t __user *umask,
418  		       unsigned long bitmap_size);
419  long compat_put_bitmap(compat_ulong_t __user *umask, unsigned long *mask,
420  		       unsigned long bitmap_size);
421  int copy_siginfo_from_user32(kernel_siginfo_t *to, const struct compat_siginfo __user *from);
422  int copy_siginfo_to_user32(struct compat_siginfo __user *to, const kernel_siginfo_t *from);
423  int get_compat_sigevent(struct sigevent *event,
424  		const struct compat_sigevent __user *u_event);
425  
old_timeval32_compare(struct old_timeval32 * lhs,struct old_timeval32 * rhs)426  static inline int old_timeval32_compare(struct old_timeval32 *lhs,
427  					struct old_timeval32 *rhs)
428  {
429  	if (lhs->tv_sec < rhs->tv_sec)
430  		return -1;
431  	if (lhs->tv_sec > rhs->tv_sec)
432  		return 1;
433  	return lhs->tv_usec - rhs->tv_usec;
434  }
435  
old_timespec32_compare(struct old_timespec32 * lhs,struct old_timespec32 * rhs)436  static inline int old_timespec32_compare(struct old_timespec32 *lhs,
437  					struct old_timespec32 *rhs)
438  {
439  	if (lhs->tv_sec < rhs->tv_sec)
440  		return -1;
441  	if (lhs->tv_sec > rhs->tv_sec)
442  		return 1;
443  	return lhs->tv_nsec - rhs->tv_nsec;
444  }
445  
446  extern int get_compat_sigset(sigset_t *set, const compat_sigset_t __user *compat);
447  
448  /*
449   * Defined inline such that size can be compile time constant, which avoids
450   * CONFIG_HARDENED_USERCOPY complaining about copies from task_struct
451   */
452  static inline int
put_compat_sigset(compat_sigset_t __user * compat,const sigset_t * set,unsigned int size)453  put_compat_sigset(compat_sigset_t __user *compat, const sigset_t *set,
454  		  unsigned int size)
455  {
456  	/* size <= sizeof(compat_sigset_t) <= sizeof(sigset_t) */
457  #ifdef __BIG_ENDIAN
458  	compat_sigset_t v;
459  	switch (_NSIG_WORDS) {
460  	case 4: v.sig[7] = (set->sig[3] >> 32); v.sig[6] = set->sig[3];
461  		/* fall through */
462  	case 3: v.sig[5] = (set->sig[2] >> 32); v.sig[4] = set->sig[2];
463  		/* fall through */
464  	case 2: v.sig[3] = (set->sig[1] >> 32); v.sig[2] = set->sig[1];
465  		/* fall through */
466  	case 1: v.sig[1] = (set->sig[0] >> 32); v.sig[0] = set->sig[0];
467  	}
468  	return copy_to_user(compat, &v, size) ? -EFAULT : 0;
469  #else
470  	return copy_to_user(compat, set, size) ? -EFAULT : 0;
471  #endif
472  }
473  
474  extern int compat_ptrace_request(struct task_struct *child,
475  				 compat_long_t request,
476  				 compat_ulong_t addr, compat_ulong_t data);
477  
478  extern long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
479  			       compat_ulong_t addr, compat_ulong_t data);
480  
481  struct epoll_event;	/* fortunately, this one is fixed-layout */
482  
483  extern ssize_t compat_rw_copy_check_uvector(int type,
484  		const struct compat_iovec __user *uvector,
485  		unsigned long nr_segs,
486  		unsigned long fast_segs, struct iovec *fast_pointer,
487  		struct iovec **ret_pointer);
488  
489  extern void __user *compat_alloc_user_space(unsigned long len);
490  
491  int compat_restore_altstack(const compat_stack_t __user *uss);
492  int __compat_save_altstack(compat_stack_t __user *, unsigned long);
493  #define compat_save_altstack_ex(uss, sp) do { \
494  	compat_stack_t __user *__uss = uss; \
495  	struct task_struct *t = current; \
496  	put_user_ex(ptr_to_compat((void __user *)t->sas_ss_sp), &__uss->ss_sp); \
497  	put_user_ex(t->sas_ss_flags, &__uss->ss_flags); \
498  	put_user_ex(t->sas_ss_size, &__uss->ss_size); \
499  	if (t->sas_ss_flags & SS_AUTODISARM) \
500  		sas_ss_reset(t); \
501  } while (0);
502  
503  /*
504   * These syscall function prototypes are kept in the same order as
505   * include/uapi/asm-generic/unistd.h. Deprecated or obsolete system calls
506   * go below.
507   *
508   * Please note that these prototypes here are only provided for information
509   * purposes, for static analysis, and for linking from the syscall table.
510   * These functions should not be called elsewhere from kernel code.
511   *
512   * As the syscall calling convention may be different from the default
513   * for architectures overriding the syscall calling convention, do not
514   * include the prototypes if CONFIG_ARCH_HAS_SYSCALL_WRAPPER is enabled.
515   */
516  #ifndef CONFIG_ARCH_HAS_SYSCALL_WRAPPER
517  asmlinkage long compat_sys_io_setup(unsigned nr_reqs, u32 __user *ctx32p);
518  asmlinkage long compat_sys_io_submit(compat_aio_context_t ctx_id, int nr,
519  				     u32 __user *iocb);
520  asmlinkage long compat_sys_io_pgetevents(compat_aio_context_t ctx_id,
521  					compat_long_t min_nr,
522  					compat_long_t nr,
523  					struct io_event __user *events,
524  					struct old_timespec32 __user *timeout,
525  					const struct __compat_aio_sigset __user *usig);
526  asmlinkage long compat_sys_io_pgetevents_time64(compat_aio_context_t ctx_id,
527  					compat_long_t min_nr,
528  					compat_long_t nr,
529  					struct io_event __user *events,
530  					struct __kernel_timespec __user *timeout,
531  					const struct __compat_aio_sigset __user *usig);
532  
533  /* fs/cookies.c */
534  asmlinkage long compat_sys_lookup_dcookie(u32, u32, char __user *, compat_size_t);
535  
536  /* fs/eventpoll.c */
537  asmlinkage long compat_sys_epoll_pwait(int epfd,
538  			struct epoll_event __user *events,
539  			int maxevents, int timeout,
540  			const compat_sigset_t __user *sigmask,
541  			compat_size_t sigsetsize);
542  
543  /* fs/fcntl.c */
544  asmlinkage long compat_sys_fcntl(unsigned int fd, unsigned int cmd,
545  				 compat_ulong_t arg);
546  asmlinkage long compat_sys_fcntl64(unsigned int fd, unsigned int cmd,
547  				   compat_ulong_t arg);
548  
549  /* fs/ioctl.c */
550  asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd,
551  				 compat_ulong_t arg);
552  
553  /* fs/namespace.c */
554  asmlinkage long compat_sys_mount(const char __user *dev_name,
555  				 const char __user *dir_name,
556  				 const char __user *type, compat_ulong_t flags,
557  				 const void __user *data);
558  
559  /* fs/open.c */
560  asmlinkage long compat_sys_statfs(const char __user *pathname,
561  				  struct compat_statfs __user *buf);
562  asmlinkage long compat_sys_statfs64(const char __user *pathname,
563  				    compat_size_t sz,
564  				    struct compat_statfs64 __user *buf);
565  asmlinkage long compat_sys_fstatfs(unsigned int fd,
566  				   struct compat_statfs __user *buf);
567  asmlinkage long compat_sys_fstatfs64(unsigned int fd, compat_size_t sz,
568  				     struct compat_statfs64 __user *buf);
569  asmlinkage long compat_sys_truncate(const char __user *, compat_off_t);
570  asmlinkage long compat_sys_ftruncate(unsigned int, compat_ulong_t);
571  /* No generic prototype for truncate64, ftruncate64, fallocate */
572  asmlinkage long compat_sys_openat(int dfd, const char __user *filename,
573  				  int flags, umode_t mode);
574  
575  /* fs/readdir.c */
576  asmlinkage long compat_sys_getdents(unsigned int fd,
577  				    struct compat_linux_dirent __user *dirent,
578  				    unsigned int count);
579  
580  /* fs/read_write.c */
581  asmlinkage long compat_sys_lseek(unsigned int, compat_off_t, unsigned int);
582  asmlinkage ssize_t compat_sys_readv(compat_ulong_t fd,
583  		const struct compat_iovec __user *vec, compat_ulong_t vlen);
584  asmlinkage ssize_t compat_sys_writev(compat_ulong_t fd,
585  		const struct compat_iovec __user *vec, compat_ulong_t vlen);
586  /* No generic prototype for pread64 and pwrite64 */
587  asmlinkage ssize_t compat_sys_preadv(compat_ulong_t fd,
588  		const struct compat_iovec __user *vec,
589  		compat_ulong_t vlen, u32 pos_low, u32 pos_high);
590  asmlinkage ssize_t compat_sys_pwritev(compat_ulong_t fd,
591  		const struct compat_iovec __user *vec,
592  		compat_ulong_t vlen, u32 pos_low, u32 pos_high);
593  #ifdef __ARCH_WANT_COMPAT_SYS_PREADV64
594  asmlinkage long compat_sys_preadv64(unsigned long fd,
595  		const struct compat_iovec __user *vec,
596  		unsigned long vlen, loff_t pos);
597  #endif
598  
599  #ifdef __ARCH_WANT_COMPAT_SYS_PWRITEV64
600  asmlinkage long compat_sys_pwritev64(unsigned long fd,
601  		const struct compat_iovec __user *vec,
602  		unsigned long vlen, loff_t pos);
603  #endif
604  
605  /* fs/sendfile.c */
606  asmlinkage long compat_sys_sendfile(int out_fd, int in_fd,
607  				    compat_off_t __user *offset, compat_size_t count);
608  asmlinkage long compat_sys_sendfile64(int out_fd, int in_fd,
609  				    compat_loff_t __user *offset, compat_size_t count);
610  
611  /* fs/select.c */
612  asmlinkage long compat_sys_pselect6_time32(int n, compat_ulong_t __user *inp,
613  				    compat_ulong_t __user *outp,
614  				    compat_ulong_t __user *exp,
615  				    struct old_timespec32 __user *tsp,
616  				    void __user *sig);
617  asmlinkage long compat_sys_pselect6_time64(int n, compat_ulong_t __user *inp,
618  				    compat_ulong_t __user *outp,
619  				    compat_ulong_t __user *exp,
620  				    struct __kernel_timespec __user *tsp,
621  				    void __user *sig);
622  asmlinkage long compat_sys_ppoll_time32(struct pollfd __user *ufds,
623  				 unsigned int nfds,
624  				 struct old_timespec32 __user *tsp,
625  				 const compat_sigset_t __user *sigmask,
626  				 compat_size_t sigsetsize);
627  asmlinkage long compat_sys_ppoll_time64(struct pollfd __user *ufds,
628  				 unsigned int nfds,
629  				 struct __kernel_timespec __user *tsp,
630  				 const compat_sigset_t __user *sigmask,
631  				 compat_size_t sigsetsize);
632  
633  /* fs/signalfd.c */
634  asmlinkage long compat_sys_signalfd4(int ufd,
635  				     const compat_sigset_t __user *sigmask,
636  				     compat_size_t sigsetsize, int flags);
637  
638  /* fs/splice.c */
639  asmlinkage long compat_sys_vmsplice(int fd, const struct compat_iovec __user *,
640  				    unsigned int nr_segs, unsigned int flags);
641  
642  /* fs/stat.c */
643  asmlinkage long compat_sys_newfstatat(unsigned int dfd,
644  				      const char __user *filename,
645  				      struct compat_stat __user *statbuf,
646  				      int flag);
647  asmlinkage long compat_sys_newfstat(unsigned int fd,
648  				    struct compat_stat __user *statbuf);
649  
650  /* fs/sync.c: No generic prototype for sync_file_range and sync_file_range2 */
651  
652  /* kernel/exit.c */
653  asmlinkage long compat_sys_waitid(int, compat_pid_t,
654  		struct compat_siginfo __user *, int,
655  		struct compat_rusage __user *);
656  
657  
658  
659  /* kernel/futex.c */
660  asmlinkage long
661  compat_sys_set_robust_list(struct compat_robust_list_head __user *head,
662  			   compat_size_t len);
663  asmlinkage long
664  compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr,
665  			   compat_size_t __user *len_ptr);
666  
667  /* kernel/itimer.c */
668  asmlinkage long compat_sys_getitimer(int which,
669  				     struct compat_itimerval __user *it);
670  asmlinkage long compat_sys_setitimer(int which,
671  				     struct compat_itimerval __user *in,
672  				     struct compat_itimerval __user *out);
673  
674  /* kernel/kexec.c */
675  asmlinkage long compat_sys_kexec_load(compat_ulong_t entry,
676  				      compat_ulong_t nr_segments,
677  				      struct compat_kexec_segment __user *,
678  				      compat_ulong_t flags);
679  
680  /* kernel/posix-timers.c */
681  asmlinkage long compat_sys_timer_create(clockid_t which_clock,
682  			struct compat_sigevent __user *timer_event_spec,
683  			timer_t __user *created_timer_id);
684  
685  /* kernel/ptrace.c */
686  asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid,
687  				  compat_long_t addr, compat_long_t data);
688  
689  /* kernel/sched/core.c */
690  asmlinkage long compat_sys_sched_setaffinity(compat_pid_t pid,
691  				     unsigned int len,
692  				     compat_ulong_t __user *user_mask_ptr);
693  asmlinkage long compat_sys_sched_getaffinity(compat_pid_t pid,
694  				     unsigned int len,
695  				     compat_ulong_t __user *user_mask_ptr);
696  
697  /* kernel/signal.c */
698  asmlinkage long compat_sys_sigaltstack(const compat_stack_t __user *uss_ptr,
699  				       compat_stack_t __user *uoss_ptr);
700  asmlinkage long compat_sys_rt_sigsuspend(compat_sigset_t __user *unewset,
701  					 compat_size_t sigsetsize);
702  #ifndef CONFIG_ODD_RT_SIGACTION
703  asmlinkage long compat_sys_rt_sigaction(int,
704  				 const struct compat_sigaction __user *,
705  				 struct compat_sigaction __user *,
706  				 compat_size_t);
707  #endif
708  asmlinkage long compat_sys_rt_sigprocmask(int how, compat_sigset_t __user *set,
709  					  compat_sigset_t __user *oset,
710  					  compat_size_t sigsetsize);
711  asmlinkage long compat_sys_rt_sigpending(compat_sigset_t __user *uset,
712  					 compat_size_t sigsetsize);
713  asmlinkage long compat_sys_rt_sigtimedwait_time32(compat_sigset_t __user *uthese,
714  		struct compat_siginfo __user *uinfo,
715  		struct old_timespec32 __user *uts, compat_size_t sigsetsize);
716  asmlinkage long compat_sys_rt_sigtimedwait_time64(compat_sigset_t __user *uthese,
717  		struct compat_siginfo __user *uinfo,
718  		struct __kernel_timespec __user *uts, compat_size_t sigsetsize);
719  asmlinkage long compat_sys_rt_sigqueueinfo(compat_pid_t pid, int sig,
720  				struct compat_siginfo __user *uinfo);
721  /* No generic prototype for rt_sigreturn */
722  
723  /* kernel/sys.c */
724  asmlinkage long compat_sys_times(struct compat_tms __user *tbuf);
725  asmlinkage long compat_sys_getrlimit(unsigned int resource,
726  				     struct compat_rlimit __user *rlim);
727  asmlinkage long compat_sys_setrlimit(unsigned int resource,
728  				     struct compat_rlimit __user *rlim);
729  asmlinkage long compat_sys_getrusage(int who, struct compat_rusage __user *ru);
730  
731  /* kernel/time.c */
732  asmlinkage long compat_sys_gettimeofday(struct old_timeval32 __user *tv,
733  		struct timezone __user *tz);
734  asmlinkage long compat_sys_settimeofday(struct old_timeval32 __user *tv,
735  		struct timezone __user *tz);
736  
737  /* kernel/timer.c */
738  asmlinkage long compat_sys_sysinfo(struct compat_sysinfo __user *info);
739  
740  /* ipc/mqueue.c */
741  asmlinkage long compat_sys_mq_open(const char __user *u_name,
742  			int oflag, compat_mode_t mode,
743  			struct compat_mq_attr __user *u_attr);
744  asmlinkage long compat_sys_mq_notify(mqd_t mqdes,
745  			const struct compat_sigevent __user *u_notification);
746  asmlinkage long compat_sys_mq_getsetattr(mqd_t mqdes,
747  			const struct compat_mq_attr __user *u_mqstat,
748  			struct compat_mq_attr __user *u_omqstat);
749  
750  /* ipc/msg.c */
751  asmlinkage long compat_sys_msgctl(int first, int second, void __user *uptr);
752  asmlinkage long compat_sys_msgrcv(int msqid, compat_uptr_t msgp,
753  		compat_ssize_t msgsz, compat_long_t msgtyp, int msgflg);
754  asmlinkage long compat_sys_msgsnd(int msqid, compat_uptr_t msgp,
755  		compat_ssize_t msgsz, int msgflg);
756  
757  /* ipc/sem.c */
758  asmlinkage long compat_sys_semctl(int semid, int semnum, int cmd, int arg);
759  
760  /* ipc/shm.c */
761  asmlinkage long compat_sys_shmctl(int first, int second, void __user *uptr);
762  asmlinkage long compat_sys_shmat(int shmid, compat_uptr_t shmaddr, int shmflg);
763  
764  /* net/socket.c */
765  asmlinkage long compat_sys_recvfrom(int fd, void __user *buf, compat_size_t len,
766  			    unsigned flags, struct sockaddr __user *addr,
767  			    int __user *addrlen);
768  asmlinkage long compat_sys_setsockopt(int fd, int level, int optname,
769  				      char __user *optval, unsigned int optlen);
770  asmlinkage long compat_sys_getsockopt(int fd, int level, int optname,
771  				      char __user *optval, int __user *optlen);
772  asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg,
773  				   unsigned flags);
774  asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg,
775  				   unsigned int flags);
776  
777  /* mm/filemap.c: No generic prototype for readahead */
778  
779  /* security/keys/keyctl.c */
780  asmlinkage long compat_sys_keyctl(u32 option,
781  			      u32 arg2, u32 arg3, u32 arg4, u32 arg5);
782  
783  /* arch/example/kernel/sys_example.c */
784  asmlinkage long compat_sys_execve(const char __user *filename, const compat_uptr_t __user *argv,
785  		     const compat_uptr_t __user *envp);
786  
787  /* mm/fadvise.c: No generic prototype for fadvise64_64 */
788  
789  /* mm/, CONFIG_MMU only */
790  asmlinkage long compat_sys_mbind(compat_ulong_t start, compat_ulong_t len,
791  				 compat_ulong_t mode,
792  				 compat_ulong_t __user *nmask,
793  				 compat_ulong_t maxnode, compat_ulong_t flags);
794  asmlinkage long compat_sys_get_mempolicy(int __user *policy,
795  					 compat_ulong_t __user *nmask,
796  					 compat_ulong_t maxnode,
797  					 compat_ulong_t addr,
798  					 compat_ulong_t flags);
799  asmlinkage long compat_sys_set_mempolicy(int mode, compat_ulong_t __user *nmask,
800  					 compat_ulong_t maxnode);
801  asmlinkage long compat_sys_migrate_pages(compat_pid_t pid,
802  		compat_ulong_t maxnode, const compat_ulong_t __user *old_nodes,
803  		const compat_ulong_t __user *new_nodes);
804  asmlinkage long compat_sys_move_pages(pid_t pid, compat_ulong_t nr_pages,
805  				      __u32 __user *pages,
806  				      const int __user *nodes,
807  				      int __user *status,
808  				      int flags);
809  
810  asmlinkage long compat_sys_rt_tgsigqueueinfo(compat_pid_t tgid,
811  					compat_pid_t pid, int sig,
812  					struct compat_siginfo __user *uinfo);
813  asmlinkage long compat_sys_recvmmsg_time64(int fd, struct compat_mmsghdr __user *mmsg,
814  				    unsigned vlen, unsigned int flags,
815  				    struct __kernel_timespec __user *timeout);
816  asmlinkage long compat_sys_recvmmsg_time32(int fd, struct compat_mmsghdr __user *mmsg,
817  				    unsigned vlen, unsigned int flags,
818  				    struct old_timespec32 __user *timeout);
819  asmlinkage long compat_sys_wait4(compat_pid_t pid,
820  				 compat_uint_t __user *stat_addr, int options,
821  				 struct compat_rusage __user *ru);
822  asmlinkage long compat_sys_fanotify_mark(int, unsigned int, __u32, __u32,
823  					    int, const char __user *);
824  asmlinkage long compat_sys_open_by_handle_at(int mountdirfd,
825  					     struct file_handle __user *handle,
826  					     int flags);
827  asmlinkage long compat_sys_sendmmsg(int fd, struct compat_mmsghdr __user *mmsg,
828  				    unsigned vlen, unsigned int flags);
829  asmlinkage ssize_t compat_sys_process_vm_readv(compat_pid_t pid,
830  		const struct compat_iovec __user *lvec,
831  		compat_ulong_t liovcnt, const struct compat_iovec __user *rvec,
832  		compat_ulong_t riovcnt, compat_ulong_t flags);
833  asmlinkage ssize_t compat_sys_process_vm_writev(compat_pid_t pid,
834  		const struct compat_iovec __user *lvec,
835  		compat_ulong_t liovcnt, const struct compat_iovec __user *rvec,
836  		compat_ulong_t riovcnt, compat_ulong_t flags);
837  asmlinkage long compat_sys_execveat(int dfd, const char __user *filename,
838  		     const compat_uptr_t __user *argv,
839  		     const compat_uptr_t __user *envp, int flags);
840  asmlinkage ssize_t compat_sys_preadv2(compat_ulong_t fd,
841  		const struct compat_iovec __user *vec,
842  		compat_ulong_t vlen, u32 pos_low, u32 pos_high, rwf_t flags);
843  asmlinkage ssize_t compat_sys_pwritev2(compat_ulong_t fd,
844  		const struct compat_iovec __user *vec,
845  		compat_ulong_t vlen, u32 pos_low, u32 pos_high, rwf_t flags);
846  #ifdef __ARCH_WANT_COMPAT_SYS_PREADV64V2
847  asmlinkage long  compat_sys_readv64v2(unsigned long fd,
848  		const struct compat_iovec __user *vec,
849  		unsigned long vlen, loff_t pos, rwf_t flags);
850  #endif
851  
852  #ifdef __ARCH_WANT_COMPAT_SYS_PWRITEV64V2
853  asmlinkage long compat_sys_pwritev64v2(unsigned long fd,
854  		const struct compat_iovec __user *vec,
855  		unsigned long vlen, loff_t pos, rwf_t flags);
856  #endif
857  
858  
859  /*
860   * Deprecated system calls which are still defined in
861   * include/uapi/asm-generic/unistd.h and wanted by >= 1 arch
862   */
863  
864  /* __ARCH_WANT_SYSCALL_NO_AT */
865  asmlinkage long compat_sys_open(const char __user *filename, int flags,
866  				umode_t mode);
867  
868  /* __ARCH_WANT_SYSCALL_NO_FLAGS */
869  asmlinkage long compat_sys_signalfd(int ufd,
870  				    const compat_sigset_t __user *sigmask,
871  				    compat_size_t sigsetsize);
872  
873  /* __ARCH_WANT_SYSCALL_OFF_T */
874  asmlinkage long compat_sys_newstat(const char __user *filename,
875  				   struct compat_stat __user *statbuf);
876  asmlinkage long compat_sys_newlstat(const char __user *filename,
877  				    struct compat_stat __user *statbuf);
878  
879  /* __ARCH_WANT_SYSCALL_DEPRECATED */
880  asmlinkage long compat_sys_select(int n, compat_ulong_t __user *inp,
881  		compat_ulong_t __user *outp, compat_ulong_t __user *exp,
882  		struct old_timeval32 __user *tvp);
883  asmlinkage long compat_sys_ustat(unsigned dev, struct compat_ustat __user *u32);
884  asmlinkage long compat_sys_recv(int fd, void __user *buf, compat_size_t len,
885  				unsigned flags);
886  asmlinkage long compat_sys_sysctl(struct compat_sysctl_args __user *args);
887  
888  /* obsolete: fs/readdir.c */
889  asmlinkage long compat_sys_old_readdir(unsigned int fd,
890  				       struct compat_old_linux_dirent __user *,
891  				       unsigned int count);
892  
893  /* obsolete: fs/select.c */
894  asmlinkage long compat_sys_old_select(struct compat_sel_arg_struct __user *arg);
895  
896  /* obsolete: ipc */
897  asmlinkage long compat_sys_ipc(u32, int, int, u32, compat_uptr_t, u32);
898  
899  /* obsolete: kernel/signal.c */
900  #ifdef __ARCH_WANT_SYS_SIGPENDING
901  asmlinkage long compat_sys_sigpending(compat_old_sigset_t __user *set);
902  #endif
903  
904  #ifdef __ARCH_WANT_SYS_SIGPROCMASK
905  asmlinkage long compat_sys_sigprocmask(int how, compat_old_sigset_t __user *nset,
906  				       compat_old_sigset_t __user *oset);
907  #endif
908  #ifdef CONFIG_COMPAT_OLD_SIGACTION
909  asmlinkage long compat_sys_sigaction(int sig,
910                                     const struct compat_old_sigaction __user *act,
911                                     struct compat_old_sigaction __user *oact);
912  #endif
913  
914  /* obsolete: net/socket.c */
915  asmlinkage long compat_sys_socketcall(int call, u32 __user *args);
916  
917  #endif /* CONFIG_ARCH_HAS_SYSCALL_WRAPPER */
918  
919  
920  /*
921   * For most but not all architectures, "am I in a compat syscall?" and
922   * "am I a compat task?" are the same question.  For architectures on which
923   * they aren't the same question, arch code can override in_compat_syscall.
924   */
925  
926  #ifndef in_compat_syscall
in_compat_syscall(void)927  static inline bool in_compat_syscall(void) { return is_compat_task(); }
928  #endif
929  
930  /**
931   * ns_to_old_timeval32 - Compat version of ns_to_timeval
932   * @nsec:	the nanoseconds value to be converted
933   *
934   * Returns the old_timeval32 representation of the nsec parameter.
935   */
ns_to_old_timeval32(s64 nsec)936  static inline struct old_timeval32 ns_to_old_timeval32(s64 nsec)
937  {
938  	struct timeval tv;
939  	struct old_timeval32 ctv;
940  
941  	tv = ns_to_timeval(nsec);
942  	ctv.tv_sec = tv.tv_sec;
943  	ctv.tv_usec = tv.tv_usec;
944  
945  	return ctv;
946  }
947  
948  /*
949   * Kernel code should not call compat syscalls (i.e., compat_sys_xyzyyz())
950   * directly.  Instead, use one of the functions which work equivalently, such
951   * as the kcompat_sys_xyzyyz() functions prototyped below.
952   */
953  
954  int kcompat_sys_statfs64(const char __user * pathname, compat_size_t sz,
955  		     struct compat_statfs64 __user * buf);
956  int kcompat_sys_fstatfs64(unsigned int fd, compat_size_t sz,
957  			  struct compat_statfs64 __user * buf);
958  
959  #else /* !CONFIG_COMPAT */
960  
961  #define is_compat_task() (0)
962  /* Ensure no one redefines in_compat_syscall() under !CONFIG_COMPAT */
963  #define in_compat_syscall in_compat_syscall
in_compat_syscall(void)964  static inline bool in_compat_syscall(void) { return false; }
965  
966  #endif /* CONFIG_COMPAT */
967  
968  #endif /* _LINUX_COMPAT_H */
969