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