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. */ 27typedef s32 compat_long_t; 28typedef u32 compat_ulong_t; 29typedef u32 compat_size_t; 30typedef s32 compat_ssize_t; 31typedef s32 compat_off_t; 32typedef s32 compat_time_t; 33typedef s32 compat_clock_t; 34typedef u32 compat_ino_t; 35typedef u32 compat_caddr_t; 36typedef u32 compat_uptr_t; 37 38/* Many types are "int" or otherwise the same. */ 39typedef __kernel_pid_t compat_pid_t; 40typedef __kernel_uid_t __compat_uid_t; 41typedef __kernel_gid_t __compat_gid_t; 42typedef __kernel_uid32_t __compat_uid32_t; 43typedef __kernel_uid32_t __compat_gid32_t; 44typedef __kernel_mode_t compat_mode_t; 45typedef __kernel_dev_t compat_dev_t; 46typedef __kernel_loff_t compat_loff_t; 47typedef __kernel_ipc_pid_t compat_ipc_pid_t; 48typedef __kernel_daddr_t compat_daddr_t; 49typedef __kernel_fsid_t compat_fsid_t; 50typedef __kernel_timer_t compat_timer_t; 51typedef __kernel_key_t compat_key_t; 52typedef int compat_int_t; 53typedef s64 compat_s64; 54typedef uint compat_uint_t; 55typedef u64 compat_u64; 56 57/* We use the same register dump format in 32-bit images. */ 58typedef unsigned long compat_elf_greg_t; 59#define COMPAT_ELF_NGREG (sizeof(struct pt_regs) / sizeof(compat_elf_greg_t)) 60typedef compat_elf_greg_t compat_elf_gregset_t[COMPAT_ELF_NGREG]; 61 62struct compat_timespec { 63 compat_time_t tv_sec; 64 s32 tv_nsec; 65}; 66 67struct 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 75struct 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 86struct 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 98struct 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 111typedef u32 compat_sigset_word; 112 113typedef 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 120typedef 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 178struct 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 192struct 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 203struct 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 220struct 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 243static inline void __user *compat_ptr(compat_uptr_t uptr) 244{ 245 return (void __user *)(long)(s32)uptr; 246} 247 248static 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. */ 254static inline unsigned long ptr_to_compat_reg(void __user *uptr) 255{ 256 return (long)(int)(long __force)uptr; 257} 258 259static 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 265static inline int is_compat_task(void) 266{ 267 return current_thread_info()->status & TS_COMPAT; 268} 269 270extern int compat_setup_rt_frame(struct ksignal *ksig, sigset_t *set, 271 struct pt_regs *regs); 272 273/* Compat syscalls. */ 274struct compat_siginfo; 275struct compat_sigaltstack; 276long compat_sys_rt_sigreturn(void); 277long compat_sys_truncate64(char __user *filename, u32 dummy, u32 low, u32 high); 278long compat_sys_ftruncate64(unsigned int fd, u32 dummy, u32 low, u32 high); 279long compat_sys_pread64(unsigned int fd, char __user *ubuf, size_t count, 280 u32 dummy, u32 low, u32 high); 281long compat_sys_pwrite64(unsigned int fd, char __user *ubuf, size_t count, 282 u32 dummy, u32 low, u32 high); 283long compat_sys_sync_file_range2(int fd, unsigned int flags, 284 u32 offset_lo, u32 offset_hi, 285 u32 nbytes_lo, u32 nbytes_hi); 286long compat_sys_fallocate(int fd, int mode, 287 u32 offset_lo, u32 offset_hi, 288 u32 len_lo, u32 len_hi); 289long 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. */ 294long _compat_sys_rt_sigreturn(void); 295 296#endif /* _ASM_TILE_COMPAT_H */ 297