1 /* 2 * Copyright 2010 Tilera Corporation. All Rights Reserved. 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License 6 * as published by the Free Software Foundation, version 2. 7 * 8 * This program is distributed in the hope that it will be useful, but 9 * WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or 11 * NON INFRINGEMENT. See the GNU General Public License for 12 * more details. 13 */ 14 15 #ifndef _ASM_TILE_COMPAT_H 16 #define _ASM_TILE_COMPAT_H 17 18 /* 19 * Architecture specific compatibility types 20 */ 21 #include <linux/types.h> 22 #include <linux/sched.h> 23 24 #define COMPAT_USER_HZ 100 25 26 /* "long" and pointer-based types are different. */ 27 typedef s32 compat_long_t; 28 typedef u32 compat_ulong_t; 29 typedef u32 compat_size_t; 30 typedef s32 compat_ssize_t; 31 typedef s32 compat_off_t; 32 typedef s32 compat_time_t; 33 typedef s32 compat_clock_t; 34 typedef u32 compat_ino_t; 35 typedef u32 compat_caddr_t; 36 typedef u32 compat_uptr_t; 37 38 /* Many types are "int" or otherwise the same. */ 39 typedef __kernel_pid_t compat_pid_t; 40 typedef __kernel_uid_t __compat_uid_t; 41 typedef __kernel_gid_t __compat_gid_t; 42 typedef __kernel_uid32_t __compat_uid32_t; 43 typedef __kernel_uid32_t __compat_gid32_t; 44 typedef __kernel_mode_t compat_mode_t; 45 typedef __kernel_dev_t compat_dev_t; 46 typedef __kernel_loff_t compat_loff_t; 47 typedef __kernel_ipc_pid_t compat_ipc_pid_t; 48 typedef __kernel_daddr_t compat_daddr_t; 49 typedef __kernel_fsid_t compat_fsid_t; 50 typedef __kernel_timer_t compat_timer_t; 51 typedef __kernel_key_t compat_key_t; 52 typedef int compat_int_t; 53 typedef s64 compat_s64; 54 typedef uint compat_uint_t; 55 typedef u64 compat_u64; 56 57 /* We use the same register dump format in 32-bit images. */ 58 typedef unsigned long compat_elf_greg_t; 59 #define COMPAT_ELF_NGREG (sizeof(struct pt_regs) / sizeof(compat_elf_greg_t)) 60 typedef compat_elf_greg_t compat_elf_gregset_t[COMPAT_ELF_NGREG]; 61 62 struct compat_timespec { 63 compat_time_t tv_sec; 64 s32 tv_nsec; 65 }; 66 67 struct compat_timeval { 68 compat_time_t tv_sec; 69 s32 tv_usec; 70 }; 71 72 #define compat_stat stat 73 #define compat_statfs statfs 74 75 struct compat_sysctl { 76 unsigned int name; 77 int nlen; 78 unsigned int oldval; 79 unsigned int oldlenp; 80 unsigned int newval; 81 unsigned int newlen; 82 unsigned int __unused[4]; 83 }; 84 85 86 struct compat_flock { 87 short l_type; 88 short l_whence; 89 compat_off_t l_start; 90 compat_off_t l_len; 91 compat_pid_t l_pid; 92 }; 93 94 #define F_GETLK64 12 /* using 'struct flock64' */ 95 #define F_SETLK64 13 96 #define F_SETLKW64 14 97 98 struct compat_flock64 { 99 short l_type; 100 short l_whence; 101 compat_loff_t l_start; 102 compat_loff_t l_len; 103 compat_pid_t l_pid; 104 }; 105 106 #define COMPAT_RLIM_INFINITY 0xffffffff 107 108 #define _COMPAT_NSIG 64 109 #define _COMPAT_NSIG_BPW 32 110 111 typedef u32 compat_sigset_word; 112 113 typedef union compat_sigval { 114 compat_int_t sival_int; 115 compat_uptr_t sival_ptr; 116 } compat_sigval_t; 117 118 #define COMPAT_SI_PAD_SIZE (128/sizeof(int) - 3) 119 120 typedef struct compat_siginfo { 121 int si_signo; 122 int si_errno; 123 int si_code; 124 125 union { 126 int _pad[COMPAT_SI_PAD_SIZE]; 127 128 /* kill() */ 129 struct { 130 unsigned int _pid; /* sender's pid */ 131 unsigned int _uid; /* sender's uid */ 132 } _kill; 133 134 /* POSIX.1b timers */ 135 struct { 136 compat_timer_t _tid; /* timer id */ 137 int _overrun; /* overrun count */ 138 compat_sigval_t _sigval; /* same as below */ 139 int _sys_private; /* not to be passed to user */ 140 int _overrun_incr; /* amount to add to overrun */ 141 } _timer; 142 143 /* POSIX.1b signals */ 144 struct { 145 unsigned int _pid; /* sender's pid */ 146 unsigned int _uid; /* sender's uid */ 147 compat_sigval_t _sigval; 148 } _rt; 149 150 /* SIGCHLD */ 151 struct { 152 unsigned int _pid; /* which child */ 153 unsigned int _uid; /* sender's uid */ 154 int _status; /* exit code */ 155 compat_clock_t _utime; 156 compat_clock_t _stime; 157 } _sigchld; 158 159 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ 160 struct { 161 unsigned int _addr; /* faulting insn/memory ref. */ 162 #ifdef __ARCH_SI_TRAPNO 163 int _trapno; /* TRAP # which caused the signal */ 164 #endif 165 } _sigfault; 166 167 /* SIGPOLL */ 168 struct { 169 int _band; /* POLL_IN, POLL_OUT, POLL_MSG */ 170 int _fd; 171 } _sigpoll; 172 } _sifields; 173 } compat_siginfo_t; 174 175 #define COMPAT_OFF_T_MAX 0x7fffffff 176 #define COMPAT_LOFF_T_MAX 0x7fffffffffffffffL 177 178 struct compat_ipc64_perm { 179 compat_key_t key; 180 __compat_uid32_t uid; 181 __compat_gid32_t gid; 182 __compat_uid32_t cuid; 183 __compat_gid32_t cgid; 184 unsigned short mode; 185 unsigned short __pad1; 186 unsigned short seq; 187 unsigned short __pad2; 188 compat_ulong_t unused1; 189 compat_ulong_t unused2; 190 }; 191 192 struct compat_semid64_ds { 193 struct compat_ipc64_perm sem_perm; 194 compat_time_t sem_otime; 195 compat_ulong_t __unused1; 196 compat_time_t sem_ctime; 197 compat_ulong_t __unused2; 198 compat_ulong_t sem_nsems; 199 compat_ulong_t __unused3; 200 compat_ulong_t __unused4; 201 }; 202 203 struct compat_msqid64_ds { 204 struct compat_ipc64_perm msg_perm; 205 compat_time_t msg_stime; 206 compat_ulong_t __unused1; 207 compat_time_t msg_rtime; 208 compat_ulong_t __unused2; 209 compat_time_t msg_ctime; 210 compat_ulong_t __unused3; 211 compat_ulong_t msg_cbytes; 212 compat_ulong_t msg_qnum; 213 compat_ulong_t msg_qbytes; 214 compat_pid_t msg_lspid; 215 compat_pid_t msg_lrpid; 216 compat_ulong_t __unused4; 217 compat_ulong_t __unused5; 218 }; 219 220 struct compat_shmid64_ds { 221 struct compat_ipc64_perm shm_perm; 222 compat_size_t shm_segsz; 223 compat_time_t shm_atime; 224 compat_ulong_t __unused1; 225 compat_time_t shm_dtime; 226 compat_ulong_t __unused2; 227 compat_time_t shm_ctime; 228 compat_ulong_t __unused3; 229 compat_pid_t shm_cpid; 230 compat_pid_t shm_lpid; 231 compat_ulong_t shm_nattch; 232 compat_ulong_t __unused4; 233 compat_ulong_t __unused5; 234 }; 235 236 /* 237 * A pointer passed in from user mode. This should not 238 * be used for syscall parameters, just declare them 239 * as pointers because the syscall entry code will have 240 * appropriately converted them already. 241 */ 242 243 static inline void __user *compat_ptr(compat_uptr_t uptr) 244 { 245 return (void __user *)(long)(s32)uptr; 246 } 247 248 static inline compat_uptr_t ptr_to_compat(void __user *uptr) 249 { 250 return (u32)(unsigned long)uptr; 251 } 252 253 /* Sign-extend when storing a kernel pointer to a user's ptregs. */ 254 static inline unsigned long ptr_to_compat_reg(void __user *uptr) 255 { 256 return (long)(int)(long __force)uptr; 257 } 258 259 static inline void __user *arch_compat_alloc_user_space(long len) 260 { 261 struct pt_regs *regs = task_pt_regs(current); 262 return (void __user *)regs->sp - len; 263 } 264 265 static inline int is_compat_task(void) 266 { 267 return current_thread_info()->status & TS_COMPAT; 268 } 269 270 extern int compat_setup_rt_frame(struct ksignal *ksig, sigset_t *set, 271 struct pt_regs *regs); 272 273 /* Compat syscalls. */ 274 struct compat_siginfo; 275 struct compat_sigaltstack; 276 long compat_sys_rt_sigreturn(void); 277 long compat_sys_truncate64(char __user *filename, u32 dummy, u32 low, u32 high); 278 long compat_sys_ftruncate64(unsigned int fd, u32 dummy, u32 low, u32 high); 279 long compat_sys_pread64(unsigned int fd, char __user *ubuf, size_t count, 280 u32 dummy, u32 low, u32 high); 281 long compat_sys_pwrite64(unsigned int fd, char __user *ubuf, size_t count, 282 u32 dummy, u32 low, u32 high); 283 long compat_sys_sync_file_range2(int fd, unsigned int flags, 284 u32 offset_lo, u32 offset_hi, 285 u32 nbytes_lo, u32 nbytes_hi); 286 long compat_sys_fallocate(int fd, int mode, 287 u32 offset_lo, u32 offset_hi, 288 u32 len_lo, u32 len_hi); 289 long compat_sys_llseek(unsigned int fd, unsigned int offset_high, 290 unsigned int offset_low, loff_t __user * result, 291 unsigned int origin); 292 293 /* Assembly trampoline to avoid clobbering r0. */ 294 long _compat_sys_rt_sigreturn(void); 295 296 #endif /* _ASM_TILE_COMPAT_H */ 297
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.