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 7556d687aSArnd Bergmann 8*1a33b18bSArnd Bergmann #define compat_mode_t compat_mode_t 9*1a33b18bSArnd Bergmann typedef u16 compat_mode_t; 10*1a33b18bSArnd Bergmann 11556d687aSArnd Bergmann #include <asm-generic/compat.h> 12556d687aSArnd Bergmann 133dd681d9SWill Deacon #ifdef CONFIG_COMPAT 143dd681d9SWill Deacon 153dd681d9SWill Deacon /* 163dd681d9SWill Deacon * Architecture specific compatibility types 173dd681d9SWill Deacon */ 183dd681d9SWill Deacon #include <linux/types.h> 193dd681d9SWill Deacon #include <linux/sched.h> 2068db0cf1SIngo Molnar #include <linux/sched/task_stack.h> 213dd681d9SWill Deacon 223dd681d9SWill Deacon #define COMPAT_USER_HZ 100 23a795a38eSWill Deacon #ifdef __AARCH64EB__ 24a795a38eSWill Deacon #define COMPAT_UTS_MACHINE "armv8b\0\0" 25a795a38eSWill Deacon #else 263dd681d9SWill Deacon #define COMPAT_UTS_MACHINE "armv8l\0\0" 27a795a38eSWill Deacon #endif 283dd681d9SWill Deacon 29971a5b6fSVictor Kamensky typedef u16 __compat_uid_t; 30971a5b6fSVictor Kamensky typedef u16 __compat_gid_t; 31f15a2a12SCatalin Marinas typedef u16 __compat_uid16_t; 32f15a2a12SCatalin Marinas typedef u16 __compat_gid16_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 __kernel_fsid_t compat_fsid_t; 373dd681d9SWill Deacon 383dd681d9SWill Deacon struct compat_stat { 39a795a38eSWill Deacon #ifdef __AARCH64EB__ 40a795a38eSWill Deacon short st_dev; 41a795a38eSWill Deacon short __pad1; 42a795a38eSWill Deacon #else 433dd681d9SWill Deacon compat_dev_t st_dev; 44a795a38eSWill Deacon #endif 453dd681d9SWill Deacon compat_ino_t st_ino; 463dd681d9SWill Deacon compat_mode_t st_mode; 47f15a2a12SCatalin Marinas compat_ushort_t st_nlink; 48f15a2a12SCatalin Marinas __compat_uid16_t st_uid; 49f15a2a12SCatalin Marinas __compat_gid16_t st_gid; 50a795a38eSWill Deacon #ifdef __AARCH64EB__ 51a795a38eSWill Deacon short st_rdev; 52a795a38eSWill Deacon short __pad2; 53a795a38eSWill Deacon #else 543dd681d9SWill Deacon compat_dev_t st_rdev; 55a795a38eSWill Deacon #endif 563dd681d9SWill Deacon compat_off_t st_size; 573dd681d9SWill Deacon compat_off_t st_blksize; 583dd681d9SWill Deacon compat_off_t st_blocks; 599afc5eeeSArnd Bergmann old_time32_t st_atime; 60f15a2a12SCatalin Marinas compat_ulong_t st_atime_nsec; 619afc5eeeSArnd Bergmann old_time32_t st_mtime; 62f15a2a12SCatalin Marinas compat_ulong_t st_mtime_nsec; 639afc5eeeSArnd Bergmann old_time32_t st_ctime; 64f15a2a12SCatalin Marinas compat_ulong_t st_ctime_nsec; 65f15a2a12SCatalin Marinas compat_ulong_t __unused4[2]; 663dd681d9SWill Deacon }; 673dd681d9SWill Deacon 683dd681d9SWill Deacon struct compat_flock { 693dd681d9SWill Deacon short l_type; 703dd681d9SWill Deacon short l_whence; 713dd681d9SWill Deacon compat_off_t l_start; 723dd681d9SWill Deacon compat_off_t l_len; 733dd681d9SWill Deacon compat_pid_t l_pid; 743dd681d9SWill Deacon }; 753dd681d9SWill Deacon 763dd681d9SWill Deacon #define F_GETLK64 12 /* using 'struct flock64' */ 773dd681d9SWill Deacon #define F_SETLK64 13 783dd681d9SWill Deacon #define F_SETLKW64 14 793dd681d9SWill Deacon 803dd681d9SWill Deacon struct compat_flock64 { 813dd681d9SWill Deacon short l_type; 823dd681d9SWill Deacon short l_whence; 833dd681d9SWill Deacon compat_loff_t l_start; 843dd681d9SWill Deacon compat_loff_t l_len; 853dd681d9SWill Deacon compat_pid_t l_pid; 863dd681d9SWill Deacon }; 873dd681d9SWill Deacon 883dd681d9SWill Deacon struct compat_statfs { 893dd681d9SWill Deacon int f_type; 903dd681d9SWill Deacon int f_bsize; 913dd681d9SWill Deacon int f_blocks; 923dd681d9SWill Deacon int f_bfree; 933dd681d9SWill Deacon int f_bavail; 943dd681d9SWill Deacon int f_files; 953dd681d9SWill Deacon int f_ffree; 963dd681d9SWill Deacon compat_fsid_t f_fsid; 973dd681d9SWill Deacon int f_namelen; /* SunOS ignores this field. */ 983dd681d9SWill Deacon int f_frsize; 993dd681d9SWill Deacon int f_flags; 1003dd681d9SWill Deacon int f_spare[4]; 1013dd681d9SWill Deacon }; 1023dd681d9SWill Deacon 1033dd681d9SWill Deacon #define COMPAT_RLIM_INFINITY 0xffffffff 1043dd681d9SWill Deacon 1053dd681d9SWill Deacon #define COMPAT_OFF_T_MAX 0x7fffffff 1063dd681d9SWill Deacon 107adc235afSArnd Bergmann #define compat_user_stack_pointer() (user_stack_pointer(task_pt_regs(current))) 10824951465SWill Deacon #define COMPAT_MINSIGSTKSZ 2048 1099b064fc3SAl Viro 1103dd681d9SWill Deacon static inline void __user *arch_compat_alloc_user_space(long len) 1113dd681d9SWill Deacon { 1129b064fc3SAl Viro return (void __user *)compat_user_stack_pointer() - len; 1133dd681d9SWill Deacon } 1143dd681d9SWill Deacon 1153dd681d9SWill Deacon struct compat_ipc64_perm { 1163dd681d9SWill Deacon compat_key_t key; 1173dd681d9SWill Deacon __compat_uid32_t uid; 1183dd681d9SWill Deacon __compat_gid32_t gid; 1193dd681d9SWill Deacon __compat_uid32_t cuid; 1203dd681d9SWill Deacon __compat_gid32_t cgid; 1213dd681d9SWill Deacon unsigned short mode; 1223dd681d9SWill Deacon unsigned short __pad1; 1233dd681d9SWill Deacon unsigned short seq; 1243dd681d9SWill Deacon unsigned short __pad2; 1253dd681d9SWill Deacon compat_ulong_t unused1; 1263dd681d9SWill Deacon compat_ulong_t unused2; 1273dd681d9SWill Deacon }; 1283dd681d9SWill Deacon 1293dd681d9SWill Deacon struct compat_semid64_ds { 1303dd681d9SWill Deacon struct compat_ipc64_perm sem_perm; 13183335eb4SArnd Bergmann compat_ulong_t sem_otime; 13283335eb4SArnd Bergmann compat_ulong_t sem_otime_high; 13383335eb4SArnd Bergmann compat_ulong_t sem_ctime; 13483335eb4SArnd Bergmann compat_ulong_t sem_ctime_high; 1353dd681d9SWill Deacon compat_ulong_t sem_nsems; 1363dd681d9SWill Deacon compat_ulong_t __unused3; 1373dd681d9SWill Deacon compat_ulong_t __unused4; 1383dd681d9SWill Deacon }; 1393dd681d9SWill Deacon 1403dd681d9SWill Deacon struct compat_msqid64_ds { 1413dd681d9SWill Deacon struct compat_ipc64_perm msg_perm; 14283335eb4SArnd Bergmann compat_ulong_t msg_stime; 14383335eb4SArnd Bergmann compat_ulong_t msg_stime_high; 14483335eb4SArnd Bergmann compat_ulong_t msg_rtime; 14583335eb4SArnd Bergmann compat_ulong_t msg_rtime_high; 14683335eb4SArnd Bergmann compat_ulong_t msg_ctime; 14783335eb4SArnd Bergmann compat_ulong_t msg_ctime_high; 1483dd681d9SWill Deacon compat_ulong_t msg_cbytes; 1493dd681d9SWill Deacon compat_ulong_t msg_qnum; 1503dd681d9SWill Deacon compat_ulong_t msg_qbytes; 1513dd681d9SWill Deacon compat_pid_t msg_lspid; 1523dd681d9SWill Deacon compat_pid_t msg_lrpid; 1533dd681d9SWill Deacon compat_ulong_t __unused4; 1543dd681d9SWill Deacon compat_ulong_t __unused5; 1553dd681d9SWill Deacon }; 1563dd681d9SWill Deacon 1573dd681d9SWill Deacon struct compat_shmid64_ds { 1583dd681d9SWill Deacon struct compat_ipc64_perm shm_perm; 1593dd681d9SWill Deacon compat_size_t shm_segsz; 16083335eb4SArnd Bergmann compat_ulong_t shm_atime; 16183335eb4SArnd Bergmann compat_ulong_t shm_atime_high; 16283335eb4SArnd Bergmann compat_ulong_t shm_dtime; 16383335eb4SArnd Bergmann compat_ulong_t shm_dtime_high; 16483335eb4SArnd Bergmann compat_ulong_t shm_ctime; 16583335eb4SArnd Bergmann compat_ulong_t shm_ctime_high; 1663dd681d9SWill Deacon compat_pid_t shm_cpid; 1673dd681d9SWill Deacon compat_pid_t shm_lpid; 1683dd681d9SWill Deacon compat_ulong_t shm_nattch; 1693dd681d9SWill Deacon compat_ulong_t __unused4; 1703dd681d9SWill Deacon compat_ulong_t __unused5; 1713dd681d9SWill Deacon }; 1723dd681d9SWill Deacon 1733dd681d9SWill Deacon static inline int is_compat_task(void) 1743dd681d9SWill Deacon { 1753dd681d9SWill Deacon return test_thread_flag(TIF_32BIT); 1763dd681d9SWill Deacon } 1773dd681d9SWill Deacon 1783dd681d9SWill Deacon static inline int is_compat_thread(struct thread_info *thread) 1793dd681d9SWill Deacon { 1803dd681d9SWill Deacon return test_ti_thread_flag(thread, TIF_32BIT); 1813dd681d9SWill Deacon } 1823dd681d9SWill Deacon 1833dd681d9SWill Deacon #else /* !CONFIG_COMPAT */ 1843dd681d9SWill Deacon 1853dd681d9SWill Deacon static inline int is_compat_thread(struct thread_info *thread) 1863dd681d9SWill Deacon { 1873dd681d9SWill Deacon return 0; 1883dd681d9SWill Deacon } 1893dd681d9SWill Deacon 1903dd681d9SWill Deacon #endif /* CONFIG_COMPAT */ 1913dd681d9SWill Deacon #endif /* __ASM_COMPAT_H */ 192