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