1caab277bSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 23dd681d9SWill Deacon /* 33dd681d9SWill Deacon * Copyright (C) 2012 ARM Ltd. 43dd681d9SWill Deacon */ 53dd681d9SWill Deacon #ifndef __ASM_COMPAT_H 63dd681d9SWill Deacon #define __ASM_COMPAT_H 7*556d687aSArnd Bergmann 8*556d687aSArnd Bergmann #include <asm-generic/compat.h> 9*556d687aSArnd Bergmann 103dd681d9SWill Deacon #ifdef CONFIG_COMPAT 113dd681d9SWill Deacon 123dd681d9SWill Deacon /* 133dd681d9SWill Deacon * Architecture specific compatibility types 143dd681d9SWill Deacon */ 153dd681d9SWill Deacon #include <linux/types.h> 163dd681d9SWill Deacon #include <linux/sched.h> 1768db0cf1SIngo Molnar #include <linux/sched/task_stack.h> 183dd681d9SWill Deacon 193dd681d9SWill Deacon #define COMPAT_USER_HZ 100 20a795a38eSWill Deacon #ifdef __AARCH64EB__ 21a795a38eSWill Deacon #define COMPAT_UTS_MACHINE "armv8b\0\0" 22a795a38eSWill Deacon #else 233dd681d9SWill Deacon #define COMPAT_UTS_MACHINE "armv8l\0\0" 24a795a38eSWill Deacon #endif 253dd681d9SWill Deacon 26971a5b6fSVictor Kamensky typedef u16 __compat_uid_t; 27971a5b6fSVictor Kamensky typedef u16 __compat_gid_t; 28f15a2a12SCatalin Marinas typedef u16 __compat_uid16_t; 29f15a2a12SCatalin Marinas typedef u16 __compat_gid16_t; 303dd681d9SWill Deacon typedef u32 __compat_uid32_t; 313dd681d9SWill Deacon typedef u32 __compat_gid32_t; 32f15a2a12SCatalin Marinas typedef u16 compat_mode_t; 333dd681d9SWill Deacon typedef u32 compat_dev_t; 34f15a2a12SCatalin Marinas typedef s32 compat_nlink_t; 353dd681d9SWill Deacon typedef u16 compat_ipc_pid_t; 363dd681d9SWill Deacon typedef u32 compat_caddr_t; 373dd681d9SWill Deacon typedef __kernel_fsid_t compat_fsid_t; 383dd681d9SWill Deacon typedef s64 compat_s64; 393dd681d9SWill Deacon typedef u64 compat_u64; 403dd681d9SWill Deacon 413dd681d9SWill Deacon struct compat_stat { 42a795a38eSWill Deacon #ifdef __AARCH64EB__ 43a795a38eSWill Deacon short st_dev; 44a795a38eSWill Deacon short __pad1; 45a795a38eSWill Deacon #else 463dd681d9SWill Deacon compat_dev_t st_dev; 47a795a38eSWill Deacon #endif 483dd681d9SWill Deacon compat_ino_t st_ino; 493dd681d9SWill Deacon compat_mode_t st_mode; 50f15a2a12SCatalin Marinas compat_ushort_t st_nlink; 51f15a2a12SCatalin Marinas __compat_uid16_t st_uid; 52f15a2a12SCatalin Marinas __compat_gid16_t st_gid; 53a795a38eSWill Deacon #ifdef __AARCH64EB__ 54a795a38eSWill Deacon short st_rdev; 55a795a38eSWill Deacon short __pad2; 56a795a38eSWill Deacon #else 573dd681d9SWill Deacon compat_dev_t st_rdev; 58a795a38eSWill Deacon #endif 593dd681d9SWill Deacon compat_off_t st_size; 603dd681d9SWill Deacon compat_off_t st_blksize; 613dd681d9SWill Deacon compat_off_t st_blocks; 629afc5eeeSArnd Bergmann old_time32_t st_atime; 63f15a2a12SCatalin Marinas compat_ulong_t st_atime_nsec; 649afc5eeeSArnd Bergmann old_time32_t st_mtime; 65f15a2a12SCatalin Marinas compat_ulong_t st_mtime_nsec; 669afc5eeeSArnd Bergmann old_time32_t st_ctime; 67f15a2a12SCatalin Marinas compat_ulong_t st_ctime_nsec; 68f15a2a12SCatalin Marinas compat_ulong_t __unused4[2]; 693dd681d9SWill Deacon }; 703dd681d9SWill Deacon 713dd681d9SWill Deacon struct compat_flock { 723dd681d9SWill Deacon short l_type; 733dd681d9SWill Deacon short l_whence; 743dd681d9SWill Deacon compat_off_t l_start; 753dd681d9SWill Deacon compat_off_t l_len; 763dd681d9SWill Deacon compat_pid_t l_pid; 773dd681d9SWill Deacon }; 783dd681d9SWill Deacon 793dd681d9SWill Deacon #define F_GETLK64 12 /* using 'struct flock64' */ 803dd681d9SWill Deacon #define F_SETLK64 13 813dd681d9SWill Deacon #define F_SETLKW64 14 823dd681d9SWill Deacon 833dd681d9SWill Deacon struct compat_flock64 { 843dd681d9SWill Deacon short l_type; 853dd681d9SWill Deacon short l_whence; 863dd681d9SWill Deacon compat_loff_t l_start; 873dd681d9SWill Deacon compat_loff_t l_len; 883dd681d9SWill Deacon compat_pid_t l_pid; 893dd681d9SWill Deacon }; 903dd681d9SWill Deacon 913dd681d9SWill Deacon struct compat_statfs { 923dd681d9SWill Deacon int f_type; 933dd681d9SWill Deacon int f_bsize; 943dd681d9SWill Deacon int f_blocks; 953dd681d9SWill Deacon int f_bfree; 963dd681d9SWill Deacon int f_bavail; 973dd681d9SWill Deacon int f_files; 983dd681d9SWill Deacon int f_ffree; 993dd681d9SWill Deacon compat_fsid_t f_fsid; 1003dd681d9SWill Deacon int f_namelen; /* SunOS ignores this field. */ 1013dd681d9SWill Deacon int f_frsize; 1023dd681d9SWill Deacon int f_flags; 1033dd681d9SWill Deacon int f_spare[4]; 1043dd681d9SWill Deacon }; 1053dd681d9SWill Deacon 1063dd681d9SWill Deacon #define COMPAT_RLIM_INFINITY 0xffffffff 1073dd681d9SWill Deacon 1083dd681d9SWill Deacon typedef u32 compat_old_sigset_t; 1093dd681d9SWill Deacon 1103dd681d9SWill Deacon #define _COMPAT_NSIG 64 1113dd681d9SWill Deacon #define _COMPAT_NSIG_BPW 32 1123dd681d9SWill Deacon 1133dd681d9SWill Deacon typedef u32 compat_sigset_word; 1143dd681d9SWill Deacon 1153dd681d9SWill Deacon #define COMPAT_OFF_T_MAX 0x7fffffff 1163dd681d9SWill Deacon 1173dd681d9SWill Deacon /* 1183dd681d9SWill Deacon * A pointer passed in from user mode. This should not 1193dd681d9SWill Deacon * be used for syscall parameters, just declare them 1203dd681d9SWill Deacon * as pointers because the syscall entry code will have 1213dd681d9SWill Deacon * appropriately converted them already. 1223dd681d9SWill Deacon */ 1233dd681d9SWill Deacon 1243dd681d9SWill Deacon static inline void __user *compat_ptr(compat_uptr_t uptr) 1253dd681d9SWill Deacon { 1263dd681d9SWill Deacon return (void __user *)(unsigned long)uptr; 1273dd681d9SWill Deacon } 1283dd681d9SWill Deacon 1293dd681d9SWill Deacon static inline compat_uptr_t ptr_to_compat(void __user *uptr) 1303dd681d9SWill Deacon { 1313dd681d9SWill Deacon return (u32)(unsigned long)uptr; 1323dd681d9SWill Deacon } 1333dd681d9SWill Deacon 134adc235afSArnd Bergmann #define compat_user_stack_pointer() (user_stack_pointer(task_pt_regs(current))) 13524951465SWill Deacon #define COMPAT_MINSIGSTKSZ 2048 1369b064fc3SAl Viro 1373dd681d9SWill Deacon static inline void __user *arch_compat_alloc_user_space(long len) 1383dd681d9SWill Deacon { 1399b064fc3SAl Viro return (void __user *)compat_user_stack_pointer() - len; 1403dd681d9SWill Deacon } 1413dd681d9SWill Deacon 1423dd681d9SWill Deacon struct compat_ipc64_perm { 1433dd681d9SWill Deacon compat_key_t key; 1443dd681d9SWill Deacon __compat_uid32_t uid; 1453dd681d9SWill Deacon __compat_gid32_t gid; 1463dd681d9SWill Deacon __compat_uid32_t cuid; 1473dd681d9SWill Deacon __compat_gid32_t cgid; 1483dd681d9SWill Deacon unsigned short mode; 1493dd681d9SWill Deacon unsigned short __pad1; 1503dd681d9SWill Deacon unsigned short seq; 1513dd681d9SWill Deacon unsigned short __pad2; 1523dd681d9SWill Deacon compat_ulong_t unused1; 1533dd681d9SWill Deacon compat_ulong_t unused2; 1543dd681d9SWill Deacon }; 1553dd681d9SWill Deacon 1563dd681d9SWill Deacon struct compat_semid64_ds { 1573dd681d9SWill Deacon struct compat_ipc64_perm sem_perm; 15883335eb4SArnd Bergmann compat_ulong_t sem_otime; 15983335eb4SArnd Bergmann compat_ulong_t sem_otime_high; 16083335eb4SArnd Bergmann compat_ulong_t sem_ctime; 16183335eb4SArnd Bergmann compat_ulong_t sem_ctime_high; 1623dd681d9SWill Deacon compat_ulong_t sem_nsems; 1633dd681d9SWill Deacon compat_ulong_t __unused3; 1643dd681d9SWill Deacon compat_ulong_t __unused4; 1653dd681d9SWill Deacon }; 1663dd681d9SWill Deacon 1673dd681d9SWill Deacon struct compat_msqid64_ds { 1683dd681d9SWill Deacon struct compat_ipc64_perm msg_perm; 16983335eb4SArnd Bergmann compat_ulong_t msg_stime; 17083335eb4SArnd Bergmann compat_ulong_t msg_stime_high; 17183335eb4SArnd Bergmann compat_ulong_t msg_rtime; 17283335eb4SArnd Bergmann compat_ulong_t msg_rtime_high; 17383335eb4SArnd Bergmann compat_ulong_t msg_ctime; 17483335eb4SArnd Bergmann compat_ulong_t msg_ctime_high; 1753dd681d9SWill Deacon compat_ulong_t msg_cbytes; 1763dd681d9SWill Deacon compat_ulong_t msg_qnum; 1773dd681d9SWill Deacon compat_ulong_t msg_qbytes; 1783dd681d9SWill Deacon compat_pid_t msg_lspid; 1793dd681d9SWill Deacon compat_pid_t msg_lrpid; 1803dd681d9SWill Deacon compat_ulong_t __unused4; 1813dd681d9SWill Deacon compat_ulong_t __unused5; 1823dd681d9SWill Deacon }; 1833dd681d9SWill Deacon 1843dd681d9SWill Deacon struct compat_shmid64_ds { 1853dd681d9SWill Deacon struct compat_ipc64_perm shm_perm; 1863dd681d9SWill Deacon compat_size_t shm_segsz; 18783335eb4SArnd Bergmann compat_ulong_t shm_atime; 18883335eb4SArnd Bergmann compat_ulong_t shm_atime_high; 18983335eb4SArnd Bergmann compat_ulong_t shm_dtime; 19083335eb4SArnd Bergmann compat_ulong_t shm_dtime_high; 19183335eb4SArnd Bergmann compat_ulong_t shm_ctime; 19283335eb4SArnd Bergmann compat_ulong_t shm_ctime_high; 1933dd681d9SWill Deacon compat_pid_t shm_cpid; 1943dd681d9SWill Deacon compat_pid_t shm_lpid; 1953dd681d9SWill Deacon compat_ulong_t shm_nattch; 1963dd681d9SWill Deacon compat_ulong_t __unused4; 1973dd681d9SWill Deacon compat_ulong_t __unused5; 1983dd681d9SWill Deacon }; 1993dd681d9SWill Deacon 2003dd681d9SWill Deacon static inline int is_compat_task(void) 2013dd681d9SWill Deacon { 2023dd681d9SWill Deacon return test_thread_flag(TIF_32BIT); 2033dd681d9SWill Deacon } 2043dd681d9SWill Deacon 2053dd681d9SWill Deacon static inline int is_compat_thread(struct thread_info *thread) 2063dd681d9SWill Deacon { 2073dd681d9SWill Deacon return test_ti_thread_flag(thread, TIF_32BIT); 2083dd681d9SWill Deacon } 2093dd681d9SWill Deacon 2103dd681d9SWill Deacon #else /* !CONFIG_COMPAT */ 2113dd681d9SWill Deacon 2123dd681d9SWill Deacon static inline int is_compat_thread(struct thread_info *thread) 2133dd681d9SWill Deacon { 2143dd681d9SWill Deacon return 0; 2153dd681d9SWill Deacon } 2163dd681d9SWill Deacon 2173dd681d9SWill Deacon #endif /* CONFIG_COMPAT */ 2183dd681d9SWill Deacon #endif /* __ASM_COMPAT_H */ 219