1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _ASM_COMPAT_H 3*4882a593Smuzhiyun #define _ASM_COMPAT_H 4*4882a593Smuzhiyun /* 5*4882a593Smuzhiyun * Architecture specific compatibility types 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun #include <linux/thread_info.h> 8*4882a593Smuzhiyun #include <linux/types.h> 9*4882a593Smuzhiyun #include <asm/page.h> 10*4882a593Smuzhiyun #include <asm/ptrace.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <asm-generic/compat.h> 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #define COMPAT_USER_HZ 100 15*4882a593Smuzhiyun #define COMPAT_UTS_MACHINE "mips\0\0\0" 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun typedef s32 __compat_uid_t; 18*4882a593Smuzhiyun typedef s32 __compat_gid_t; 19*4882a593Smuzhiyun typedef __compat_uid_t __compat_uid32_t; 20*4882a593Smuzhiyun typedef __compat_gid_t __compat_gid32_t; 21*4882a593Smuzhiyun typedef u32 compat_mode_t; 22*4882a593Smuzhiyun typedef u32 compat_dev_t; 23*4882a593Smuzhiyun typedef u32 compat_nlink_t; 24*4882a593Smuzhiyun typedef s32 compat_ipc_pid_t; 25*4882a593Smuzhiyun typedef s32 compat_caddr_t; 26*4882a593Smuzhiyun typedef struct { 27*4882a593Smuzhiyun s32 val[2]; 28*4882a593Smuzhiyun } compat_fsid_t; 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun struct compat_stat { 31*4882a593Smuzhiyun compat_dev_t st_dev; 32*4882a593Smuzhiyun s32 st_pad1[3]; 33*4882a593Smuzhiyun compat_ino_t st_ino; 34*4882a593Smuzhiyun compat_mode_t st_mode; 35*4882a593Smuzhiyun compat_nlink_t st_nlink; 36*4882a593Smuzhiyun __compat_uid_t st_uid; 37*4882a593Smuzhiyun __compat_gid_t st_gid; 38*4882a593Smuzhiyun compat_dev_t st_rdev; 39*4882a593Smuzhiyun s32 st_pad2[2]; 40*4882a593Smuzhiyun compat_off_t st_size; 41*4882a593Smuzhiyun s32 st_pad3; 42*4882a593Smuzhiyun old_time32_t st_atime; 43*4882a593Smuzhiyun s32 st_atime_nsec; 44*4882a593Smuzhiyun old_time32_t st_mtime; 45*4882a593Smuzhiyun s32 st_mtime_nsec; 46*4882a593Smuzhiyun old_time32_t st_ctime; 47*4882a593Smuzhiyun s32 st_ctime_nsec; 48*4882a593Smuzhiyun s32 st_blksize; 49*4882a593Smuzhiyun s32 st_blocks; 50*4882a593Smuzhiyun s32 st_pad4[14]; 51*4882a593Smuzhiyun }; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun struct compat_flock { 54*4882a593Smuzhiyun short l_type; 55*4882a593Smuzhiyun short l_whence; 56*4882a593Smuzhiyun compat_off_t l_start; 57*4882a593Smuzhiyun compat_off_t l_len; 58*4882a593Smuzhiyun s32 l_sysid; 59*4882a593Smuzhiyun compat_pid_t l_pid; 60*4882a593Smuzhiyun s32 pad[4]; 61*4882a593Smuzhiyun }; 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun #define F_GETLK64 33 64*4882a593Smuzhiyun #define F_SETLK64 34 65*4882a593Smuzhiyun #define F_SETLKW64 35 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun struct compat_flock64 { 68*4882a593Smuzhiyun short l_type; 69*4882a593Smuzhiyun short l_whence; 70*4882a593Smuzhiyun compat_loff_t l_start; 71*4882a593Smuzhiyun compat_loff_t l_len; 72*4882a593Smuzhiyun compat_pid_t l_pid; 73*4882a593Smuzhiyun }; 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun struct compat_statfs { 76*4882a593Smuzhiyun int f_type; 77*4882a593Smuzhiyun int f_bsize; 78*4882a593Smuzhiyun int f_frsize; 79*4882a593Smuzhiyun int f_blocks; 80*4882a593Smuzhiyun int f_bfree; 81*4882a593Smuzhiyun int f_files; 82*4882a593Smuzhiyun int f_ffree; 83*4882a593Smuzhiyun int f_bavail; 84*4882a593Smuzhiyun compat_fsid_t f_fsid; 85*4882a593Smuzhiyun int f_namelen; 86*4882a593Smuzhiyun int f_flags; 87*4882a593Smuzhiyun int f_spare[5]; 88*4882a593Smuzhiyun }; 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun #define COMPAT_RLIM_INFINITY 0x7fffffffUL 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun typedef u32 compat_old_sigset_t; /* at least 32 bits */ 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun #define _COMPAT_NSIG 128 /* Don't ask !$@#% ... */ 95*4882a593Smuzhiyun #define _COMPAT_NSIG_BPW 32 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun typedef u32 compat_sigset_word; 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun #define COMPAT_OFF_T_MAX 0x7fffffff 100*4882a593Smuzhiyun arch_compat_alloc_user_space(long len)101*4882a593Smuzhiyunstatic inline void __user *arch_compat_alloc_user_space(long len) 102*4882a593Smuzhiyun { 103*4882a593Smuzhiyun struct pt_regs *regs = (struct pt_regs *) 104*4882a593Smuzhiyun ((unsigned long) current_thread_info() + THREAD_SIZE - 32) - 1; 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun return (void __user *) (regs->regs[29] - len); 107*4882a593Smuzhiyun } 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun struct compat_ipc64_perm { 110*4882a593Smuzhiyun compat_key_t key; 111*4882a593Smuzhiyun __compat_uid32_t uid; 112*4882a593Smuzhiyun __compat_gid32_t gid; 113*4882a593Smuzhiyun __compat_uid32_t cuid; 114*4882a593Smuzhiyun __compat_gid32_t cgid; 115*4882a593Smuzhiyun compat_mode_t mode; 116*4882a593Smuzhiyun unsigned short seq; 117*4882a593Smuzhiyun unsigned short __pad2; 118*4882a593Smuzhiyun compat_ulong_t __unused1; 119*4882a593Smuzhiyun compat_ulong_t __unused2; 120*4882a593Smuzhiyun }; 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun struct compat_semid64_ds { 123*4882a593Smuzhiyun struct compat_ipc64_perm sem_perm; 124*4882a593Smuzhiyun compat_ulong_t sem_otime; 125*4882a593Smuzhiyun compat_ulong_t sem_ctime; 126*4882a593Smuzhiyun compat_ulong_t sem_nsems; 127*4882a593Smuzhiyun compat_ulong_t sem_otime_high; 128*4882a593Smuzhiyun compat_ulong_t sem_ctime_high; 129*4882a593Smuzhiyun }; 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun struct compat_msqid64_ds { 132*4882a593Smuzhiyun struct compat_ipc64_perm msg_perm; 133*4882a593Smuzhiyun #ifndef CONFIG_CPU_LITTLE_ENDIAN 134*4882a593Smuzhiyun compat_ulong_t msg_stime_high; 135*4882a593Smuzhiyun #endif 136*4882a593Smuzhiyun compat_ulong_t msg_stime; 137*4882a593Smuzhiyun #ifdef CONFIG_CPU_LITTLE_ENDIAN 138*4882a593Smuzhiyun compat_ulong_t msg_stime_high; 139*4882a593Smuzhiyun #endif 140*4882a593Smuzhiyun #ifndef CONFIG_CPU_LITTLE_ENDIAN 141*4882a593Smuzhiyun compat_ulong_t msg_rtime_high; 142*4882a593Smuzhiyun #endif 143*4882a593Smuzhiyun compat_ulong_t msg_rtime; 144*4882a593Smuzhiyun #ifdef CONFIG_CPU_LITTLE_ENDIAN 145*4882a593Smuzhiyun compat_ulong_t msg_rtime_high; 146*4882a593Smuzhiyun #endif 147*4882a593Smuzhiyun #ifndef CONFIG_CPU_LITTLE_ENDIAN 148*4882a593Smuzhiyun compat_ulong_t msg_ctime_high; 149*4882a593Smuzhiyun #endif 150*4882a593Smuzhiyun compat_ulong_t msg_ctime; 151*4882a593Smuzhiyun #ifdef CONFIG_CPU_LITTLE_ENDIAN 152*4882a593Smuzhiyun compat_ulong_t msg_ctime_high; 153*4882a593Smuzhiyun #endif 154*4882a593Smuzhiyun compat_ulong_t msg_cbytes; 155*4882a593Smuzhiyun compat_ulong_t msg_qnum; 156*4882a593Smuzhiyun compat_ulong_t msg_qbytes; 157*4882a593Smuzhiyun compat_pid_t msg_lspid; 158*4882a593Smuzhiyun compat_pid_t msg_lrpid; 159*4882a593Smuzhiyun compat_ulong_t __unused4; 160*4882a593Smuzhiyun compat_ulong_t __unused5; 161*4882a593Smuzhiyun }; 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun struct compat_shmid64_ds { 164*4882a593Smuzhiyun struct compat_ipc64_perm shm_perm; 165*4882a593Smuzhiyun compat_size_t shm_segsz; 166*4882a593Smuzhiyun compat_ulong_t shm_atime; 167*4882a593Smuzhiyun compat_ulong_t shm_dtime; 168*4882a593Smuzhiyun compat_ulong_t shm_ctime; 169*4882a593Smuzhiyun compat_pid_t shm_cpid; 170*4882a593Smuzhiyun compat_pid_t shm_lpid; 171*4882a593Smuzhiyun compat_ulong_t shm_nattch; 172*4882a593Smuzhiyun compat_ushort_t shm_atime_high; 173*4882a593Smuzhiyun compat_ushort_t shm_dtime_high; 174*4882a593Smuzhiyun compat_ushort_t shm_ctime_high; 175*4882a593Smuzhiyun compat_ushort_t __unused2; 176*4882a593Smuzhiyun }; 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun /* MIPS has unusual order of fields in stack_t */ 179*4882a593Smuzhiyun typedef struct compat_sigaltstack { 180*4882a593Smuzhiyun compat_uptr_t ss_sp; 181*4882a593Smuzhiyun compat_size_t ss_size; 182*4882a593Smuzhiyun int ss_flags; 183*4882a593Smuzhiyun } compat_stack_t; 184*4882a593Smuzhiyun #define compat_sigaltstack compat_sigaltstack 185*4882a593Smuzhiyun is_compat_task(void)186*4882a593Smuzhiyunstatic inline int is_compat_task(void) 187*4882a593Smuzhiyun { 188*4882a593Smuzhiyun return test_thread_flag(TIF_32BIT_ADDR); 189*4882a593Smuzhiyun } 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun #endif /* _ASM_COMPAT_H */ 192