13dd681d9SWill Deacon /* 23dd681d9SWill Deacon * Copyright (C) 2012 ARM Ltd. 33dd681d9SWill Deacon * 43dd681d9SWill Deacon * This program is free software; you can redistribute it and/or modify 53dd681d9SWill Deacon * it under the terms of the GNU General Public License version 2 as 63dd681d9SWill Deacon * published by the Free Software Foundation. 73dd681d9SWill Deacon * 83dd681d9SWill Deacon * This program is distributed in the hope that it will be useful, 93dd681d9SWill Deacon * but WITHOUT ANY WARRANTY; without even the implied warranty of 103dd681d9SWill Deacon * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 113dd681d9SWill Deacon * GNU General Public License for more details. 123dd681d9SWill Deacon * 133dd681d9SWill Deacon * You should have received a copy of the GNU General Public License 143dd681d9SWill Deacon * along with this program. If not, see <http://www.gnu.org/licenses/>. 153dd681d9SWill Deacon */ 163dd681d9SWill Deacon #ifndef __ASM_COMPAT_H 173dd681d9SWill Deacon #define __ASM_COMPAT_H 183dd681d9SWill Deacon #ifdef __KERNEL__ 193dd681d9SWill Deacon #ifdef CONFIG_COMPAT 203dd681d9SWill Deacon 213dd681d9SWill Deacon /* 223dd681d9SWill Deacon * Architecture specific compatibility types 233dd681d9SWill Deacon */ 243dd681d9SWill Deacon #include <linux/types.h> 253dd681d9SWill Deacon #include <linux/sched.h> 263dd681d9SWill Deacon 273dd681d9SWill Deacon #define COMPAT_USER_HZ 100 283dd681d9SWill Deacon #define COMPAT_UTS_MACHINE "armv8l\0\0" 293dd681d9SWill Deacon 303dd681d9SWill Deacon typedef u32 compat_size_t; 313dd681d9SWill Deacon typedef s32 compat_ssize_t; 323dd681d9SWill Deacon typedef s32 compat_time_t; 333dd681d9SWill Deacon typedef s32 compat_clock_t; 343dd681d9SWill Deacon typedef s32 compat_pid_t; 353dd681d9SWill Deacon typedef u32 __compat_uid_t; 363dd681d9SWill Deacon typedef u32 __compat_gid_t; 373dd681d9SWill Deacon typedef u32 __compat_uid32_t; 383dd681d9SWill Deacon typedef u32 __compat_gid32_t; 393dd681d9SWill Deacon typedef u32 compat_mode_t; 403dd681d9SWill Deacon typedef u32 compat_ino_t; 413dd681d9SWill Deacon typedef u32 compat_dev_t; 423dd681d9SWill Deacon typedef s32 compat_off_t; 433dd681d9SWill Deacon typedef s64 compat_loff_t; 443dd681d9SWill Deacon typedef s16 compat_nlink_t; 453dd681d9SWill Deacon typedef u16 compat_ipc_pid_t; 463dd681d9SWill Deacon typedef s32 compat_daddr_t; 473dd681d9SWill Deacon typedef u32 compat_caddr_t; 483dd681d9SWill Deacon typedef __kernel_fsid_t compat_fsid_t; 493dd681d9SWill Deacon typedef s32 compat_key_t; 503dd681d9SWill Deacon typedef s32 compat_timer_t; 513dd681d9SWill Deacon 523dd681d9SWill Deacon typedef s32 compat_int_t; 533dd681d9SWill Deacon typedef s32 compat_long_t; 543dd681d9SWill Deacon typedef s64 compat_s64; 553dd681d9SWill Deacon typedef u32 compat_uint_t; 563dd681d9SWill Deacon typedef u32 compat_ulong_t; 573dd681d9SWill Deacon typedef u64 compat_u64; 583dd681d9SWill Deacon 593dd681d9SWill Deacon struct compat_timespec { 603dd681d9SWill Deacon compat_time_t tv_sec; 613dd681d9SWill Deacon s32 tv_nsec; 623dd681d9SWill Deacon }; 633dd681d9SWill Deacon 643dd681d9SWill Deacon struct compat_timeval { 653dd681d9SWill Deacon compat_time_t tv_sec; 663dd681d9SWill Deacon s32 tv_usec; 673dd681d9SWill Deacon }; 683dd681d9SWill Deacon 693dd681d9SWill Deacon struct compat_stat { 703dd681d9SWill Deacon compat_dev_t st_dev; 713dd681d9SWill Deacon compat_ino_t st_ino; 723dd681d9SWill Deacon compat_mode_t st_mode; 733dd681d9SWill Deacon compat_nlink_t st_nlink; 743dd681d9SWill Deacon __compat_uid32_t st_uid; 753dd681d9SWill Deacon __compat_gid32_t st_gid; 763dd681d9SWill Deacon compat_dev_t st_rdev; 773dd681d9SWill Deacon compat_off_t st_size; 783dd681d9SWill Deacon compat_off_t st_blksize; 793dd681d9SWill Deacon compat_off_t st_blocks; 803dd681d9SWill Deacon compat_time_t st_atime; 813dd681d9SWill Deacon u32 st_atime_nsec; 823dd681d9SWill Deacon compat_time_t st_mtime; 833dd681d9SWill Deacon u32 st_mtime_nsec; 843dd681d9SWill Deacon compat_time_t st_ctime; 853dd681d9SWill Deacon u32 st_ctime_nsec; 863dd681d9SWill Deacon u32 __unused4[2]; 873dd681d9SWill Deacon }; 883dd681d9SWill Deacon 893dd681d9SWill Deacon struct compat_flock { 903dd681d9SWill Deacon short l_type; 913dd681d9SWill Deacon short l_whence; 923dd681d9SWill Deacon compat_off_t l_start; 933dd681d9SWill Deacon compat_off_t l_len; 943dd681d9SWill Deacon compat_pid_t l_pid; 953dd681d9SWill Deacon }; 963dd681d9SWill Deacon 973dd681d9SWill Deacon #define F_GETLK64 12 /* using 'struct flock64' */ 983dd681d9SWill Deacon #define F_SETLK64 13 993dd681d9SWill Deacon #define F_SETLKW64 14 1003dd681d9SWill Deacon 1013dd681d9SWill Deacon struct compat_flock64 { 1023dd681d9SWill Deacon short l_type; 1033dd681d9SWill Deacon short l_whence; 1043dd681d9SWill Deacon compat_loff_t l_start; 1053dd681d9SWill Deacon compat_loff_t l_len; 1063dd681d9SWill Deacon compat_pid_t l_pid; 1073dd681d9SWill Deacon }; 1083dd681d9SWill Deacon 1093dd681d9SWill Deacon struct compat_statfs { 1103dd681d9SWill Deacon int f_type; 1113dd681d9SWill Deacon int f_bsize; 1123dd681d9SWill Deacon int f_blocks; 1133dd681d9SWill Deacon int f_bfree; 1143dd681d9SWill Deacon int f_bavail; 1153dd681d9SWill Deacon int f_files; 1163dd681d9SWill Deacon int f_ffree; 1173dd681d9SWill Deacon compat_fsid_t f_fsid; 1183dd681d9SWill Deacon int f_namelen; /* SunOS ignores this field. */ 1193dd681d9SWill Deacon int f_frsize; 1203dd681d9SWill Deacon int f_flags; 1213dd681d9SWill Deacon int f_spare[4]; 1223dd681d9SWill Deacon }; 1233dd681d9SWill Deacon 1243dd681d9SWill Deacon #define COMPAT_RLIM_INFINITY 0xffffffff 1253dd681d9SWill Deacon 1263dd681d9SWill Deacon typedef u32 compat_old_sigset_t; 1273dd681d9SWill Deacon 1283dd681d9SWill Deacon #define _COMPAT_NSIG 64 1293dd681d9SWill Deacon #define _COMPAT_NSIG_BPW 32 1303dd681d9SWill Deacon 1313dd681d9SWill Deacon typedef u32 compat_sigset_word; 1323dd681d9SWill Deacon 1333dd681d9SWill Deacon #define COMPAT_OFF_T_MAX 0x7fffffff 1343dd681d9SWill Deacon #define COMPAT_LOFF_T_MAX 0x7fffffffffffffffL 1353dd681d9SWill Deacon 1363dd681d9SWill Deacon /* 1373dd681d9SWill Deacon * A pointer passed in from user mode. This should not 1383dd681d9SWill Deacon * be used for syscall parameters, just declare them 1393dd681d9SWill Deacon * as pointers because the syscall entry code will have 1403dd681d9SWill Deacon * appropriately converted them already. 1413dd681d9SWill Deacon */ 1423dd681d9SWill Deacon typedef u32 compat_uptr_t; 1433dd681d9SWill Deacon 1443dd681d9SWill Deacon static inline void __user *compat_ptr(compat_uptr_t uptr) 1453dd681d9SWill Deacon { 1463dd681d9SWill Deacon return (void __user *)(unsigned long)uptr; 1473dd681d9SWill Deacon } 1483dd681d9SWill Deacon 1493dd681d9SWill Deacon static inline compat_uptr_t ptr_to_compat(void __user *uptr) 1503dd681d9SWill Deacon { 1513dd681d9SWill Deacon return (u32)(unsigned long)uptr; 1523dd681d9SWill Deacon } 1533dd681d9SWill Deacon 1543dd681d9SWill Deacon static inline void __user *arch_compat_alloc_user_space(long len) 1553dd681d9SWill Deacon { 1563dd681d9SWill Deacon struct pt_regs *regs = task_pt_regs(current); 1573dd681d9SWill Deacon return (void __user *)regs->compat_sp - len; 1583dd681d9SWill Deacon } 1593dd681d9SWill Deacon 1603dd681d9SWill Deacon struct compat_ipc64_perm { 1613dd681d9SWill Deacon compat_key_t key; 1623dd681d9SWill Deacon __compat_uid32_t uid; 1633dd681d9SWill Deacon __compat_gid32_t gid; 1643dd681d9SWill Deacon __compat_uid32_t cuid; 1653dd681d9SWill Deacon __compat_gid32_t cgid; 1663dd681d9SWill Deacon unsigned short mode; 1673dd681d9SWill Deacon unsigned short __pad1; 1683dd681d9SWill Deacon unsigned short seq; 1693dd681d9SWill Deacon unsigned short __pad2; 1703dd681d9SWill Deacon compat_ulong_t unused1; 1713dd681d9SWill Deacon compat_ulong_t unused2; 1723dd681d9SWill Deacon }; 1733dd681d9SWill Deacon 1743dd681d9SWill Deacon struct compat_semid64_ds { 1753dd681d9SWill Deacon struct compat_ipc64_perm sem_perm; 1763dd681d9SWill Deacon compat_time_t sem_otime; 1773dd681d9SWill Deacon compat_ulong_t __unused1; 1783dd681d9SWill Deacon compat_time_t sem_ctime; 1793dd681d9SWill Deacon compat_ulong_t __unused2; 1803dd681d9SWill Deacon compat_ulong_t sem_nsems; 1813dd681d9SWill Deacon compat_ulong_t __unused3; 1823dd681d9SWill Deacon compat_ulong_t __unused4; 1833dd681d9SWill Deacon }; 1843dd681d9SWill Deacon 1853dd681d9SWill Deacon struct compat_msqid64_ds { 1863dd681d9SWill Deacon struct compat_ipc64_perm msg_perm; 1873dd681d9SWill Deacon compat_time_t msg_stime; 1883dd681d9SWill Deacon compat_ulong_t __unused1; 1893dd681d9SWill Deacon compat_time_t msg_rtime; 1903dd681d9SWill Deacon compat_ulong_t __unused2; 1913dd681d9SWill Deacon compat_time_t msg_ctime; 1923dd681d9SWill Deacon compat_ulong_t __unused3; 1933dd681d9SWill Deacon compat_ulong_t msg_cbytes; 1943dd681d9SWill Deacon compat_ulong_t msg_qnum; 1953dd681d9SWill Deacon compat_ulong_t msg_qbytes; 1963dd681d9SWill Deacon compat_pid_t msg_lspid; 1973dd681d9SWill Deacon compat_pid_t msg_lrpid; 1983dd681d9SWill Deacon compat_ulong_t __unused4; 1993dd681d9SWill Deacon compat_ulong_t __unused5; 2003dd681d9SWill Deacon }; 2013dd681d9SWill Deacon 2023dd681d9SWill Deacon struct compat_shmid64_ds { 2033dd681d9SWill Deacon struct compat_ipc64_perm shm_perm; 2043dd681d9SWill Deacon compat_size_t shm_segsz; 2053dd681d9SWill Deacon compat_time_t shm_atime; 2063dd681d9SWill Deacon compat_ulong_t __unused1; 2073dd681d9SWill Deacon compat_time_t shm_dtime; 2083dd681d9SWill Deacon compat_ulong_t __unused2; 2093dd681d9SWill Deacon compat_time_t shm_ctime; 2103dd681d9SWill Deacon compat_ulong_t __unused3; 2113dd681d9SWill Deacon compat_pid_t shm_cpid; 2123dd681d9SWill Deacon compat_pid_t shm_lpid; 2133dd681d9SWill Deacon compat_ulong_t shm_nattch; 2143dd681d9SWill Deacon compat_ulong_t __unused4; 2153dd681d9SWill Deacon compat_ulong_t __unused5; 2163dd681d9SWill Deacon }; 2173dd681d9SWill Deacon 2183dd681d9SWill Deacon static inline int is_compat_task(void) 2193dd681d9SWill Deacon { 2203dd681d9SWill Deacon return test_thread_flag(TIF_32BIT); 2213dd681d9SWill Deacon } 2223dd681d9SWill Deacon 2233dd681d9SWill Deacon static inline int is_compat_thread(struct thread_info *thread) 2243dd681d9SWill Deacon { 2253dd681d9SWill Deacon return test_ti_thread_flag(thread, TIF_32BIT); 2263dd681d9SWill Deacon } 2273dd681d9SWill Deacon 2283dd681d9SWill Deacon #else /* !CONFIG_COMPAT */ 2293dd681d9SWill Deacon 2303dd681d9SWill Deacon static inline int is_compat_task(void) 2313dd681d9SWill Deacon { 2323dd681d9SWill Deacon return 0; 2333dd681d9SWill Deacon } 2343dd681d9SWill Deacon 2353dd681d9SWill Deacon static inline int is_compat_thread(struct thread_info *thread) 2363dd681d9SWill Deacon { 2373dd681d9SWill Deacon return 0; 2383dd681d9SWill Deacon } 2393dd681d9SWill Deacon 2403dd681d9SWill Deacon #endif /* CONFIG_COMPAT */ 2413dd681d9SWill Deacon #endif /* __KERNEL__ */ 2423dd681d9SWill Deacon #endif /* __ASM_COMPAT_H */ 243