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> 2668db0cf1SIngo Molnar #include <linux/sched/task_stack.h> 273dd681d9SWill Deacon 283dd681d9SWill Deacon #define COMPAT_USER_HZ 100 29a795a38eSWill Deacon #ifdef __AARCH64EB__ 30a795a38eSWill Deacon #define COMPAT_UTS_MACHINE "armv8b\0\0" 31a795a38eSWill Deacon #else 323dd681d9SWill Deacon #define COMPAT_UTS_MACHINE "armv8l\0\0" 33a795a38eSWill Deacon #endif 343dd681d9SWill Deacon 353dd681d9SWill Deacon typedef u32 compat_size_t; 363dd681d9SWill Deacon typedef s32 compat_ssize_t; 373dd681d9SWill Deacon typedef s32 compat_clock_t; 383dd681d9SWill Deacon typedef s32 compat_pid_t; 39971a5b6fSVictor Kamensky typedef u16 __compat_uid_t; 40971a5b6fSVictor Kamensky typedef u16 __compat_gid_t; 41f15a2a12SCatalin Marinas typedef u16 __compat_uid16_t; 42f15a2a12SCatalin Marinas typedef u16 __compat_gid16_t; 433dd681d9SWill Deacon typedef u32 __compat_uid32_t; 443dd681d9SWill Deacon typedef u32 __compat_gid32_t; 45f15a2a12SCatalin Marinas typedef u16 compat_mode_t; 463dd681d9SWill Deacon typedef u32 compat_ino_t; 473dd681d9SWill Deacon typedef u32 compat_dev_t; 483dd681d9SWill Deacon typedef s32 compat_off_t; 493dd681d9SWill Deacon typedef s64 compat_loff_t; 50f15a2a12SCatalin Marinas typedef s32 compat_nlink_t; 513dd681d9SWill Deacon typedef u16 compat_ipc_pid_t; 523dd681d9SWill Deacon typedef s32 compat_daddr_t; 533dd681d9SWill Deacon typedef u32 compat_caddr_t; 543dd681d9SWill Deacon typedef __kernel_fsid_t compat_fsid_t; 553dd681d9SWill Deacon typedef s32 compat_key_t; 563dd681d9SWill Deacon typedef s32 compat_timer_t; 573dd681d9SWill Deacon 58f15a2a12SCatalin Marinas typedef s16 compat_short_t; 593dd681d9SWill Deacon typedef s32 compat_int_t; 603dd681d9SWill Deacon typedef s32 compat_long_t; 613dd681d9SWill Deacon typedef s64 compat_s64; 62f15a2a12SCatalin Marinas typedef u16 compat_ushort_t; 633dd681d9SWill Deacon typedef u32 compat_uint_t; 643dd681d9SWill Deacon typedef u32 compat_ulong_t; 653dd681d9SWill Deacon typedef u64 compat_u64; 66751f409dSDenys Vlasenko typedef u32 compat_uptr_t; 673dd681d9SWill Deacon 683dd681d9SWill Deacon struct compat_stat { 69a795a38eSWill Deacon #ifdef __AARCH64EB__ 70a795a38eSWill Deacon short st_dev; 71a795a38eSWill Deacon short __pad1; 72a795a38eSWill Deacon #else 733dd681d9SWill Deacon compat_dev_t st_dev; 74a795a38eSWill Deacon #endif 753dd681d9SWill Deacon compat_ino_t st_ino; 763dd681d9SWill Deacon compat_mode_t st_mode; 77f15a2a12SCatalin Marinas compat_ushort_t st_nlink; 78f15a2a12SCatalin Marinas __compat_uid16_t st_uid; 79f15a2a12SCatalin Marinas __compat_gid16_t st_gid; 80a795a38eSWill Deacon #ifdef __AARCH64EB__ 81a795a38eSWill Deacon short st_rdev; 82a795a38eSWill Deacon short __pad2; 83a795a38eSWill Deacon #else 843dd681d9SWill Deacon compat_dev_t st_rdev; 85a795a38eSWill Deacon #endif 863dd681d9SWill Deacon compat_off_t st_size; 873dd681d9SWill Deacon compat_off_t st_blksize; 883dd681d9SWill Deacon compat_off_t st_blocks; 893dd681d9SWill Deacon compat_time_t st_atime; 90f15a2a12SCatalin Marinas compat_ulong_t st_atime_nsec; 913dd681d9SWill Deacon compat_time_t st_mtime; 92f15a2a12SCatalin Marinas compat_ulong_t st_mtime_nsec; 933dd681d9SWill Deacon compat_time_t st_ctime; 94f15a2a12SCatalin Marinas compat_ulong_t st_ctime_nsec; 95f15a2a12SCatalin Marinas compat_ulong_t __unused4[2]; 963dd681d9SWill Deacon }; 973dd681d9SWill Deacon 983dd681d9SWill Deacon struct compat_flock { 993dd681d9SWill Deacon short l_type; 1003dd681d9SWill Deacon short l_whence; 1013dd681d9SWill Deacon compat_off_t l_start; 1023dd681d9SWill Deacon compat_off_t l_len; 1033dd681d9SWill Deacon compat_pid_t l_pid; 1043dd681d9SWill Deacon }; 1053dd681d9SWill Deacon 1063dd681d9SWill Deacon #define F_GETLK64 12 /* using 'struct flock64' */ 1073dd681d9SWill Deacon #define F_SETLK64 13 1083dd681d9SWill Deacon #define F_SETLKW64 14 1093dd681d9SWill Deacon 1103dd681d9SWill Deacon struct compat_flock64 { 1113dd681d9SWill Deacon short l_type; 1123dd681d9SWill Deacon short l_whence; 1133dd681d9SWill Deacon compat_loff_t l_start; 1143dd681d9SWill Deacon compat_loff_t l_len; 1153dd681d9SWill Deacon compat_pid_t l_pid; 1163dd681d9SWill Deacon }; 1173dd681d9SWill Deacon 1183dd681d9SWill Deacon struct compat_statfs { 1193dd681d9SWill Deacon int f_type; 1203dd681d9SWill Deacon int f_bsize; 1213dd681d9SWill Deacon int f_blocks; 1223dd681d9SWill Deacon int f_bfree; 1233dd681d9SWill Deacon int f_bavail; 1243dd681d9SWill Deacon int f_files; 1253dd681d9SWill Deacon int f_ffree; 1263dd681d9SWill Deacon compat_fsid_t f_fsid; 1273dd681d9SWill Deacon int f_namelen; /* SunOS ignores this field. */ 1283dd681d9SWill Deacon int f_frsize; 1293dd681d9SWill Deacon int f_flags; 1303dd681d9SWill Deacon int f_spare[4]; 1313dd681d9SWill Deacon }; 1323dd681d9SWill Deacon 1333dd681d9SWill Deacon #define COMPAT_RLIM_INFINITY 0xffffffff 1343dd681d9SWill Deacon 1353dd681d9SWill Deacon typedef u32 compat_old_sigset_t; 1363dd681d9SWill Deacon 1373dd681d9SWill Deacon #define _COMPAT_NSIG 64 1383dd681d9SWill Deacon #define _COMPAT_NSIG_BPW 32 1393dd681d9SWill Deacon 1403dd681d9SWill Deacon typedef u32 compat_sigset_word; 1413dd681d9SWill Deacon 1423dd681d9SWill Deacon #define COMPAT_OFF_T_MAX 0x7fffffff 1433dd681d9SWill Deacon 1443dd681d9SWill Deacon /* 1453dd681d9SWill Deacon * A pointer passed in from user mode. This should not 1463dd681d9SWill Deacon * be used for syscall parameters, just declare them 1473dd681d9SWill Deacon * as pointers because the syscall entry code will have 1483dd681d9SWill Deacon * appropriately converted them already. 1493dd681d9SWill Deacon */ 1503dd681d9SWill Deacon 1513dd681d9SWill Deacon static inline void __user *compat_ptr(compat_uptr_t uptr) 1523dd681d9SWill Deacon { 1533dd681d9SWill Deacon return (void __user *)(unsigned long)uptr; 1543dd681d9SWill Deacon } 1553dd681d9SWill Deacon 1563dd681d9SWill Deacon static inline compat_uptr_t ptr_to_compat(void __user *uptr) 1573dd681d9SWill Deacon { 1583dd681d9SWill Deacon return (u32)(unsigned long)uptr; 1593dd681d9SWill Deacon } 1603dd681d9SWill Deacon 161adc235afSArnd Bergmann #define compat_user_stack_pointer() (user_stack_pointer(task_pt_regs(current))) 162*24951465SWill Deacon #define COMPAT_MINSIGSTKSZ 2048 1639b064fc3SAl Viro 1643dd681d9SWill Deacon static inline void __user *arch_compat_alloc_user_space(long len) 1653dd681d9SWill Deacon { 1669b064fc3SAl Viro return (void __user *)compat_user_stack_pointer() - len; 1673dd681d9SWill Deacon } 1683dd681d9SWill Deacon 1693dd681d9SWill Deacon struct compat_ipc64_perm { 1703dd681d9SWill Deacon compat_key_t key; 1713dd681d9SWill Deacon __compat_uid32_t uid; 1723dd681d9SWill Deacon __compat_gid32_t gid; 1733dd681d9SWill Deacon __compat_uid32_t cuid; 1743dd681d9SWill Deacon __compat_gid32_t cgid; 1753dd681d9SWill Deacon unsigned short mode; 1763dd681d9SWill Deacon unsigned short __pad1; 1773dd681d9SWill Deacon unsigned short seq; 1783dd681d9SWill Deacon unsigned short __pad2; 1793dd681d9SWill Deacon compat_ulong_t unused1; 1803dd681d9SWill Deacon compat_ulong_t unused2; 1813dd681d9SWill Deacon }; 1823dd681d9SWill Deacon 1833dd681d9SWill Deacon struct compat_semid64_ds { 1843dd681d9SWill Deacon struct compat_ipc64_perm sem_perm; 18583335eb4SArnd Bergmann compat_ulong_t sem_otime; 18683335eb4SArnd Bergmann compat_ulong_t sem_otime_high; 18783335eb4SArnd Bergmann compat_ulong_t sem_ctime; 18883335eb4SArnd Bergmann compat_ulong_t sem_ctime_high; 1893dd681d9SWill Deacon compat_ulong_t sem_nsems; 1903dd681d9SWill Deacon compat_ulong_t __unused3; 1913dd681d9SWill Deacon compat_ulong_t __unused4; 1923dd681d9SWill Deacon }; 1933dd681d9SWill Deacon 1943dd681d9SWill Deacon struct compat_msqid64_ds { 1953dd681d9SWill Deacon struct compat_ipc64_perm msg_perm; 19683335eb4SArnd Bergmann compat_ulong_t msg_stime; 19783335eb4SArnd Bergmann compat_ulong_t msg_stime_high; 19883335eb4SArnd Bergmann compat_ulong_t msg_rtime; 19983335eb4SArnd Bergmann compat_ulong_t msg_rtime_high; 20083335eb4SArnd Bergmann compat_ulong_t msg_ctime; 20183335eb4SArnd Bergmann compat_ulong_t msg_ctime_high; 2023dd681d9SWill Deacon compat_ulong_t msg_cbytes; 2033dd681d9SWill Deacon compat_ulong_t msg_qnum; 2043dd681d9SWill Deacon compat_ulong_t msg_qbytes; 2053dd681d9SWill Deacon compat_pid_t msg_lspid; 2063dd681d9SWill Deacon compat_pid_t msg_lrpid; 2073dd681d9SWill Deacon compat_ulong_t __unused4; 2083dd681d9SWill Deacon compat_ulong_t __unused5; 2093dd681d9SWill Deacon }; 2103dd681d9SWill Deacon 2113dd681d9SWill Deacon struct compat_shmid64_ds { 2123dd681d9SWill Deacon struct compat_ipc64_perm shm_perm; 2133dd681d9SWill Deacon compat_size_t shm_segsz; 21483335eb4SArnd Bergmann compat_ulong_t shm_atime; 21583335eb4SArnd Bergmann compat_ulong_t shm_atime_high; 21683335eb4SArnd Bergmann compat_ulong_t shm_dtime; 21783335eb4SArnd Bergmann compat_ulong_t shm_dtime_high; 21883335eb4SArnd Bergmann compat_ulong_t shm_ctime; 21983335eb4SArnd Bergmann compat_ulong_t shm_ctime_high; 2203dd681d9SWill Deacon compat_pid_t shm_cpid; 2213dd681d9SWill Deacon compat_pid_t shm_lpid; 2223dd681d9SWill Deacon compat_ulong_t shm_nattch; 2233dd681d9SWill Deacon compat_ulong_t __unused4; 2243dd681d9SWill Deacon compat_ulong_t __unused5; 2253dd681d9SWill Deacon }; 2263dd681d9SWill Deacon 2273dd681d9SWill Deacon static inline int is_compat_task(void) 2283dd681d9SWill Deacon { 2293dd681d9SWill Deacon return test_thread_flag(TIF_32BIT); 2303dd681d9SWill Deacon } 2313dd681d9SWill Deacon 2323dd681d9SWill Deacon static inline int is_compat_thread(struct thread_info *thread) 2333dd681d9SWill Deacon { 2343dd681d9SWill Deacon return test_ti_thread_flag(thread, TIF_32BIT); 2353dd681d9SWill Deacon } 2363dd681d9SWill Deacon 2373dd681d9SWill Deacon #else /* !CONFIG_COMPAT */ 2383dd681d9SWill Deacon 2393dd681d9SWill Deacon static inline int is_compat_thread(struct thread_info *thread) 2403dd681d9SWill Deacon { 2413dd681d9SWill Deacon return 0; 2423dd681d9SWill Deacon } 2433dd681d9SWill Deacon 2443dd681d9SWill Deacon #endif /* CONFIG_COMPAT */ 2453dd681d9SWill Deacon #endif /* __KERNEL__ */ 2463dd681d9SWill Deacon #endif /* __ASM_COMPAT_H */ 247