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_nlink_t compat_nlink_t; 48typedef __kernel_ipc_pid_t compat_ipc_pid_t; 49typedef __kernel_daddr_t compat_daddr_t; 50typedef __kernel_fsid_t compat_fsid_t; 51typedef __kernel_timer_t compat_timer_t; 52typedef __kernel_key_t compat_key_t; 53typedef int compat_int_t; 54typedef s64 compat_s64; 55typedef uint compat_uint_t; 56typedef u64 compat_u64; 57 58/* We use the same register dump format in 32-bit images. */ 59typedef unsigned long compat_elf_greg_t; 60#define COMPAT_ELF_NGREG (sizeof(struct pt_regs) / sizeof(compat_elf_greg_t)) 61typedef compat_elf_greg_t compat_elf_gregset_t[COMPAT_ELF_NGREG]; 62 63struct compat_timespec { 64 compat_time_t tv_sec; 65 s32 tv_nsec; 66}; 67 68struct compat_timeval { 69 compat_time_t tv_sec; 70 s32 tv_usec; 71}; 72 73#define compat_stat stat 74#define compat_statfs statfs 75 76struct compat_sysctl { 77 unsigned int name; 78 int nlen; 79 unsigned int oldval; 80 unsigned int oldlenp; 81 unsigned int newval; 82 unsigned int newlen; 83 unsigned int __unused[4]; 84}; 85 86 87struct compat_flock { 88 short l_type; 89 short l_whence; 90 compat_off_t l_start; 91 compat_off_t l_len; 92 compat_pid_t l_pid; 93}; 94 95#define F_GETLK64 12 /* using 'struct flock64' */ 96#define F_SETLK64 13 97#define F_SETLKW64 14 98 99struct compat_flock64 { 100 short l_type; 101 short l_whence; 102 compat_loff_t l_start; 103 compat_loff_t l_len; 104 compat_pid_t l_pid; 105}; 106 107#define COMPAT_RLIM_INFINITY 0xffffffff 108 109#define _COMPAT_NSIG 64 110#define _COMPAT_NSIG_BPW 32 111 112typedef u32 compat_sigset_word; 113 114#define COMPAT_OFF_T_MAX 0x7fffffff 115#define COMPAT_LOFF_T_MAX 0x7fffffffffffffffL 116 117struct compat_ipc64_perm { 118 compat_key_t key; 119 __compat_uid32_t uid; 120 __compat_gid32_t gid; 121 __compat_uid32_t cuid; 122 __compat_gid32_t cgid; 123 unsigned short mode; 124 unsigned short __pad1; 125 unsigned short seq; 126 unsigned short __pad2; 127 compat_ulong_t unused1; 128 compat_ulong_t unused2; 129}; 130 131struct compat_semid64_ds { 132 struct compat_ipc64_perm sem_perm; 133 compat_time_t sem_otime; 134 compat_ulong_t __unused1; 135 compat_time_t sem_ctime; 136 compat_ulong_t __unused2; 137 compat_ulong_t sem_nsems; 138 compat_ulong_t __unused3; 139 compat_ulong_t __unused4; 140}; 141 142struct compat_msqid64_ds { 143 struct compat_ipc64_perm msg_perm; 144 compat_time_t msg_stime; 145 compat_ulong_t __unused1; 146 compat_time_t msg_rtime; 147 compat_ulong_t __unused2; 148 compat_time_t msg_ctime; 149 compat_ulong_t __unused3; 150 compat_ulong_t msg_cbytes; 151 compat_ulong_t msg_qnum; 152 compat_ulong_t msg_qbytes; 153 compat_pid_t msg_lspid; 154 compat_pid_t msg_lrpid; 155 compat_ulong_t __unused4; 156 compat_ulong_t __unused5; 157}; 158 159struct compat_shmid64_ds { 160 struct compat_ipc64_perm shm_perm; 161 compat_size_t shm_segsz; 162 compat_time_t shm_atime; 163 compat_ulong_t __unused1; 164 compat_time_t shm_dtime; 165 compat_ulong_t __unused2; 166 compat_time_t shm_ctime; 167 compat_ulong_t __unused3; 168 compat_pid_t shm_cpid; 169 compat_pid_t shm_lpid; 170 compat_ulong_t shm_nattch; 171 compat_ulong_t __unused4; 172 compat_ulong_t __unused5; 173}; 174 175/* 176 * A pointer passed in from user mode. This should not 177 * be used for syscall parameters, just declare them 178 * as pointers because the syscall entry code will have 179 * appropriately converted them already. 180 */ 181 182static inline void __user *compat_ptr(compat_uptr_t uptr) 183{ 184 return (void __user *)(long)(s32)uptr; 185} 186 187static inline compat_uptr_t ptr_to_compat(void __user *uptr) 188{ 189 return (u32)(unsigned long)uptr; 190} 191 192/* Sign-extend when storing a kernel pointer to a user's ptregs. */ 193static inline unsigned long ptr_to_compat_reg(void __user *uptr) 194{ 195 return (long)(int)(long __force)uptr; 196} 197 198static inline void __user *arch_compat_alloc_user_space(long len) 199{ 200 struct pt_regs *regs = task_pt_regs(current); 201 return (void __user *)regs->sp - len; 202} 203 204static inline int is_compat_task(void) 205{ 206 return current_thread_info()->status & TS_COMPAT; 207} 208 209extern int compat_setup_rt_frame(int sig, struct k_sigaction *ka, 210 siginfo_t *info, sigset_t *set, 211 struct pt_regs *regs); 212 213/* Compat syscalls. */ 214struct compat_sigaction; 215struct compat_siginfo; 216struct compat_sigaltstack; 217long compat_sys_execve(const char __user *path, 218 compat_uptr_t __user *argv, 219 compat_uptr_t __user *envp, struct pt_regs *); 220long compat_sys_rt_sigaction(int sig, struct compat_sigaction __user *act, 221 struct compat_sigaction __user *oact, 222 size_t sigsetsize); 223long compat_sys_rt_sigqueueinfo(int pid, int sig, 224 struct compat_siginfo __user *uinfo); 225long compat_sys_rt_sigreturn(struct pt_regs *); 226long compat_sys_sigaltstack(const struct compat_sigaltstack __user *uss_ptr, 227 struct compat_sigaltstack __user *uoss_ptr, 228 struct pt_regs *); 229long compat_sys_truncate64(char __user *filename, u32 dummy, u32 low, u32 high); 230long compat_sys_ftruncate64(unsigned int fd, u32 dummy, u32 low, u32 high); 231long compat_sys_pread64(unsigned int fd, char __user *ubuf, size_t count, 232 u32 dummy, u32 low, u32 high); 233long compat_sys_pwrite64(unsigned int fd, char __user *ubuf, size_t count, 234 u32 dummy, u32 low, u32 high); 235long compat_sys_lookup_dcookie(u32 low, u32 high, char __user *buf, size_t len); 236long compat_sys_sync_file_range2(int fd, unsigned int flags, 237 u32 offset_lo, u32 offset_hi, 238 u32 nbytes_lo, u32 nbytes_hi); 239long compat_sys_fallocate(int fd, int mode, 240 u32 offset_lo, u32 offset_hi, 241 u32 len_lo, u32 len_hi); 242long compat_sys_sched_rr_get_interval(compat_pid_t pid, 243 struct compat_timespec __user *interval); 244 245/* Tilera Linux syscalls that don't have "compat" versions. */ 246#define compat_sys_flush_cache sys_flush_cache 247 248/* These are the intvec_64.S trampolines. */ 249long _compat_sys_execve(const char __user *path, 250 const compat_uptr_t __user *argv, 251 const compat_uptr_t __user *envp); 252long _compat_sys_sigaltstack(const struct compat_sigaltstack __user *uss_ptr, 253 struct compat_sigaltstack __user *uoss_ptr); 254long _compat_sys_rt_sigreturn(void); 255 256#endif /* _ASM_TILE_COMPAT_H */ 257