1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) 2012 ARM Ltd. 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun #ifndef __ASM_COMPAT_H 6*4882a593Smuzhiyun #define __ASM_COMPAT_H 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <asm-generic/compat.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifdef CONFIG_COMPAT 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun /* 13*4882a593Smuzhiyun * Architecture specific compatibility types 14*4882a593Smuzhiyun */ 15*4882a593Smuzhiyun #include <linux/types.h> 16*4882a593Smuzhiyun #include <linux/sched.h> 17*4882a593Smuzhiyun #include <linux/sched/task_stack.h> 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #define COMPAT_USER_HZ 100 20*4882a593Smuzhiyun #ifdef __AARCH64EB__ 21*4882a593Smuzhiyun #define COMPAT_UTS_MACHINE "armv8b\0\0" 22*4882a593Smuzhiyun #else 23*4882a593Smuzhiyun #define COMPAT_UTS_MACHINE "armv8l\0\0" 24*4882a593Smuzhiyun #endif 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun typedef u16 __compat_uid_t; 27*4882a593Smuzhiyun typedef u16 __compat_gid_t; 28*4882a593Smuzhiyun typedef u16 __compat_uid16_t; 29*4882a593Smuzhiyun typedef u16 __compat_gid16_t; 30*4882a593Smuzhiyun typedef u32 __compat_uid32_t; 31*4882a593Smuzhiyun typedef u32 __compat_gid32_t; 32*4882a593Smuzhiyun typedef u16 compat_mode_t; 33*4882a593Smuzhiyun typedef u32 compat_dev_t; 34*4882a593Smuzhiyun typedef s32 compat_nlink_t; 35*4882a593Smuzhiyun typedef u16 compat_ipc_pid_t; 36*4882a593Smuzhiyun typedef u32 compat_caddr_t; 37*4882a593Smuzhiyun typedef __kernel_fsid_t compat_fsid_t; 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun struct compat_stat { 40*4882a593Smuzhiyun #ifdef __AARCH64EB__ 41*4882a593Smuzhiyun short st_dev; 42*4882a593Smuzhiyun short __pad1; 43*4882a593Smuzhiyun #else 44*4882a593Smuzhiyun compat_dev_t st_dev; 45*4882a593Smuzhiyun #endif 46*4882a593Smuzhiyun compat_ino_t st_ino; 47*4882a593Smuzhiyun compat_mode_t st_mode; 48*4882a593Smuzhiyun compat_ushort_t st_nlink; 49*4882a593Smuzhiyun __compat_uid16_t st_uid; 50*4882a593Smuzhiyun __compat_gid16_t st_gid; 51*4882a593Smuzhiyun #ifdef __AARCH64EB__ 52*4882a593Smuzhiyun short st_rdev; 53*4882a593Smuzhiyun short __pad2; 54*4882a593Smuzhiyun #else 55*4882a593Smuzhiyun compat_dev_t st_rdev; 56*4882a593Smuzhiyun #endif 57*4882a593Smuzhiyun compat_off_t st_size; 58*4882a593Smuzhiyun compat_off_t st_blksize; 59*4882a593Smuzhiyun compat_off_t st_blocks; 60*4882a593Smuzhiyun old_time32_t st_atime; 61*4882a593Smuzhiyun compat_ulong_t st_atime_nsec; 62*4882a593Smuzhiyun old_time32_t st_mtime; 63*4882a593Smuzhiyun compat_ulong_t st_mtime_nsec; 64*4882a593Smuzhiyun old_time32_t st_ctime; 65*4882a593Smuzhiyun compat_ulong_t st_ctime_nsec; 66*4882a593Smuzhiyun compat_ulong_t __unused4[2]; 67*4882a593Smuzhiyun }; 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun struct compat_flock { 70*4882a593Smuzhiyun short l_type; 71*4882a593Smuzhiyun short l_whence; 72*4882a593Smuzhiyun compat_off_t l_start; 73*4882a593Smuzhiyun compat_off_t l_len; 74*4882a593Smuzhiyun compat_pid_t l_pid; 75*4882a593Smuzhiyun }; 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun #define F_GETLK64 12 /* using 'struct flock64' */ 78*4882a593Smuzhiyun #define F_SETLK64 13 79*4882a593Smuzhiyun #define F_SETLKW64 14 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun struct compat_flock64 { 82*4882a593Smuzhiyun short l_type; 83*4882a593Smuzhiyun short l_whence; 84*4882a593Smuzhiyun compat_loff_t l_start; 85*4882a593Smuzhiyun compat_loff_t l_len; 86*4882a593Smuzhiyun compat_pid_t l_pid; 87*4882a593Smuzhiyun }; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun struct compat_statfs { 90*4882a593Smuzhiyun int f_type; 91*4882a593Smuzhiyun int f_bsize; 92*4882a593Smuzhiyun int f_blocks; 93*4882a593Smuzhiyun int f_bfree; 94*4882a593Smuzhiyun int f_bavail; 95*4882a593Smuzhiyun int f_files; 96*4882a593Smuzhiyun int f_ffree; 97*4882a593Smuzhiyun compat_fsid_t f_fsid; 98*4882a593Smuzhiyun int f_namelen; /* SunOS ignores this field. */ 99*4882a593Smuzhiyun int f_frsize; 100*4882a593Smuzhiyun int f_flags; 101*4882a593Smuzhiyun int f_spare[4]; 102*4882a593Smuzhiyun }; 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun #define COMPAT_RLIM_INFINITY 0xffffffff 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun typedef u32 compat_old_sigset_t; 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun #define _COMPAT_NSIG 64 109*4882a593Smuzhiyun #define _COMPAT_NSIG_BPW 32 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun typedef u32 compat_sigset_word; 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun #define COMPAT_OFF_T_MAX 0x7fffffff 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun #define compat_user_stack_pointer() (user_stack_pointer(task_pt_regs(current))) 116*4882a593Smuzhiyun #define COMPAT_MINSIGSTKSZ 2048 117*4882a593Smuzhiyun arch_compat_alloc_user_space(long len)118*4882a593Smuzhiyunstatic inline void __user *arch_compat_alloc_user_space(long len) 119*4882a593Smuzhiyun { 120*4882a593Smuzhiyun return (void __user *)compat_user_stack_pointer() - len; 121*4882a593Smuzhiyun } 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun struct compat_ipc64_perm { 124*4882a593Smuzhiyun compat_key_t key; 125*4882a593Smuzhiyun __compat_uid32_t uid; 126*4882a593Smuzhiyun __compat_gid32_t gid; 127*4882a593Smuzhiyun __compat_uid32_t cuid; 128*4882a593Smuzhiyun __compat_gid32_t cgid; 129*4882a593Smuzhiyun unsigned short mode; 130*4882a593Smuzhiyun unsigned short __pad1; 131*4882a593Smuzhiyun unsigned short seq; 132*4882a593Smuzhiyun unsigned short __pad2; 133*4882a593Smuzhiyun compat_ulong_t unused1; 134*4882a593Smuzhiyun compat_ulong_t unused2; 135*4882a593Smuzhiyun }; 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun struct compat_semid64_ds { 138*4882a593Smuzhiyun struct compat_ipc64_perm sem_perm; 139*4882a593Smuzhiyun compat_ulong_t sem_otime; 140*4882a593Smuzhiyun compat_ulong_t sem_otime_high; 141*4882a593Smuzhiyun compat_ulong_t sem_ctime; 142*4882a593Smuzhiyun compat_ulong_t sem_ctime_high; 143*4882a593Smuzhiyun compat_ulong_t sem_nsems; 144*4882a593Smuzhiyun compat_ulong_t __unused3; 145*4882a593Smuzhiyun compat_ulong_t __unused4; 146*4882a593Smuzhiyun }; 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun struct compat_msqid64_ds { 149*4882a593Smuzhiyun struct compat_ipc64_perm msg_perm; 150*4882a593Smuzhiyun compat_ulong_t msg_stime; 151*4882a593Smuzhiyun compat_ulong_t msg_stime_high; 152*4882a593Smuzhiyun compat_ulong_t msg_rtime; 153*4882a593Smuzhiyun compat_ulong_t msg_rtime_high; 154*4882a593Smuzhiyun compat_ulong_t msg_ctime; 155*4882a593Smuzhiyun compat_ulong_t msg_ctime_high; 156*4882a593Smuzhiyun compat_ulong_t msg_cbytes; 157*4882a593Smuzhiyun compat_ulong_t msg_qnum; 158*4882a593Smuzhiyun compat_ulong_t msg_qbytes; 159*4882a593Smuzhiyun compat_pid_t msg_lspid; 160*4882a593Smuzhiyun compat_pid_t msg_lrpid; 161*4882a593Smuzhiyun compat_ulong_t __unused4; 162*4882a593Smuzhiyun compat_ulong_t __unused5; 163*4882a593Smuzhiyun }; 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun struct compat_shmid64_ds { 166*4882a593Smuzhiyun struct compat_ipc64_perm shm_perm; 167*4882a593Smuzhiyun compat_size_t shm_segsz; 168*4882a593Smuzhiyun compat_ulong_t shm_atime; 169*4882a593Smuzhiyun compat_ulong_t shm_atime_high; 170*4882a593Smuzhiyun compat_ulong_t shm_dtime; 171*4882a593Smuzhiyun compat_ulong_t shm_dtime_high; 172*4882a593Smuzhiyun compat_ulong_t shm_ctime; 173*4882a593Smuzhiyun compat_ulong_t shm_ctime_high; 174*4882a593Smuzhiyun compat_pid_t shm_cpid; 175*4882a593Smuzhiyun compat_pid_t shm_lpid; 176*4882a593Smuzhiyun compat_ulong_t shm_nattch; 177*4882a593Smuzhiyun compat_ulong_t __unused4; 178*4882a593Smuzhiyun compat_ulong_t __unused5; 179*4882a593Smuzhiyun }; 180*4882a593Smuzhiyun is_compat_task(void)181*4882a593Smuzhiyunstatic inline int is_compat_task(void) 182*4882a593Smuzhiyun { 183*4882a593Smuzhiyun return test_thread_flag(TIF_32BIT); 184*4882a593Smuzhiyun } 185*4882a593Smuzhiyun is_compat_thread(struct thread_info * thread)186*4882a593Smuzhiyunstatic inline int is_compat_thread(struct thread_info *thread) 187*4882a593Smuzhiyun { 188*4882a593Smuzhiyun return test_ti_thread_flag(thread, TIF_32BIT); 189*4882a593Smuzhiyun } 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun #else /* !CONFIG_COMPAT */ 192*4882a593Smuzhiyun is_compat_thread(struct thread_info * thread)193*4882a593Smuzhiyunstatic inline int is_compat_thread(struct thread_info *thread) 194*4882a593Smuzhiyun { 195*4882a593Smuzhiyun return 0; 196*4882a593Smuzhiyun } 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun #endif /* CONFIG_COMPAT */ 199*4882a593Smuzhiyun #endif /* __ASM_COMPAT_H */ 200