at v2.6.33 11 kB view raw
1#ifndef _LINUX_COMPAT_H 2#define _LINUX_COMPAT_H 3/* 4 * These are the type definitions for the architecture specific 5 * syscall compatibility layer. 6 */ 7 8#ifdef CONFIG_COMPAT 9 10#include <linux/stat.h> 11#include <linux/param.h> /* for HZ */ 12#include <linux/sem.h> 13#include <linux/socket.h> 14#include <linux/if.h> 15 16#include <asm/compat.h> 17#include <asm/siginfo.h> 18#include <asm/signal.h> 19 20#define compat_jiffies_to_clock_t(x) \ 21 (((unsigned long)(x) * COMPAT_USER_HZ) / HZ) 22 23typedef __compat_uid32_t compat_uid_t; 24typedef __compat_gid32_t compat_gid_t; 25 26struct rusage; 27 28struct compat_itimerspec { 29 struct compat_timespec it_interval; 30 struct compat_timespec it_value; 31}; 32 33struct compat_utimbuf { 34 compat_time_t actime; 35 compat_time_t modtime; 36}; 37 38struct compat_itimerval { 39 struct compat_timeval it_interval; 40 struct compat_timeval it_value; 41}; 42 43struct compat_tms { 44 compat_clock_t tms_utime; 45 compat_clock_t tms_stime; 46 compat_clock_t tms_cutime; 47 compat_clock_t tms_cstime; 48}; 49 50struct compat_timex { 51 compat_uint_t modes; 52 compat_long_t offset; 53 compat_long_t freq; 54 compat_long_t maxerror; 55 compat_long_t esterror; 56 compat_int_t status; 57 compat_long_t constant; 58 compat_long_t precision; 59 compat_long_t tolerance; 60 struct compat_timeval time; 61 compat_long_t tick; 62 compat_long_t ppsfreq; 63 compat_long_t jitter; 64 compat_int_t shift; 65 compat_long_t stabil; 66 compat_long_t jitcnt; 67 compat_long_t calcnt; 68 compat_long_t errcnt; 69 compat_long_t stbcnt; 70 compat_int_t tai; 71 72 compat_int_t :32; compat_int_t :32; compat_int_t :32; compat_int_t :32; 73 compat_int_t :32; compat_int_t :32; compat_int_t :32; compat_int_t :32; 74 compat_int_t :32; compat_int_t :32; compat_int_t :32; 75}; 76 77#define _COMPAT_NSIG_WORDS (_COMPAT_NSIG / _COMPAT_NSIG_BPW) 78 79typedef struct { 80 compat_sigset_word sig[_COMPAT_NSIG_WORDS]; 81} compat_sigset_t; 82 83extern int get_compat_timespec(struct timespec *, const struct compat_timespec __user *); 84extern int put_compat_timespec(const struct timespec *, struct compat_timespec __user *); 85 86struct compat_iovec { 87 compat_uptr_t iov_base; 88 compat_size_t iov_len; 89}; 90 91struct compat_rlimit { 92 compat_ulong_t rlim_cur; 93 compat_ulong_t rlim_max; 94}; 95 96struct compat_rusage { 97 struct compat_timeval ru_utime; 98 struct compat_timeval ru_stime; 99 compat_long_t ru_maxrss; 100 compat_long_t ru_ixrss; 101 compat_long_t ru_idrss; 102 compat_long_t ru_isrss; 103 compat_long_t ru_minflt; 104 compat_long_t ru_majflt; 105 compat_long_t ru_nswap; 106 compat_long_t ru_inblock; 107 compat_long_t ru_oublock; 108 compat_long_t ru_msgsnd; 109 compat_long_t ru_msgrcv; 110 compat_long_t ru_nsignals; 111 compat_long_t ru_nvcsw; 112 compat_long_t ru_nivcsw; 113}; 114 115extern int put_compat_rusage(const struct rusage *, struct compat_rusage __user *); 116 117struct compat_siginfo; 118 119extern asmlinkage long compat_sys_waitid(int, compat_pid_t, 120 struct compat_siginfo __user *, int, 121 struct compat_rusage __user *); 122 123struct compat_dirent { 124 u32 d_ino; 125 compat_off_t d_off; 126 u16 d_reclen; 127 char d_name[256]; 128}; 129 130struct compat_ustat { 131 compat_daddr_t f_tfree; 132 compat_ino_t f_tinode; 133 char f_fname[6]; 134 char f_fpack[6]; 135}; 136 137typedef union compat_sigval { 138 compat_int_t sival_int; 139 compat_uptr_t sival_ptr; 140} compat_sigval_t; 141 142#define COMPAT_SIGEV_PAD_SIZE ((SIGEV_MAX_SIZE/sizeof(int)) - 3) 143 144typedef struct compat_sigevent { 145 compat_sigval_t sigev_value; 146 compat_int_t sigev_signo; 147 compat_int_t sigev_notify; 148 union { 149 compat_int_t _pad[COMPAT_SIGEV_PAD_SIZE]; 150 compat_int_t _tid; 151 152 struct { 153 compat_uptr_t _function; 154 compat_uptr_t _attribute; 155 } _sigev_thread; 156 } _sigev_un; 157} compat_sigevent_t; 158 159struct compat_ifmap { 160 compat_ulong_t mem_start; 161 compat_ulong_t mem_end; 162 unsigned short base_addr; 163 unsigned char irq; 164 unsigned char dma; 165 unsigned char port; 166}; 167 168struct compat_if_settings 169{ 170 unsigned int type; /* Type of physical device or protocol */ 171 unsigned int size; /* Size of the data allocated by the caller */ 172 compat_uptr_t ifs_ifsu; /* union of pointers */ 173}; 174 175struct compat_ifreq { 176 union { 177 char ifrn_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 178 } ifr_ifrn; 179 union { 180 struct sockaddr ifru_addr; 181 struct sockaddr ifru_dstaddr; 182 struct sockaddr ifru_broadaddr; 183 struct sockaddr ifru_netmask; 184 struct sockaddr ifru_hwaddr; 185 short ifru_flags; 186 compat_int_t ifru_ivalue; 187 compat_int_t ifru_mtu; 188 struct compat_ifmap ifru_map; 189 char ifru_slave[IFNAMSIZ]; /* Just fits the size */ 190 char ifru_newname[IFNAMSIZ]; 191 compat_caddr_t ifru_data; 192 struct compat_if_settings ifru_settings; 193 } ifr_ifru; 194}; 195 196struct compat_ifconf { 197 compat_int_t ifc_len; /* size of buffer */ 198 compat_caddr_t ifcbuf; 199}; 200 201struct compat_robust_list { 202 compat_uptr_t next; 203}; 204 205struct compat_robust_list_head { 206 struct compat_robust_list list; 207 compat_long_t futex_offset; 208 compat_uptr_t list_op_pending; 209}; 210 211extern void compat_exit_robust_list(struct task_struct *curr); 212 213asmlinkage long 214compat_sys_set_robust_list(struct compat_robust_list_head __user *head, 215 compat_size_t len); 216asmlinkage long 217compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr, 218 compat_size_t __user *len_ptr); 219 220long compat_sys_semctl(int first, int second, int third, void __user *uptr); 221long compat_sys_msgsnd(int first, int second, int third, void __user *uptr); 222long compat_sys_msgrcv(int first, int second, int msgtyp, int third, 223 int version, void __user *uptr); 224long compat_sys_msgctl(int first, int second, void __user *uptr); 225long compat_sys_shmat(int first, int second, compat_uptr_t third, int version, 226 void __user *uptr); 227long compat_sys_shmctl(int first, int second, void __user *uptr); 228long compat_sys_semtimedop(int semid, struct sembuf __user *tsems, 229 unsigned nsems, const struct compat_timespec __user *timeout); 230asmlinkage long compat_sys_keyctl(u32 option, 231 u32 arg2, u32 arg3, u32 arg4, u32 arg5); 232asmlinkage long compat_sys_ustat(unsigned dev, struct compat_ustat __user *u32); 233 234asmlinkage ssize_t compat_sys_readv(unsigned long fd, 235 const struct compat_iovec __user *vec, unsigned long vlen); 236asmlinkage ssize_t compat_sys_writev(unsigned long fd, 237 const struct compat_iovec __user *vec, unsigned long vlen); 238asmlinkage ssize_t compat_sys_preadv(unsigned long fd, 239 const struct compat_iovec __user *vec, 240 unsigned long vlen, u32 pos_low, u32 pos_high); 241asmlinkage ssize_t compat_sys_pwritev(unsigned long fd, 242 const struct compat_iovec __user *vec, 243 unsigned long vlen, u32 pos_low, u32 pos_high); 244 245int compat_do_execve(char * filename, compat_uptr_t __user *argv, 246 compat_uptr_t __user *envp, struct pt_regs * regs); 247 248asmlinkage long compat_sys_select(int n, compat_ulong_t __user *inp, 249 compat_ulong_t __user *outp, compat_ulong_t __user *exp, 250 struct compat_timeval __user *tvp); 251 252asmlinkage long compat_sys_wait4(compat_pid_t pid, 253 compat_uint_t __user *stat_addr, int options, 254 struct compat_rusage __user *ru); 255 256#define BITS_PER_COMPAT_LONG (8*sizeof(compat_long_t)) 257 258#define BITS_TO_COMPAT_LONGS(bits) \ 259 (((bits)+BITS_PER_COMPAT_LONG-1)/BITS_PER_COMPAT_LONG) 260 261long compat_get_bitmap(unsigned long *mask, const compat_ulong_t __user *umask, 262 unsigned long bitmap_size); 263long compat_put_bitmap(compat_ulong_t __user *umask, unsigned long *mask, 264 unsigned long bitmap_size); 265int copy_siginfo_from_user32(siginfo_t *to, struct compat_siginfo __user *from); 266int copy_siginfo_to_user32(struct compat_siginfo __user *to, siginfo_t *from); 267int get_compat_sigevent(struct sigevent *event, 268 const struct compat_sigevent __user *u_event); 269long compat_sys_rt_tgsigqueueinfo(compat_pid_t tgid, compat_pid_t pid, int sig, 270 struct compat_siginfo __user *uinfo); 271 272static inline int compat_timeval_compare(struct compat_timeval *lhs, 273 struct compat_timeval *rhs) 274{ 275 if (lhs->tv_sec < rhs->tv_sec) 276 return -1; 277 if (lhs->tv_sec > rhs->tv_sec) 278 return 1; 279 return lhs->tv_usec - rhs->tv_usec; 280} 281 282static inline int compat_timespec_compare(struct compat_timespec *lhs, 283 struct compat_timespec *rhs) 284{ 285 if (lhs->tv_sec < rhs->tv_sec) 286 return -1; 287 if (lhs->tv_sec > rhs->tv_sec) 288 return 1; 289 return lhs->tv_nsec - rhs->tv_nsec; 290} 291 292extern int get_compat_itimerspec(struct itimerspec *dst, 293 const struct compat_itimerspec __user *src); 294extern int put_compat_itimerspec(struct compat_itimerspec __user *dst, 295 const struct itimerspec *src); 296 297asmlinkage long compat_sys_gettimeofday(struct compat_timeval __user *tv, 298 struct timezone __user *tz); 299asmlinkage long compat_sys_settimeofday(struct compat_timeval __user *tv, 300 struct timezone __user *tz); 301 302asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp); 303 304extern int compat_printk(const char *fmt, ...); 305extern void sigset_from_compat(sigset_t *set, compat_sigset_t *compat); 306 307asmlinkage long compat_sys_migrate_pages(compat_pid_t pid, 308 compat_ulong_t maxnode, const compat_ulong_t __user *old_nodes, 309 const compat_ulong_t __user *new_nodes); 310 311extern int compat_ptrace_request(struct task_struct *child, 312 compat_long_t request, 313 compat_ulong_t addr, compat_ulong_t data); 314 315extern long compat_arch_ptrace(struct task_struct *child, compat_long_t request, 316 compat_ulong_t addr, compat_ulong_t data); 317asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid, 318 compat_long_t addr, compat_long_t data); 319 320/* 321 * epoll (fs/eventpoll.c) compat bits follow ... 322 */ 323struct epoll_event; 324#define compat_epoll_event epoll_event 325asmlinkage long compat_sys_epoll_pwait(int epfd, 326 struct compat_epoll_event __user *events, 327 int maxevents, int timeout, 328 const compat_sigset_t __user *sigmask, 329 compat_size_t sigsetsize); 330 331asmlinkage long compat_sys_utimensat(unsigned int dfd, char __user *filename, 332 struct compat_timespec __user *t, int flags); 333 334asmlinkage long compat_sys_signalfd(int ufd, 335 const compat_sigset_t __user *sigmask, 336 compat_size_t sigsetsize); 337asmlinkage long compat_sys_timerfd_settime(int ufd, int flags, 338 const struct compat_itimerspec __user *utmr, 339 struct compat_itimerspec __user *otmr); 340asmlinkage long compat_sys_timerfd_gettime(int ufd, 341 struct compat_itimerspec __user *otmr); 342 343asmlinkage long compat_sys_move_pages(pid_t pid, unsigned long nr_page, 344 __u32 __user *pages, 345 const int __user *nodes, 346 int __user *status, 347 int flags); 348asmlinkage long compat_sys_futimesat(unsigned int dfd, char __user *filename, 349 struct compat_timeval __user *t); 350asmlinkage long compat_sys_newfstatat(unsigned int dfd, char __user * filename, 351 struct compat_stat __user *statbuf, 352 int flag); 353asmlinkage long compat_sys_openat(unsigned int dfd, const char __user *filename, 354 int flags, int mode); 355 356#endif /* CONFIG_COMPAT */ 357#endif /* _LINUX_COMPAT_H */