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