linux/arch/x86/include/asm/compat.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _ASM_X86_COMPAT_H
   3#define _ASM_X86_COMPAT_H
   4
   5/*
   6 * Architecture specific compatibility types
   7 */
   8#include <linux/types.h>
   9#include <linux/sched.h>
  10#include <linux/sched/task_stack.h>
  11#include <asm/processor.h>
  12#include <asm/user32.h>
  13#include <asm/unistd.h>
  14
  15#define compat_mode_t   compat_mode_t
  16typedef u16             compat_mode_t;
  17
  18#include <asm-generic/compat.h>
  19
  20#define COMPAT_USER_HZ          100
  21#define COMPAT_UTS_MACHINE      "i686\0\0"
  22
  23typedef u16             __compat_uid_t;
  24typedef u16             __compat_gid_t;
  25typedef u16             compat_dev_t;
  26typedef u16             compat_nlink_t;
  27typedef u16             compat_ipc_pid_t;
  28typedef __kernel_fsid_t compat_fsid_t;
  29
  30struct compat_stat {
  31        compat_dev_t    st_dev;
  32        u16             __pad1;
  33        compat_ino_t    st_ino;
  34        compat_mode_t   st_mode;
  35        compat_nlink_t  st_nlink;
  36        __compat_uid_t  st_uid;
  37        __compat_gid_t  st_gid;
  38        compat_dev_t    st_rdev;
  39        u16             __pad2;
  40        u32             st_size;
  41        u32             st_blksize;
  42        u32             st_blocks;
  43        u32             st_atime;
  44        u32             st_atime_nsec;
  45        u32             st_mtime;
  46        u32             st_mtime_nsec;
  47        u32             st_ctime;
  48        u32             st_ctime_nsec;
  49        u32             __unused4;
  50        u32             __unused5;
  51};
  52
  53struct compat_flock {
  54        short           l_type;
  55        short           l_whence;
  56        compat_off_t    l_start;
  57        compat_off_t    l_len;
  58        compat_pid_t    l_pid;
  59};
  60
  61#define F_GETLK64       12      /*  using 'struct flock64' */
  62#define F_SETLK64       13
  63#define F_SETLKW64      14
  64
  65/*
  66 * IA32 uses 4 byte alignment for 64 bit quantities,
  67 * so we need to pack this structure.
  68 */
  69struct compat_flock64 {
  70        short           l_type;
  71        short           l_whence;
  72        compat_loff_t   l_start;
  73        compat_loff_t   l_len;
  74        compat_pid_t    l_pid;
  75} __attribute__((packed));
  76
  77struct compat_statfs {
  78        int             f_type;
  79        int             f_bsize;
  80        int             f_blocks;
  81        int             f_bfree;
  82        int             f_bavail;
  83        int             f_files;
  84        int             f_ffree;
  85        compat_fsid_t   f_fsid;
  86        int             f_namelen;      /* SunOS ignores this field. */
  87        int             f_frsize;
  88        int             f_flags;
  89        int             f_spare[4];
  90};
  91
  92#define COMPAT_RLIM_INFINITY            0xffffffff
  93
  94#define COMPAT_OFF_T_MAX        0x7fffffff
  95
  96struct compat_ipc64_perm {
  97        compat_key_t key;
  98        __compat_uid32_t uid;
  99        __compat_gid32_t gid;
 100        __compat_uid32_t cuid;
 101        __compat_gid32_t cgid;
 102        unsigned short mode;
 103        unsigned short __pad1;
 104        unsigned short seq;
 105        unsigned short __pad2;
 106        compat_ulong_t unused1;
 107        compat_ulong_t unused2;
 108};
 109
 110struct compat_semid64_ds {
 111        struct compat_ipc64_perm sem_perm;
 112        compat_ulong_t sem_otime;
 113        compat_ulong_t sem_otime_high;
 114        compat_ulong_t sem_ctime;
 115        compat_ulong_t sem_ctime_high;
 116        compat_ulong_t sem_nsems;
 117        compat_ulong_t __unused3;
 118        compat_ulong_t __unused4;
 119};
 120
 121struct compat_msqid64_ds {
 122        struct compat_ipc64_perm msg_perm;
 123        compat_ulong_t msg_stime;
 124        compat_ulong_t msg_stime_high;
 125        compat_ulong_t msg_rtime;
 126        compat_ulong_t msg_rtime_high;
 127        compat_ulong_t msg_ctime;
 128        compat_ulong_t msg_ctime_high;
 129        compat_ulong_t msg_cbytes;
 130        compat_ulong_t msg_qnum;
 131        compat_ulong_t msg_qbytes;
 132        compat_pid_t   msg_lspid;
 133        compat_pid_t   msg_lrpid;
 134        compat_ulong_t __unused4;
 135        compat_ulong_t __unused5;
 136};
 137
 138struct compat_shmid64_ds {
 139        struct compat_ipc64_perm shm_perm;
 140        compat_size_t  shm_segsz;
 141        compat_ulong_t shm_atime;
 142        compat_ulong_t shm_atime_high;
 143        compat_ulong_t shm_dtime;
 144        compat_ulong_t shm_dtime_high;
 145        compat_ulong_t shm_ctime;
 146        compat_ulong_t shm_ctime_high;
 147        compat_pid_t   shm_cpid;
 148        compat_pid_t   shm_lpid;
 149        compat_ulong_t shm_nattch;
 150        compat_ulong_t __unused4;
 151        compat_ulong_t __unused5;
 152};
 153
 154#ifdef CONFIG_X86_X32_ABI
 155#define COMPAT_USE_64BIT_TIME \
 156        (!!(task_pt_regs(current)->orig_ax & __X32_SYSCALL_BIT))
 157#endif
 158
 159static inline bool in_x32_syscall(void)
 160{
 161#ifdef CONFIG_X86_X32_ABI
 162        if (task_pt_regs(current)->orig_ax & __X32_SYSCALL_BIT)
 163                return true;
 164#endif
 165        return false;
 166}
 167
 168static inline bool in_32bit_syscall(void)
 169{
 170        return in_ia32_syscall() || in_x32_syscall();
 171}
 172
 173#ifdef CONFIG_COMPAT
 174static inline bool in_compat_syscall(void)
 175{
 176        return in_32bit_syscall();
 177}
 178#define in_compat_syscall in_compat_syscall     /* override the generic impl */
 179#define compat_need_64bit_alignment_fixup in_ia32_syscall
 180#endif
 181
 182struct compat_siginfo;
 183
 184#ifdef CONFIG_X86_X32_ABI
 185int copy_siginfo_to_user32(struct compat_siginfo __user *to,
 186                const kernel_siginfo_t *from);
 187#define copy_siginfo_to_user32 copy_siginfo_to_user32
 188#endif /* CONFIG_X86_X32_ABI */
 189
 190#endif /* _ASM_X86_COMPAT_H */
 191