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> 267ae42c96SCatalin Marinas #include <linux/ptrace.h> 273dd681d9SWill Deacon 283dd681d9SWill Deacon #define COMPAT_USER_HZ 100 293dd681d9SWill Deacon #define COMPAT_UTS_MACHINE "armv8l\0\0" 303dd681d9SWill Deacon 313dd681d9SWill Deacon typedef u32 compat_size_t; 323dd681d9SWill Deacon typedef s32 compat_ssize_t; 333dd681d9SWill Deacon typedef s32 compat_time_t; 343dd681d9SWill Deacon typedef s32 compat_clock_t; 353dd681d9SWill Deacon typedef s32 compat_pid_t; 363dd681d9SWill Deacon typedef u32 __compat_uid_t; 373dd681d9SWill Deacon typedef u32 __compat_gid_t; 38*f15a2a12SCatalin Marinas typedef u16 __compat_uid16_t; 39*f15a2a12SCatalin Marinas typedef u16 __compat_gid16_t; 403dd681d9SWill Deacon typedef u32 __compat_uid32_t; 413dd681d9SWill Deacon typedef u32 __compat_gid32_t; 42*f15a2a12SCatalin Marinas typedef u16 compat_mode_t; 433dd681d9SWill Deacon typedef u32 compat_ino_t; 443dd681d9SWill Deacon typedef u32 compat_dev_t; 453dd681d9SWill Deacon typedef s32 compat_off_t; 463dd681d9SWill Deacon typedef s64 compat_loff_t; 47*f15a2a12SCatalin Marinas typedef s32 compat_nlink_t; 483dd681d9SWill Deacon typedef u16 compat_ipc_pid_t; 493dd681d9SWill Deacon typedef s32 compat_daddr_t; 503dd681d9SWill Deacon typedef u32 compat_caddr_t; 513dd681d9SWill Deacon typedef __kernel_fsid_t compat_fsid_t; 523dd681d9SWill Deacon typedef s32 compat_key_t; 533dd681d9SWill Deacon typedef s32 compat_timer_t; 543dd681d9SWill Deacon 55*f15a2a12SCatalin Marinas typedef s16 compat_short_t; 563dd681d9SWill Deacon typedef s32 compat_int_t; 573dd681d9SWill Deacon typedef s32 compat_long_t; 583dd681d9SWill Deacon typedef s64 compat_s64; 59*f15a2a12SCatalin Marinas typedef u16 compat_ushort_t; 603dd681d9SWill Deacon typedef u32 compat_uint_t; 613dd681d9SWill Deacon typedef u32 compat_ulong_t; 623dd681d9SWill Deacon typedef u64 compat_u64; 63751f409dSDenys Vlasenko typedef u32 compat_uptr_t; 643dd681d9SWill Deacon 653dd681d9SWill Deacon struct compat_timespec { 663dd681d9SWill Deacon compat_time_t tv_sec; 673dd681d9SWill Deacon s32 tv_nsec; 683dd681d9SWill Deacon }; 693dd681d9SWill Deacon 703dd681d9SWill Deacon struct compat_timeval { 713dd681d9SWill Deacon compat_time_t tv_sec; 723dd681d9SWill Deacon s32 tv_usec; 733dd681d9SWill Deacon }; 743dd681d9SWill Deacon 753dd681d9SWill Deacon struct compat_stat { 763dd681d9SWill Deacon compat_dev_t st_dev; 773dd681d9SWill Deacon compat_ino_t st_ino; 783dd681d9SWill Deacon compat_mode_t st_mode; 79*f15a2a12SCatalin Marinas compat_ushort_t st_nlink; 80*f15a2a12SCatalin Marinas __compat_uid16_t st_uid; 81*f15a2a12SCatalin Marinas __compat_gid16_t st_gid; 823dd681d9SWill Deacon compat_dev_t st_rdev; 833dd681d9SWill Deacon compat_off_t st_size; 843dd681d9SWill Deacon compat_off_t st_blksize; 853dd681d9SWill Deacon compat_off_t st_blocks; 863dd681d9SWill Deacon compat_time_t st_atime; 87*f15a2a12SCatalin Marinas compat_ulong_t st_atime_nsec; 883dd681d9SWill Deacon compat_time_t st_mtime; 89*f15a2a12SCatalin Marinas compat_ulong_t st_mtime_nsec; 903dd681d9SWill Deacon compat_time_t st_ctime; 91*f15a2a12SCatalin Marinas compat_ulong_t st_ctime_nsec; 92*f15a2a12SCatalin Marinas compat_ulong_t __unused4[2]; 933dd681d9SWill Deacon }; 943dd681d9SWill Deacon 953dd681d9SWill Deacon struct compat_flock { 963dd681d9SWill Deacon short l_type; 973dd681d9SWill Deacon short l_whence; 983dd681d9SWill Deacon compat_off_t l_start; 993dd681d9SWill Deacon compat_off_t l_len; 1003dd681d9SWill Deacon compat_pid_t l_pid; 1013dd681d9SWill Deacon }; 1023dd681d9SWill Deacon 1033dd681d9SWill Deacon #define F_GETLK64 12 /* using 'struct flock64' */ 1043dd681d9SWill Deacon #define F_SETLK64 13 1053dd681d9SWill Deacon #define F_SETLKW64 14 1063dd681d9SWill Deacon 1073dd681d9SWill Deacon struct compat_flock64 { 1083dd681d9SWill Deacon short l_type; 1093dd681d9SWill Deacon short l_whence; 1103dd681d9SWill Deacon compat_loff_t l_start; 1113dd681d9SWill Deacon compat_loff_t l_len; 1123dd681d9SWill Deacon compat_pid_t l_pid; 1133dd681d9SWill Deacon }; 1143dd681d9SWill Deacon 1153dd681d9SWill Deacon struct compat_statfs { 1163dd681d9SWill Deacon int f_type; 1173dd681d9SWill Deacon int f_bsize; 1183dd681d9SWill Deacon int f_blocks; 1193dd681d9SWill Deacon int f_bfree; 1203dd681d9SWill Deacon int f_bavail; 1213dd681d9SWill Deacon int f_files; 1223dd681d9SWill Deacon int f_ffree; 1233dd681d9SWill Deacon compat_fsid_t f_fsid; 1243dd681d9SWill Deacon int f_namelen; /* SunOS ignores this field. */ 1253dd681d9SWill Deacon int f_frsize; 1263dd681d9SWill Deacon int f_flags; 1273dd681d9SWill Deacon int f_spare[4]; 1283dd681d9SWill Deacon }; 1293dd681d9SWill Deacon 1303dd681d9SWill Deacon #define COMPAT_RLIM_INFINITY 0xffffffff 1313dd681d9SWill Deacon 1323dd681d9SWill Deacon typedef u32 compat_old_sigset_t; 1333dd681d9SWill Deacon 1343dd681d9SWill Deacon #define _COMPAT_NSIG 64 1353dd681d9SWill Deacon #define _COMPAT_NSIG_BPW 32 1363dd681d9SWill Deacon 1373dd681d9SWill Deacon typedef u32 compat_sigset_word; 1383dd681d9SWill Deacon 139751f409dSDenys Vlasenko typedef union compat_sigval { 140751f409dSDenys Vlasenko compat_int_t sival_int; 141751f409dSDenys Vlasenko compat_uptr_t sival_ptr; 142751f409dSDenys Vlasenko } compat_sigval_t; 143751f409dSDenys Vlasenko 144751f409dSDenys Vlasenko typedef struct compat_siginfo { 145751f409dSDenys Vlasenko int si_signo; 146751f409dSDenys Vlasenko int si_errno; 147751f409dSDenys Vlasenko int si_code; 148751f409dSDenys Vlasenko 149751f409dSDenys Vlasenko union { 150751f409dSDenys Vlasenko /* The padding is the same size as AArch64. */ 151751f409dSDenys Vlasenko int _pad[128/sizeof(int) - 3]; 152751f409dSDenys Vlasenko 153751f409dSDenys Vlasenko /* kill() */ 154751f409dSDenys Vlasenko struct { 155751f409dSDenys Vlasenko compat_pid_t _pid; /* sender's pid */ 156751f409dSDenys Vlasenko __compat_uid32_t _uid; /* sender's uid */ 157751f409dSDenys Vlasenko } _kill; 158751f409dSDenys Vlasenko 159751f409dSDenys Vlasenko /* POSIX.1b timers */ 160751f409dSDenys Vlasenko struct { 161751f409dSDenys Vlasenko compat_timer_t _tid; /* timer id */ 162751f409dSDenys Vlasenko int _overrun; /* overrun count */ 163751f409dSDenys Vlasenko compat_sigval_t _sigval; /* same as below */ 164751f409dSDenys Vlasenko int _sys_private; /* not to be passed to user */ 165751f409dSDenys Vlasenko } _timer; 166751f409dSDenys Vlasenko 167751f409dSDenys Vlasenko /* POSIX.1b signals */ 168751f409dSDenys Vlasenko struct { 169751f409dSDenys Vlasenko compat_pid_t _pid; /* sender's pid */ 170751f409dSDenys Vlasenko __compat_uid32_t _uid; /* sender's uid */ 171751f409dSDenys Vlasenko compat_sigval_t _sigval; 172751f409dSDenys Vlasenko } _rt; 173751f409dSDenys Vlasenko 174751f409dSDenys Vlasenko /* SIGCHLD */ 175751f409dSDenys Vlasenko struct { 176751f409dSDenys Vlasenko compat_pid_t _pid; /* which child */ 177751f409dSDenys Vlasenko __compat_uid32_t _uid; /* sender's uid */ 178751f409dSDenys Vlasenko int _status; /* exit code */ 179751f409dSDenys Vlasenko compat_clock_t _utime; 180751f409dSDenys Vlasenko compat_clock_t _stime; 181751f409dSDenys Vlasenko } _sigchld; 182751f409dSDenys Vlasenko 183751f409dSDenys Vlasenko /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ 184751f409dSDenys Vlasenko struct { 185751f409dSDenys Vlasenko compat_uptr_t _addr; /* faulting insn/memory ref. */ 186751f409dSDenys Vlasenko short _addr_lsb; /* LSB of the reported address */ 187751f409dSDenys Vlasenko } _sigfault; 188751f409dSDenys Vlasenko 189751f409dSDenys Vlasenko /* SIGPOLL */ 190751f409dSDenys Vlasenko struct { 191751f409dSDenys Vlasenko compat_long_t _band; /* POLL_IN, POLL_OUT, POLL_MSG */ 192751f409dSDenys Vlasenko int _fd; 193751f409dSDenys Vlasenko } _sigpoll; 194751f409dSDenys Vlasenko } _sifields; 195751f409dSDenys Vlasenko } compat_siginfo_t; 196751f409dSDenys Vlasenko 1973dd681d9SWill Deacon #define COMPAT_OFF_T_MAX 0x7fffffff 1983dd681d9SWill Deacon #define COMPAT_LOFF_T_MAX 0x7fffffffffffffffL 1993dd681d9SWill Deacon 2003dd681d9SWill Deacon /* 2013dd681d9SWill Deacon * A pointer passed in from user mode. This should not 2023dd681d9SWill Deacon * be used for syscall parameters, just declare them 2033dd681d9SWill Deacon * as pointers because the syscall entry code will have 2043dd681d9SWill Deacon * appropriately converted them already. 2053dd681d9SWill Deacon */ 2063dd681d9SWill Deacon 2073dd681d9SWill Deacon static inline void __user *compat_ptr(compat_uptr_t uptr) 2083dd681d9SWill Deacon { 2093dd681d9SWill Deacon return (void __user *)(unsigned long)uptr; 2103dd681d9SWill Deacon } 2113dd681d9SWill Deacon 2123dd681d9SWill Deacon static inline compat_uptr_t ptr_to_compat(void __user *uptr) 2133dd681d9SWill Deacon { 2143dd681d9SWill Deacon return (u32)(unsigned long)uptr; 2153dd681d9SWill Deacon } 2163dd681d9SWill Deacon 2179b064fc3SAl Viro #define compat_user_stack_pointer() (current_pt_regs()->compat_sp) 2189b064fc3SAl Viro 2193dd681d9SWill Deacon static inline void __user *arch_compat_alloc_user_space(long len) 2203dd681d9SWill Deacon { 2219b064fc3SAl Viro return (void __user *)compat_user_stack_pointer() - len; 2223dd681d9SWill Deacon } 2233dd681d9SWill Deacon 2243dd681d9SWill Deacon struct compat_ipc64_perm { 2253dd681d9SWill Deacon compat_key_t key; 2263dd681d9SWill Deacon __compat_uid32_t uid; 2273dd681d9SWill Deacon __compat_gid32_t gid; 2283dd681d9SWill Deacon __compat_uid32_t cuid; 2293dd681d9SWill Deacon __compat_gid32_t cgid; 2303dd681d9SWill Deacon unsigned short mode; 2313dd681d9SWill Deacon unsigned short __pad1; 2323dd681d9SWill Deacon unsigned short seq; 2333dd681d9SWill Deacon unsigned short __pad2; 2343dd681d9SWill Deacon compat_ulong_t unused1; 2353dd681d9SWill Deacon compat_ulong_t unused2; 2363dd681d9SWill Deacon }; 2373dd681d9SWill Deacon 2383dd681d9SWill Deacon struct compat_semid64_ds { 2393dd681d9SWill Deacon struct compat_ipc64_perm sem_perm; 2403dd681d9SWill Deacon compat_time_t sem_otime; 2413dd681d9SWill Deacon compat_ulong_t __unused1; 2423dd681d9SWill Deacon compat_time_t sem_ctime; 2433dd681d9SWill Deacon compat_ulong_t __unused2; 2443dd681d9SWill Deacon compat_ulong_t sem_nsems; 2453dd681d9SWill Deacon compat_ulong_t __unused3; 2463dd681d9SWill Deacon compat_ulong_t __unused4; 2473dd681d9SWill Deacon }; 2483dd681d9SWill Deacon 2493dd681d9SWill Deacon struct compat_msqid64_ds { 2503dd681d9SWill Deacon struct compat_ipc64_perm msg_perm; 2513dd681d9SWill Deacon compat_time_t msg_stime; 2523dd681d9SWill Deacon compat_ulong_t __unused1; 2533dd681d9SWill Deacon compat_time_t msg_rtime; 2543dd681d9SWill Deacon compat_ulong_t __unused2; 2553dd681d9SWill Deacon compat_time_t msg_ctime; 2563dd681d9SWill Deacon compat_ulong_t __unused3; 2573dd681d9SWill Deacon compat_ulong_t msg_cbytes; 2583dd681d9SWill Deacon compat_ulong_t msg_qnum; 2593dd681d9SWill Deacon compat_ulong_t msg_qbytes; 2603dd681d9SWill Deacon compat_pid_t msg_lspid; 2613dd681d9SWill Deacon compat_pid_t msg_lrpid; 2623dd681d9SWill Deacon compat_ulong_t __unused4; 2633dd681d9SWill Deacon compat_ulong_t __unused5; 2643dd681d9SWill Deacon }; 2653dd681d9SWill Deacon 2663dd681d9SWill Deacon struct compat_shmid64_ds { 2673dd681d9SWill Deacon struct compat_ipc64_perm shm_perm; 2683dd681d9SWill Deacon compat_size_t shm_segsz; 2693dd681d9SWill Deacon compat_time_t shm_atime; 2703dd681d9SWill Deacon compat_ulong_t __unused1; 2713dd681d9SWill Deacon compat_time_t shm_dtime; 2723dd681d9SWill Deacon compat_ulong_t __unused2; 2733dd681d9SWill Deacon compat_time_t shm_ctime; 2743dd681d9SWill Deacon compat_ulong_t __unused3; 2753dd681d9SWill Deacon compat_pid_t shm_cpid; 2763dd681d9SWill Deacon compat_pid_t shm_lpid; 2773dd681d9SWill Deacon compat_ulong_t shm_nattch; 2783dd681d9SWill Deacon compat_ulong_t __unused4; 2793dd681d9SWill Deacon compat_ulong_t __unused5; 2803dd681d9SWill Deacon }; 2813dd681d9SWill Deacon 2823dd681d9SWill Deacon static inline int is_compat_task(void) 2833dd681d9SWill Deacon { 2843dd681d9SWill Deacon return test_thread_flag(TIF_32BIT); 2853dd681d9SWill Deacon } 2863dd681d9SWill Deacon 2873dd681d9SWill Deacon static inline int is_compat_thread(struct thread_info *thread) 2883dd681d9SWill Deacon { 2893dd681d9SWill Deacon return test_ti_thread_flag(thread, TIF_32BIT); 2903dd681d9SWill Deacon } 2913dd681d9SWill Deacon 2923dd681d9SWill Deacon #else /* !CONFIG_COMPAT */ 2933dd681d9SWill Deacon 2943dd681d9SWill Deacon static inline int is_compat_task(void) 2953dd681d9SWill Deacon { 2963dd681d9SWill Deacon return 0; 2973dd681d9SWill Deacon } 2983dd681d9SWill Deacon 2993dd681d9SWill Deacon static inline int is_compat_thread(struct thread_info *thread) 3003dd681d9SWill Deacon { 3013dd681d9SWill Deacon return 0; 3023dd681d9SWill Deacon } 3033dd681d9SWill Deacon 3043dd681d9SWill Deacon #endif /* CONFIG_COMPAT */ 3053dd681d9SWill Deacon #endif /* __KERNEL__ */ 3063dd681d9SWill Deacon #endif /* __ASM_COMPAT_H */ 307