1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _ASM_SPARC64_COMPAT_H 3*4882a593Smuzhiyun #define _ASM_SPARC64_COMPAT_H 4*4882a593Smuzhiyun /* 5*4882a593Smuzhiyun * Architecture specific compatibility types 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun #include <linux/types.h> 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include <asm-generic/compat.h> 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #define COMPAT_USER_HZ 100 12*4882a593Smuzhiyun #define COMPAT_UTS_MACHINE "sparc\0\0" 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun typedef u16 __compat_uid_t; 15*4882a593Smuzhiyun typedef u16 __compat_gid_t; 16*4882a593Smuzhiyun typedef u32 __compat_uid32_t; 17*4882a593Smuzhiyun typedef u32 __compat_gid32_t; 18*4882a593Smuzhiyun typedef u16 compat_mode_t; 19*4882a593Smuzhiyun typedef u16 compat_dev_t; 20*4882a593Smuzhiyun typedef s16 compat_nlink_t; 21*4882a593Smuzhiyun typedef u16 compat_ipc_pid_t; 22*4882a593Smuzhiyun typedef u32 compat_caddr_t; 23*4882a593Smuzhiyun typedef __kernel_fsid_t compat_fsid_t; 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun struct compat_stat { 26*4882a593Smuzhiyun compat_dev_t st_dev; 27*4882a593Smuzhiyun compat_ino_t st_ino; 28*4882a593Smuzhiyun compat_mode_t st_mode; 29*4882a593Smuzhiyun compat_nlink_t st_nlink; 30*4882a593Smuzhiyun __compat_uid_t st_uid; 31*4882a593Smuzhiyun __compat_gid_t st_gid; 32*4882a593Smuzhiyun compat_dev_t st_rdev; 33*4882a593Smuzhiyun compat_off_t st_size; 34*4882a593Smuzhiyun old_time32_t st_atime; 35*4882a593Smuzhiyun compat_ulong_t st_atime_nsec; 36*4882a593Smuzhiyun old_time32_t st_mtime; 37*4882a593Smuzhiyun compat_ulong_t st_mtime_nsec; 38*4882a593Smuzhiyun old_time32_t st_ctime; 39*4882a593Smuzhiyun compat_ulong_t st_ctime_nsec; 40*4882a593Smuzhiyun compat_off_t st_blksize; 41*4882a593Smuzhiyun compat_off_t st_blocks; 42*4882a593Smuzhiyun u32 __unused4[2]; 43*4882a593Smuzhiyun }; 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun struct compat_stat64 { 46*4882a593Smuzhiyun unsigned long long st_dev; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun unsigned long long st_ino; 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun unsigned int st_mode; 51*4882a593Smuzhiyun unsigned int st_nlink; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun unsigned int st_uid; 54*4882a593Smuzhiyun unsigned int st_gid; 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun unsigned long long st_rdev; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun unsigned char __pad3[8]; 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun long long st_size; 61*4882a593Smuzhiyun unsigned int st_blksize; 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun unsigned char __pad4[8]; 64*4882a593Smuzhiyun unsigned int st_blocks; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun unsigned int st_atime; 67*4882a593Smuzhiyun unsigned int st_atime_nsec; 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun unsigned int st_mtime; 70*4882a593Smuzhiyun unsigned int st_mtime_nsec; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun unsigned int st_ctime; 73*4882a593Smuzhiyun unsigned int st_ctime_nsec; 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun unsigned int __unused4; 76*4882a593Smuzhiyun unsigned int __unused5; 77*4882a593Smuzhiyun }; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun struct compat_flock { 80*4882a593Smuzhiyun short l_type; 81*4882a593Smuzhiyun short l_whence; 82*4882a593Smuzhiyun compat_off_t l_start; 83*4882a593Smuzhiyun compat_off_t l_len; 84*4882a593Smuzhiyun compat_pid_t l_pid; 85*4882a593Smuzhiyun short __unused; 86*4882a593Smuzhiyun }; 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun #define F_GETLK64 12 89*4882a593Smuzhiyun #define F_SETLK64 13 90*4882a593Smuzhiyun #define F_SETLKW64 14 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun struct compat_flock64 { 93*4882a593Smuzhiyun short l_type; 94*4882a593Smuzhiyun short l_whence; 95*4882a593Smuzhiyun compat_loff_t l_start; 96*4882a593Smuzhiyun compat_loff_t l_len; 97*4882a593Smuzhiyun compat_pid_t l_pid; 98*4882a593Smuzhiyun short __unused; 99*4882a593Smuzhiyun }; 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun struct compat_statfs { 102*4882a593Smuzhiyun int f_type; 103*4882a593Smuzhiyun int f_bsize; 104*4882a593Smuzhiyun int f_blocks; 105*4882a593Smuzhiyun int f_bfree; 106*4882a593Smuzhiyun int f_bavail; 107*4882a593Smuzhiyun int f_files; 108*4882a593Smuzhiyun int f_ffree; 109*4882a593Smuzhiyun compat_fsid_t f_fsid; 110*4882a593Smuzhiyun int f_namelen; /* SunOS ignores this field. */ 111*4882a593Smuzhiyun int f_frsize; 112*4882a593Smuzhiyun int f_flags; 113*4882a593Smuzhiyun int f_spare[4]; 114*4882a593Smuzhiyun }; 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun #define COMPAT_RLIM_INFINITY 0x7fffffff 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun typedef u32 compat_old_sigset_t; 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun #define _COMPAT_NSIG 64 121*4882a593Smuzhiyun #define _COMPAT_NSIG_BPW 32 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun typedef u32 compat_sigset_word; 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun #define COMPAT_OFF_T_MAX 0x7fffffff 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun #ifdef CONFIG_COMPAT arch_compat_alloc_user_space(long len)128*4882a593Smuzhiyunstatic inline void __user *arch_compat_alloc_user_space(long len) 129*4882a593Smuzhiyun { 130*4882a593Smuzhiyun struct pt_regs *regs = current_thread_info()->kregs; 131*4882a593Smuzhiyun unsigned long usp = regs->u_regs[UREG_I6]; 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun if (test_thread_64bit_stack(usp)) 134*4882a593Smuzhiyun usp += STACK_BIAS; 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun if (test_thread_flag(TIF_32BIT)) 137*4882a593Smuzhiyun usp &= 0xffffffffUL; 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun usp -= len; 140*4882a593Smuzhiyun usp &= ~0x7UL; 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun return (void __user *) usp; 143*4882a593Smuzhiyun } 144*4882a593Smuzhiyun #endif 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun struct compat_ipc64_perm { 147*4882a593Smuzhiyun compat_key_t key; 148*4882a593Smuzhiyun __compat_uid32_t uid; 149*4882a593Smuzhiyun __compat_gid32_t gid; 150*4882a593Smuzhiyun __compat_uid32_t cuid; 151*4882a593Smuzhiyun __compat_gid32_t cgid; 152*4882a593Smuzhiyun unsigned short __pad1; 153*4882a593Smuzhiyun compat_mode_t mode; 154*4882a593Smuzhiyun unsigned short __pad2; 155*4882a593Smuzhiyun unsigned short seq; 156*4882a593Smuzhiyun unsigned long __unused1; /* yes they really are 64bit pads */ 157*4882a593Smuzhiyun unsigned long __unused2; 158*4882a593Smuzhiyun }; 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun struct compat_semid64_ds { 161*4882a593Smuzhiyun struct compat_ipc64_perm sem_perm; 162*4882a593Smuzhiyun unsigned int sem_otime_high; 163*4882a593Smuzhiyun unsigned int sem_otime; 164*4882a593Smuzhiyun unsigned int sem_ctime_high; 165*4882a593Smuzhiyun unsigned int sem_ctime; 166*4882a593Smuzhiyun u32 sem_nsems; 167*4882a593Smuzhiyun u32 __unused1; 168*4882a593Smuzhiyun u32 __unused2; 169*4882a593Smuzhiyun }; 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun struct compat_msqid64_ds { 172*4882a593Smuzhiyun struct compat_ipc64_perm msg_perm; 173*4882a593Smuzhiyun unsigned int msg_stime_high; 174*4882a593Smuzhiyun unsigned int msg_stime; 175*4882a593Smuzhiyun unsigned int msg_rtime_high; 176*4882a593Smuzhiyun unsigned int msg_rtime; 177*4882a593Smuzhiyun unsigned int msg_ctime_high; 178*4882a593Smuzhiyun unsigned int msg_ctime; 179*4882a593Smuzhiyun unsigned int msg_cbytes; 180*4882a593Smuzhiyun unsigned int msg_qnum; 181*4882a593Smuzhiyun unsigned int msg_qbytes; 182*4882a593Smuzhiyun compat_pid_t msg_lspid; 183*4882a593Smuzhiyun compat_pid_t msg_lrpid; 184*4882a593Smuzhiyun unsigned int __unused1; 185*4882a593Smuzhiyun unsigned int __unused2; 186*4882a593Smuzhiyun }; 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun struct compat_shmid64_ds { 189*4882a593Smuzhiyun struct compat_ipc64_perm shm_perm; 190*4882a593Smuzhiyun unsigned int shm_atime_high; 191*4882a593Smuzhiyun unsigned int shm_atime; 192*4882a593Smuzhiyun unsigned int shm_dtime_high; 193*4882a593Smuzhiyun unsigned int shm_dtime; 194*4882a593Smuzhiyun unsigned int shm_ctime_high; 195*4882a593Smuzhiyun unsigned int shm_ctime; 196*4882a593Smuzhiyun compat_size_t shm_segsz; 197*4882a593Smuzhiyun compat_pid_t shm_cpid; 198*4882a593Smuzhiyun compat_pid_t shm_lpid; 199*4882a593Smuzhiyun unsigned int shm_nattch; 200*4882a593Smuzhiyun unsigned int __unused1; 201*4882a593Smuzhiyun unsigned int __unused2; 202*4882a593Smuzhiyun }; 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun #ifdef CONFIG_COMPAT is_compat_task(void)205*4882a593Smuzhiyunstatic inline int is_compat_task(void) 206*4882a593Smuzhiyun { 207*4882a593Smuzhiyun return test_thread_flag(TIF_32BIT); 208*4882a593Smuzhiyun } 209*4882a593Smuzhiyun in_compat_syscall(void)210*4882a593Smuzhiyunstatic inline bool in_compat_syscall(void) 211*4882a593Smuzhiyun { 212*4882a593Smuzhiyun /* Vector 0x110 is LINUX_32BIT_SYSCALL_TRAP */ 213*4882a593Smuzhiyun return pt_regs_trap_type(current_pt_regs()) == 0x110; 214*4882a593Smuzhiyun } 215*4882a593Smuzhiyun #define in_compat_syscall in_compat_syscall 216*4882a593Smuzhiyun #endif 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun #endif /* _ASM_SPARC64_COMPAT_H */ 219