1*3dd681d9SWill Deacon /* 2*3dd681d9SWill Deacon * Copyright (C) 2012 ARM Ltd. 3*3dd681d9SWill Deacon * 4*3dd681d9SWill Deacon * This program is free software; you can redistribute it and/or modify 5*3dd681d9SWill Deacon * it under the terms of the GNU General Public License version 2 as 6*3dd681d9SWill Deacon * published by the Free Software Foundation. 7*3dd681d9SWill Deacon * 8*3dd681d9SWill Deacon * This program is distributed in the hope that it will be useful, 9*3dd681d9SWill Deacon * but WITHOUT ANY WARRANTY; without even the implied warranty of 10*3dd681d9SWill Deacon * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11*3dd681d9SWill Deacon * GNU General Public License for more details. 12*3dd681d9SWill Deacon * 13*3dd681d9SWill Deacon * You should have received a copy of the GNU General Public License 14*3dd681d9SWill Deacon * along with this program. If not, see <http://www.gnu.org/licenses/>. 15*3dd681d9SWill Deacon */ 16*3dd681d9SWill Deacon #ifndef __ASM_COMPAT_H 17*3dd681d9SWill Deacon #define __ASM_COMPAT_H 18*3dd681d9SWill Deacon #ifdef __KERNEL__ 19*3dd681d9SWill Deacon #ifdef CONFIG_COMPAT 20*3dd681d9SWill Deacon 21*3dd681d9SWill Deacon /* 22*3dd681d9SWill Deacon * Architecture specific compatibility types 23*3dd681d9SWill Deacon */ 24*3dd681d9SWill Deacon #include <linux/types.h> 25*3dd681d9SWill Deacon #include <linux/sched.h> 26*3dd681d9SWill Deacon 27*3dd681d9SWill Deacon #define COMPAT_USER_HZ 100 28*3dd681d9SWill Deacon #define COMPAT_UTS_MACHINE "armv8l\0\0" 29*3dd681d9SWill Deacon 30*3dd681d9SWill Deacon typedef u32 compat_size_t; 31*3dd681d9SWill Deacon typedef s32 compat_ssize_t; 32*3dd681d9SWill Deacon typedef s32 compat_time_t; 33*3dd681d9SWill Deacon typedef s32 compat_clock_t; 34*3dd681d9SWill Deacon typedef s32 compat_pid_t; 35*3dd681d9SWill Deacon typedef u32 __compat_uid_t; 36*3dd681d9SWill Deacon typedef u32 __compat_gid_t; 37*3dd681d9SWill Deacon typedef u32 __compat_uid32_t; 38*3dd681d9SWill Deacon typedef u32 __compat_gid32_t; 39*3dd681d9SWill Deacon typedef u32 compat_mode_t; 40*3dd681d9SWill Deacon typedef u32 compat_ino_t; 41*3dd681d9SWill Deacon typedef u32 compat_dev_t; 42*3dd681d9SWill Deacon typedef s32 compat_off_t; 43*3dd681d9SWill Deacon typedef s64 compat_loff_t; 44*3dd681d9SWill Deacon typedef s16 compat_nlink_t; 45*3dd681d9SWill Deacon typedef u16 compat_ipc_pid_t; 46*3dd681d9SWill Deacon typedef s32 compat_daddr_t; 47*3dd681d9SWill Deacon typedef u32 compat_caddr_t; 48*3dd681d9SWill Deacon typedef __kernel_fsid_t compat_fsid_t; 49*3dd681d9SWill Deacon typedef s32 compat_key_t; 50*3dd681d9SWill Deacon typedef s32 compat_timer_t; 51*3dd681d9SWill Deacon 52*3dd681d9SWill Deacon typedef s32 compat_int_t; 53*3dd681d9SWill Deacon typedef s32 compat_long_t; 54*3dd681d9SWill Deacon typedef s64 compat_s64; 55*3dd681d9SWill Deacon typedef u32 compat_uint_t; 56*3dd681d9SWill Deacon typedef u32 compat_ulong_t; 57*3dd681d9SWill Deacon typedef u64 compat_u64; 58*3dd681d9SWill Deacon 59*3dd681d9SWill Deacon struct compat_timespec { 60*3dd681d9SWill Deacon compat_time_t tv_sec; 61*3dd681d9SWill Deacon s32 tv_nsec; 62*3dd681d9SWill Deacon }; 63*3dd681d9SWill Deacon 64*3dd681d9SWill Deacon struct compat_timeval { 65*3dd681d9SWill Deacon compat_time_t tv_sec; 66*3dd681d9SWill Deacon s32 tv_usec; 67*3dd681d9SWill Deacon }; 68*3dd681d9SWill Deacon 69*3dd681d9SWill Deacon struct compat_stat { 70*3dd681d9SWill Deacon compat_dev_t st_dev; 71*3dd681d9SWill Deacon compat_ino_t st_ino; 72*3dd681d9SWill Deacon compat_mode_t st_mode; 73*3dd681d9SWill Deacon compat_nlink_t st_nlink; 74*3dd681d9SWill Deacon __compat_uid32_t st_uid; 75*3dd681d9SWill Deacon __compat_gid32_t st_gid; 76*3dd681d9SWill Deacon compat_dev_t st_rdev; 77*3dd681d9SWill Deacon compat_off_t st_size; 78*3dd681d9SWill Deacon compat_off_t st_blksize; 79*3dd681d9SWill Deacon compat_off_t st_blocks; 80*3dd681d9SWill Deacon compat_time_t st_atime; 81*3dd681d9SWill Deacon u32 st_atime_nsec; 82*3dd681d9SWill Deacon compat_time_t st_mtime; 83*3dd681d9SWill Deacon u32 st_mtime_nsec; 84*3dd681d9SWill Deacon compat_time_t st_ctime; 85*3dd681d9SWill Deacon u32 st_ctime_nsec; 86*3dd681d9SWill Deacon u32 __unused4[2]; 87*3dd681d9SWill Deacon }; 88*3dd681d9SWill Deacon 89*3dd681d9SWill Deacon struct compat_flock { 90*3dd681d9SWill Deacon short l_type; 91*3dd681d9SWill Deacon short l_whence; 92*3dd681d9SWill Deacon compat_off_t l_start; 93*3dd681d9SWill Deacon compat_off_t l_len; 94*3dd681d9SWill Deacon compat_pid_t l_pid; 95*3dd681d9SWill Deacon }; 96*3dd681d9SWill Deacon 97*3dd681d9SWill Deacon #define F_GETLK64 12 /* using 'struct flock64' */ 98*3dd681d9SWill Deacon #define F_SETLK64 13 99*3dd681d9SWill Deacon #define F_SETLKW64 14 100*3dd681d9SWill Deacon 101*3dd681d9SWill Deacon struct compat_flock64 { 102*3dd681d9SWill Deacon short l_type; 103*3dd681d9SWill Deacon short l_whence; 104*3dd681d9SWill Deacon compat_loff_t l_start; 105*3dd681d9SWill Deacon compat_loff_t l_len; 106*3dd681d9SWill Deacon compat_pid_t l_pid; 107*3dd681d9SWill Deacon }; 108*3dd681d9SWill Deacon 109*3dd681d9SWill Deacon struct compat_statfs { 110*3dd681d9SWill Deacon int f_type; 111*3dd681d9SWill Deacon int f_bsize; 112*3dd681d9SWill Deacon int f_blocks; 113*3dd681d9SWill Deacon int f_bfree; 114*3dd681d9SWill Deacon int f_bavail; 115*3dd681d9SWill Deacon int f_files; 116*3dd681d9SWill Deacon int f_ffree; 117*3dd681d9SWill Deacon compat_fsid_t f_fsid; 118*3dd681d9SWill Deacon int f_namelen; /* SunOS ignores this field. */ 119*3dd681d9SWill Deacon int f_frsize; 120*3dd681d9SWill Deacon int f_flags; 121*3dd681d9SWill Deacon int f_spare[4]; 122*3dd681d9SWill Deacon }; 123*3dd681d9SWill Deacon 124*3dd681d9SWill Deacon #define COMPAT_RLIM_INFINITY 0xffffffff 125*3dd681d9SWill Deacon 126*3dd681d9SWill Deacon typedef u32 compat_old_sigset_t; 127*3dd681d9SWill Deacon 128*3dd681d9SWill Deacon #define _COMPAT_NSIG 64 129*3dd681d9SWill Deacon #define _COMPAT_NSIG_BPW 32 130*3dd681d9SWill Deacon 131*3dd681d9SWill Deacon typedef u32 compat_sigset_word; 132*3dd681d9SWill Deacon 133*3dd681d9SWill Deacon #define COMPAT_OFF_T_MAX 0x7fffffff 134*3dd681d9SWill Deacon #define COMPAT_LOFF_T_MAX 0x7fffffffffffffffL 135*3dd681d9SWill Deacon 136*3dd681d9SWill Deacon /* 137*3dd681d9SWill Deacon * A pointer passed in from user mode. This should not 138*3dd681d9SWill Deacon * be used for syscall parameters, just declare them 139*3dd681d9SWill Deacon * as pointers because the syscall entry code will have 140*3dd681d9SWill Deacon * appropriately converted them already. 141*3dd681d9SWill Deacon */ 142*3dd681d9SWill Deacon typedef u32 compat_uptr_t; 143*3dd681d9SWill Deacon 144*3dd681d9SWill Deacon static inline void __user *compat_ptr(compat_uptr_t uptr) 145*3dd681d9SWill Deacon { 146*3dd681d9SWill Deacon return (void __user *)(unsigned long)uptr; 147*3dd681d9SWill Deacon } 148*3dd681d9SWill Deacon 149*3dd681d9SWill Deacon static inline compat_uptr_t ptr_to_compat(void __user *uptr) 150*3dd681d9SWill Deacon { 151*3dd681d9SWill Deacon return (u32)(unsigned long)uptr; 152*3dd681d9SWill Deacon } 153*3dd681d9SWill Deacon 154*3dd681d9SWill Deacon static inline void __user *arch_compat_alloc_user_space(long len) 155*3dd681d9SWill Deacon { 156*3dd681d9SWill Deacon struct pt_regs *regs = task_pt_regs(current); 157*3dd681d9SWill Deacon return (void __user *)regs->compat_sp - len; 158*3dd681d9SWill Deacon } 159*3dd681d9SWill Deacon 160*3dd681d9SWill Deacon struct compat_ipc64_perm { 161*3dd681d9SWill Deacon compat_key_t key; 162*3dd681d9SWill Deacon __compat_uid32_t uid; 163*3dd681d9SWill Deacon __compat_gid32_t gid; 164*3dd681d9SWill Deacon __compat_uid32_t cuid; 165*3dd681d9SWill Deacon __compat_gid32_t cgid; 166*3dd681d9SWill Deacon unsigned short mode; 167*3dd681d9SWill Deacon unsigned short __pad1; 168*3dd681d9SWill Deacon unsigned short seq; 169*3dd681d9SWill Deacon unsigned short __pad2; 170*3dd681d9SWill Deacon compat_ulong_t unused1; 171*3dd681d9SWill Deacon compat_ulong_t unused2; 172*3dd681d9SWill Deacon }; 173*3dd681d9SWill Deacon 174*3dd681d9SWill Deacon struct compat_semid64_ds { 175*3dd681d9SWill Deacon struct compat_ipc64_perm sem_perm; 176*3dd681d9SWill Deacon compat_time_t sem_otime; 177*3dd681d9SWill Deacon compat_ulong_t __unused1; 178*3dd681d9SWill Deacon compat_time_t sem_ctime; 179*3dd681d9SWill Deacon compat_ulong_t __unused2; 180*3dd681d9SWill Deacon compat_ulong_t sem_nsems; 181*3dd681d9SWill Deacon compat_ulong_t __unused3; 182*3dd681d9SWill Deacon compat_ulong_t __unused4; 183*3dd681d9SWill Deacon }; 184*3dd681d9SWill Deacon 185*3dd681d9SWill Deacon struct compat_msqid64_ds { 186*3dd681d9SWill Deacon struct compat_ipc64_perm msg_perm; 187*3dd681d9SWill Deacon compat_time_t msg_stime; 188*3dd681d9SWill Deacon compat_ulong_t __unused1; 189*3dd681d9SWill Deacon compat_time_t msg_rtime; 190*3dd681d9SWill Deacon compat_ulong_t __unused2; 191*3dd681d9SWill Deacon compat_time_t msg_ctime; 192*3dd681d9SWill Deacon compat_ulong_t __unused3; 193*3dd681d9SWill Deacon compat_ulong_t msg_cbytes; 194*3dd681d9SWill Deacon compat_ulong_t msg_qnum; 195*3dd681d9SWill Deacon compat_ulong_t msg_qbytes; 196*3dd681d9SWill Deacon compat_pid_t msg_lspid; 197*3dd681d9SWill Deacon compat_pid_t msg_lrpid; 198*3dd681d9SWill Deacon compat_ulong_t __unused4; 199*3dd681d9SWill Deacon compat_ulong_t __unused5; 200*3dd681d9SWill Deacon }; 201*3dd681d9SWill Deacon 202*3dd681d9SWill Deacon struct compat_shmid64_ds { 203*3dd681d9SWill Deacon struct compat_ipc64_perm shm_perm; 204*3dd681d9SWill Deacon compat_size_t shm_segsz; 205*3dd681d9SWill Deacon compat_time_t shm_atime; 206*3dd681d9SWill Deacon compat_ulong_t __unused1; 207*3dd681d9SWill Deacon compat_time_t shm_dtime; 208*3dd681d9SWill Deacon compat_ulong_t __unused2; 209*3dd681d9SWill Deacon compat_time_t shm_ctime; 210*3dd681d9SWill Deacon compat_ulong_t __unused3; 211*3dd681d9SWill Deacon compat_pid_t shm_cpid; 212*3dd681d9SWill Deacon compat_pid_t shm_lpid; 213*3dd681d9SWill Deacon compat_ulong_t shm_nattch; 214*3dd681d9SWill Deacon compat_ulong_t __unused4; 215*3dd681d9SWill Deacon compat_ulong_t __unused5; 216*3dd681d9SWill Deacon }; 217*3dd681d9SWill Deacon 218*3dd681d9SWill Deacon static inline int is_compat_task(void) 219*3dd681d9SWill Deacon { 220*3dd681d9SWill Deacon return test_thread_flag(TIF_32BIT); 221*3dd681d9SWill Deacon } 222*3dd681d9SWill Deacon 223*3dd681d9SWill Deacon static inline int is_compat_thread(struct thread_info *thread) 224*3dd681d9SWill Deacon { 225*3dd681d9SWill Deacon return test_ti_thread_flag(thread, TIF_32BIT); 226*3dd681d9SWill Deacon } 227*3dd681d9SWill Deacon 228*3dd681d9SWill Deacon #else /* !CONFIG_COMPAT */ 229*3dd681d9SWill Deacon 230*3dd681d9SWill Deacon static inline int is_compat_task(void) 231*3dd681d9SWill Deacon { 232*3dd681d9SWill Deacon return 0; 233*3dd681d9SWill Deacon } 234*3dd681d9SWill Deacon 235*3dd681d9SWill Deacon static inline int is_compat_thread(struct thread_info *thread) 236*3dd681d9SWill Deacon { 237*3dd681d9SWill Deacon return 0; 238*3dd681d9SWill Deacon } 239*3dd681d9SWill Deacon 240*3dd681d9SWill Deacon #endif /* CONFIG_COMPAT */ 241*3dd681d9SWill Deacon #endif /* __KERNEL__ */ 242*3dd681d9SWill Deacon #endif /* __ASM_COMPAT_H */ 243