2 * sys_ia32.c: Conversion between 32bit and 64bit native syscalls. Derived from sys_sparc32.c.
4 * Copyright (C) 2000 VA Linux Co
5 * Copyright (C) 2000 Don Dugger <n0ano@valinux.com>
6 * Copyright (C) 1999 Arun Sharma <arun.sharma@intel.com>
7 * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
8 * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
9 * Copyright (C) 2000-2003 Hewlett-Packard Co
10 * David Mosberger-Tang <davidm@hpl.hp.com>
12 * These routines maintain argument size conversion between 32bit and 64bit
16 #include <linux/config.h>
17 #include <linux/kernel.h>
18 #include <linux/syscalls.h>
19 #include <linux/sysctl.h>
20 #include <linux/sched.h>
22 #include <linux/file.h>
23 #include <linux/signal.h>
24 #include <linux/resource.h>
25 #include <linux/times.h>
26 #include <linux/utsname.h>
27 #include <linux/timex.h>
28 #include <linux/smp.h>
29 #include <linux/smp_lock.h>
30 #include <linux/sem.h>
31 #include <linux/msg.h>
33 #include <linux/shm.h>
34 #include <linux/slab.h>
35 #include <linux/uio.h>
36 #include <linux/nfs_fs.h>
37 #include <linux/quota.h>
38 #include <linux/sunrpc/svc.h>
39 #include <linux/nfsd/nfsd.h>
40 #include <linux/nfsd/cache.h>
41 #include <linux/nfsd/xdr.h>
42 #include <linux/nfsd/syscall.h>
43 #include <linux/poll.h>
44 #include <linux/eventpoll.h>
45 #include <linux/personality.h>
46 #include <linux/ptrace.h>
47 #include <linux/stat.h>
48 #include <linux/ipc.h>
49 #include <linux/compat.h>
50 #include <linux/vfs.h>
52 #include <asm/intrinsics.h>
53 #include <asm/semaphore.h>
54 #include <asm/types.h>
55 #include <asm/uaccess.h>
56 #include <asm/unistd.h>
66 # define DBG(fmt...) printk(KERN_DEBUG fmt)
71 #define A(__x) ((unsigned long)(__x))
72 #define AA(__x) ((unsigned long)(__x))
73 #define ROUND_UP(x,a) ((__typeof__(x))(((unsigned long)(x) + ((a) - 1)) & ~((a) - 1)))
74 #define NAME_OFFSET(de) ((int) ((de)->d_name - (char *) (de)))
76 #define OFFSET4K(a) ((a) & 0xfff)
77 #define PAGE_START(addr) ((addr) & PAGE_MASK)
78 #define MINSIGSTKSZ_IA32 2048
80 #define high2lowuid(uid) ((uid) > 65535 ? 65534 : (uid))
81 #define high2lowgid(gid) ((gid) > 65535 ? 65534 : (gid))
83 extern unsigned long arch_get_unmapped_area (struct file *, unsigned long, unsigned long,
84 unsigned long, unsigned long);
87 * Anything that modifies or inspects ia32 user virtual memory must hold this semaphore
90 /* XXX make per-mm: */
91 static DECLARE_MUTEX(ia32_mmap_sem);
94 nargs (unsigned int arg, char **ap)
104 err = get_user(addr, (unsigned int *)A(arg));
108 *ap++ = (char *) A(addr);
109 arg += sizeof(unsigned int);
116 sys32_execve (char *filename, unsigned int argv, unsigned int envp,
117 struct pt_regs *regs)
119 unsigned long old_map_base, old_task_size, tssd;
124 na = nargs(argv, NULL);
127 ne = nargs(envp, NULL);
130 len = (na + ne + 2) * sizeof(*av);
131 av = kmalloc(len, GFP_KERNEL);
146 old_map_base = current->thread.map_base;
147 old_task_size = current->thread.task_size;
148 tssd = ia64_get_kr(IA64_KR_TSSD);
150 /* we may be exec'ing a 64-bit process: reset map base, task-size, and io-base: */
151 current->thread.map_base = DEFAULT_MAP_BASE;
152 current->thread.task_size = DEFAULT_TASK_SIZE;
153 ia64_set_kr(IA64_KR_IO_BASE, current->thread.old_iob);
154 ia64_set_kr(IA64_KR_TSSD, current->thread.old_k1);
157 r = sys_execve(filename, av, ae, regs);
159 /* oops, execve failed, switch back to old values... */
160 ia64_set_kr(IA64_KR_IO_BASE, IA32_IOBASE);
161 ia64_set_kr(IA64_KR_TSSD, tssd);
162 current->thread.map_base = old_map_base;
163 current->thread.task_size = old_task_size;
164 set_fs(USER_DS); /* establish new task-size as the address-limit */
171 int cp_compat_stat(struct kstat *stat, struct compat_stat *ubuf)
175 if ((u64) stat->size > MAX_NON_LFS ||
176 !old_valid_dev(stat->dev) ||
177 !old_valid_dev(stat->rdev))
180 if (clear_user(ubuf, sizeof(*ubuf)))
183 err = __put_user(old_encode_dev(stat->dev), &ubuf->st_dev);
184 err |= __put_user(stat->ino, &ubuf->st_ino);
185 err |= __put_user(stat->mode, &ubuf->st_mode);
186 err |= __put_user(stat->nlink, &ubuf->st_nlink);
187 err |= __put_user(high2lowuid(stat->uid), &ubuf->st_uid);
188 err |= __put_user(high2lowgid(stat->gid), &ubuf->st_gid);
189 err |= __put_user(old_encode_dev(stat->rdev), &ubuf->st_rdev);
190 err |= __put_user(stat->size, &ubuf->st_size);
191 err |= __put_user(stat->atime.tv_sec, &ubuf->st_atime);
192 err |= __put_user(stat->atime.tv_nsec, &ubuf->st_atime_nsec);
193 err |= __put_user(stat->mtime.tv_sec, &ubuf->st_mtime);
194 err |= __put_user(stat->mtime.tv_nsec, &ubuf->st_mtime_nsec);
195 err |= __put_user(stat->ctime.tv_sec, &ubuf->st_ctime);
196 err |= __put_user(stat->ctime.tv_nsec, &ubuf->st_ctime_nsec);
197 err |= __put_user(stat->blksize, &ubuf->st_blksize);
198 err |= __put_user(stat->blocks, &ubuf->st_blocks);
202 #if PAGE_SHIFT > IA32_PAGE_SHIFT
206 get_page_prot (struct vm_area_struct *vma, unsigned long addr)
210 if (!vma || vma->vm_start > addr)
213 if (vma->vm_flags & VM_READ)
215 if (vma->vm_flags & VM_WRITE)
217 if (vma->vm_flags & VM_EXEC)
223 * Map a subpage by creating an anonymous page that contains the union of the old page and
227 mmap_subpage (struct file *file, unsigned long start, unsigned long end, int prot, int flags,
232 unsigned long ret = 0;
233 struct vm_area_struct *vma = find_vma(current->mm, start);
234 int old_prot = get_page_prot(vma, start);
236 DBG("mmap_subpage(file=%p,start=0x%lx,end=0x%lx,prot=%x,flags=%x,off=0x%llx)\n",
237 file, start, end, prot, flags, off);
240 /* Optimize the case where the old mmap and the new mmap are both anonymous */
241 if ((old_prot & PROT_WRITE) && (flags & MAP_ANONYMOUS) && !vma->vm_file) {
242 if (clear_user((void *) start, end - start)) {
249 page = (void *) get_zeroed_page(GFP_KERNEL);
254 copy_from_user(page, (void *) PAGE_START(start), PAGE_SIZE);
256 down_write(¤t->mm->mmap_sem);
258 ret = do_mmap(0, PAGE_START(start), PAGE_SIZE, prot | PROT_WRITE,
259 flags | MAP_FIXED | MAP_ANONYMOUS, 0);
261 up_write(¤t->mm->mmap_sem);
263 if (IS_ERR((void *) ret))
267 /* copy back the old page contents. */
268 if (offset_in_page(start))
269 copy_to_user((void *) PAGE_START(start), page, offset_in_page(start));
270 if (offset_in_page(end))
271 copy_to_user((void *) end, page + offset_in_page(end),
272 PAGE_SIZE - offset_in_page(end));
275 if (!(flags & MAP_ANONYMOUS)) {
276 /* read the file contents */
277 inode = file->f_dentry->d_inode;
278 if (!inode->i_fop || !file->f_op->read
279 || ((*file->f_op->read)(file, (char *) start, end - start, &off) < 0))
287 if (!(prot & PROT_WRITE))
288 ret = sys_mprotect(PAGE_START(start), PAGE_SIZE, prot | old_prot);
291 free_page((unsigned long) page);
296 emulate_mmap (struct file *file, unsigned long start, unsigned long len, int prot, int flags,
299 unsigned long tmp, end, pend, pstart, ret, is_congruent, fudge = 0;
304 pstart = PAGE_START(start);
305 pend = PAGE_ALIGN(end);
307 if (flags & MAP_FIXED) {
308 if (start > pstart) {
309 if (flags & MAP_SHARED)
311 "%s(%d): emulate_mmap() can't share head (addr=0x%lx)\n",
312 current->comm, current->pid, start);
313 ret = mmap_subpage(file, start, min(PAGE_ALIGN(start), end), prot, flags,
315 if (IS_ERR((void *) ret))
319 return start; /* done */
322 if (flags & MAP_SHARED)
324 "%s(%d): emulate_mmap() can't share tail (end=0x%lx)\n",
325 current->comm, current->pid, end);
326 ret = mmap_subpage(file, max(start, PAGE_START(end)), end, prot, flags,
327 (off + len) - offset_in_page(end));
328 if (IS_ERR((void *) ret))
332 return start; /* done */
336 * If a start address was specified, use it if the entire rounded out area
339 if (start && !pstart)
340 fudge = 1; /* handle case of mapping to range (0,PAGE_SIZE) */
341 tmp = arch_get_unmapped_area(file, pstart - fudge, pend - pstart, 0, flags);
344 start = pstart + offset_in_page(off); /* make start congruent with off */
346 pend = PAGE_ALIGN(end);
350 poff = off + (pstart - start); /* note: (pstart - start) may be negative */
351 is_congruent = (flags & MAP_ANONYMOUS) || (offset_in_page(poff) == 0);
353 if ((flags & MAP_SHARED) && !is_congruent)
354 printk(KERN_INFO "%s(%d): emulate_mmap() can't share contents of incongruent mmap "
355 "(addr=0x%lx,off=0x%llx)\n", current->comm, current->pid, start, off);
357 DBG("mmap_body: mapping [0x%lx-0x%lx) %s with poff 0x%llx\n", pstart, pend,
358 is_congruent ? "congruent" : "not congruent", poff);
360 down_write(¤t->mm->mmap_sem);
362 if (!(flags & MAP_ANONYMOUS) && is_congruent)
363 ret = do_mmap(file, pstart, pend - pstart, prot, flags | MAP_FIXED, poff);
365 ret = do_mmap(0, pstart, pend - pstart,
366 prot | ((flags & MAP_ANONYMOUS) ? 0 : PROT_WRITE),
367 flags | MAP_FIXED | MAP_ANONYMOUS, 0);
369 up_write(¤t->mm->mmap_sem);
371 if (IS_ERR((void *) ret))
375 /* read the file contents */
376 inode = file->f_dentry->d_inode;
377 if (!inode->i_fop || !file->f_op->read
378 || ((*file->f_op->read)(file, (char *) pstart, pend - pstart, &poff) < 0))
380 sys_munmap(pstart, pend - pstart);
383 if (!(prot & PROT_WRITE) && sys_mprotect(pstart, pend - pstart, prot) < 0)
389 #endif /* PAGE_SHIFT > IA32_PAGE_SHIFT */
391 static inline unsigned int
392 get_prot32 (unsigned int prot)
394 if (prot & PROT_WRITE)
395 /* on x86, PROT_WRITE implies PROT_READ which implies PROT_EEC */
396 prot |= PROT_READ | PROT_WRITE | PROT_EXEC;
397 else if (prot & (PROT_READ | PROT_EXEC))
398 /* on x86, there is no distinction between PROT_READ and PROT_EXEC */
399 prot |= (PROT_READ | PROT_EXEC);
405 ia32_do_mmap (struct file *file, unsigned long addr, unsigned long len, int prot, int flags,
408 DBG("ia32_do_mmap(file=%p,addr=0x%lx,len=0x%lx,prot=%x,flags=%x,offset=0x%llx)\n",
409 file, addr, len, prot, flags, offset);
411 if (file && (!file->f_op || !file->f_op->mmap))
414 len = IA32_PAGE_ALIGN(len);
418 if (len > IA32_PAGE_OFFSET || addr > IA32_PAGE_OFFSET - len)
420 if (flags & MAP_FIXED)
426 if (OFFSET4K(offset))
429 prot = get_prot32(prot);
431 #if PAGE_SHIFT > IA32_PAGE_SHIFT
432 down(&ia32_mmap_sem);
434 addr = emulate_mmap(file, addr, len, prot, flags, offset);
438 down_write(¤t->mm->mmap_sem);
440 addr = do_mmap(file, addr, len, prot, flags, offset);
442 up_write(¤t->mm->mmap_sem);
444 DBG("ia32_do_mmap: returning 0x%lx\n", addr);
449 * Linux/i386 didn't use to be able to handle more than 4 system call parameters, so these
450 * system calls used a memory block for parameter passing..
453 struct mmap_arg_struct {
463 sys32_mmap (struct mmap_arg_struct *arg)
465 struct mmap_arg_struct a;
466 struct file *file = NULL;
470 if (copy_from_user(&a, arg, sizeof(a)))
473 if (OFFSET4K(a.offset))
478 flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
479 if (!(flags & MAP_ANONYMOUS)) {
485 addr = ia32_do_mmap(file, a.addr, a.len, a.prot, flags, a.offset);
493 sys32_mmap2 (unsigned int addr, unsigned int len, unsigned int prot, unsigned int flags,
494 unsigned int fd, unsigned int pgoff)
496 struct file *file = NULL;
497 unsigned long retval;
499 flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
500 if (!(flags & MAP_ANONYMOUS)) {
506 retval = ia32_do_mmap(file, addr, len, prot, flags,
507 (unsigned long) pgoff << IA32_PAGE_SHIFT);
515 sys32_munmap (unsigned int start, unsigned int len)
517 unsigned int end = start + len;
520 #if PAGE_SHIFT <= IA32_PAGE_SHIFT
521 ret = sys_munmap(start, end - start);
526 start = PAGE_ALIGN(start);
527 end = PAGE_START(end);
532 down(&ia32_mmap_sem);
534 ret = sys_munmap(start, end - start);
541 #if PAGE_SHIFT > IA32_PAGE_SHIFT
544 * When mprotect()ing a partial page, we set the permission to the union of the old
545 * settings and the new settings. In other words, it's only possible to make access to a
546 * partial page less restrictive.
549 mprotect_subpage (unsigned long address, int new_prot)
552 struct vm_area_struct *vma;
554 if (new_prot == PROT_NONE)
555 return 0; /* optimize case where nothing changes... */
556 vma = find_vma(current->mm, address);
557 old_prot = get_page_prot(vma, address);
558 return sys_mprotect(address, PAGE_SIZE, new_prot | old_prot);
561 #endif /* PAGE_SHIFT > IA32_PAGE_SHIFT */
564 sys32_mprotect (unsigned int start, unsigned int len, int prot)
566 unsigned long end = start + len;
567 #if PAGE_SHIFT > IA32_PAGE_SHIFT
571 prot = get_prot32(prot);
573 #if PAGE_SHIFT <= IA32_PAGE_SHIFT
574 return sys_mprotect(start, end - start, prot);
579 end = IA32_PAGE_ALIGN(end);
583 down(&ia32_mmap_sem);
585 if (offset_in_page(start)) {
586 /* start address is 4KB aligned but not page aligned. */
587 retval = mprotect_subpage(PAGE_START(start), prot);
591 start = PAGE_ALIGN(start);
593 goto out; /* retval is already zero... */
596 if (offset_in_page(end)) {
597 /* end address is 4KB aligned but not page aligned. */
598 retval = mprotect_subpage(PAGE_START(end), prot);
602 end = PAGE_START(end);
604 retval = sys_mprotect(start, end - start, prot);
618 retval = do_pipe(fds);
621 if (copy_to_user(fd, fds, sizeof(fds)))
628 get_tv32 (struct timeval *o, struct compat_timeval *i)
630 return (!access_ok(VERIFY_READ, i, sizeof(*i)) ||
631 (__get_user(o->tv_sec, &i->tv_sec) | __get_user(o->tv_usec, &i->tv_usec)));
635 put_tv32 (struct compat_timeval *o, struct timeval *i)
637 return (!access_ok(VERIFY_WRITE, o, sizeof(*o)) ||
638 (__put_user(i->tv_sec, &o->tv_sec) | __put_user(i->tv_usec, &o->tv_usec)));
641 asmlinkage unsigned long
642 sys32_alarm (unsigned int seconds)
644 struct itimerval it_new, it_old;
645 unsigned int oldalarm;
647 it_new.it_interval.tv_sec = it_new.it_interval.tv_usec = 0;
648 it_new.it_value.tv_sec = seconds;
649 it_new.it_value.tv_usec = 0;
650 do_setitimer(ITIMER_REAL, &it_new, &it_old);
651 oldalarm = it_old.it_value.tv_sec;
652 /* ehhh.. We can't return 0 if we have an alarm pending.. */
653 /* And we'd better return too much than too little anyway */
654 if (it_old.it_value.tv_usec)
659 /* Translations due to time_t size differences. Which affects all
660 sorts of things, like timeval and itimerval. */
662 extern struct timezone sys_tz;
665 sys32_gettimeofday (struct compat_timeval *tv, struct timezone *tz)
669 do_gettimeofday(&ktv);
670 if (put_tv32(tv, &ktv))
674 if (copy_to_user(tz, &sys_tz, sizeof(sys_tz)))
681 sys32_settimeofday (struct compat_timeval *tv, struct timezone *tz)
688 if (get_tv32(&ktv, tv))
690 kts.tv_sec = ktv.tv_sec;
691 kts.tv_nsec = ktv.tv_usec * 1000;
694 if (copy_from_user(&ktz, tz, sizeof(ktz)))
698 return do_sys_settimeofday(tv ? &kts : NULL, tz ? &ktz : NULL);
701 struct getdents32_callback {
702 struct compat_dirent * current_dir;
703 struct compat_dirent * previous;
708 struct readdir32_callback {
709 struct old_linux32_dirent * dirent;
714 filldir32 (void *__buf, const char *name, int namlen, loff_t offset, ino_t ino,
717 struct compat_dirent * dirent;
718 struct getdents32_callback * buf = (struct getdents32_callback *) __buf;
719 int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1, 4);
721 buf->error = -EINVAL; /* only used if we fail.. */
722 if (reclen > buf->count)
724 buf->error = -EFAULT; /* only used if we fail.. */
725 dirent = buf->previous;
727 if (put_user(offset, &dirent->d_off))
729 dirent = buf->current_dir;
730 buf->previous = dirent;
731 if (put_user(ino, &dirent->d_ino)
732 || put_user(reclen, &dirent->d_reclen)
733 || copy_to_user(dirent->d_name, name, namlen)
734 || put_user(0, dirent->d_name + namlen))
736 dirent = (struct compat_dirent *) ((char *) dirent + reclen);
737 buf->current_dir = dirent;
738 buf->count -= reclen;
743 sys32_getdents (unsigned int fd, struct compat_dirent *dirent, unsigned int count)
746 struct compat_dirent * lastdirent;
747 struct getdents32_callback buf;
755 buf.current_dir = dirent;
760 error = vfs_readdir(file, filldir32, &buf);
764 lastdirent = buf.previous;
767 if (put_user(file->f_pos, &lastdirent->d_off))
769 error = count - buf.count;
779 fillonedir32 (void * __buf, const char * name, int namlen, loff_t offset, ino_t ino,
782 struct readdir32_callback * buf = (struct readdir32_callback *) __buf;
783 struct old_linux32_dirent * dirent;
788 dirent = buf->dirent;
789 if (put_user(ino, &dirent->d_ino)
790 || put_user(offset, &dirent->d_offset)
791 || put_user(namlen, &dirent->d_namlen)
792 || copy_to_user(dirent->d_name, name, namlen)
793 || put_user(0, dirent->d_name + namlen))
799 sys32_readdir (unsigned int fd, void *dirent, unsigned int count)
803 struct readdir32_callback buf;
813 error = vfs_readdir(file, fillonedir32, &buf);
822 * We can actually return ERESTARTSYS instead of EINTR, but I'd
823 * like to be certain this leads to no problems. So I return
824 * EINTR just for safety.
826 * Update: ERESTARTSYS breaks at least the xview clock binary, so
827 * I'm trying ERESTARTNOHAND which restart only when you want to.
829 #define MAX_SELECT_SECONDS \
830 ((unsigned long) (MAX_SCHEDULE_TIMEOUT / HZ)-1)
831 #define ROUND_UP_TIME(x,y) (((x)+(y)-1)/(y))
834 sys32_select (int n, fd_set *inp, fd_set *outp, fd_set *exp, struct compat_timeval *tvp32)
841 timeout = MAX_SCHEDULE_TIMEOUT;
846 if (get_user(sec, &tvp32->tv_sec) || get_user(usec, &tvp32->tv_usec))
850 if (sec < 0 || usec < 0)
853 if ((unsigned long) sec < MAX_SELECT_SECONDS) {
854 timeout = ROUND_UP_TIME(usec, 1000000/HZ);
855 timeout += sec * (unsigned long) HZ;
863 if (n > current->files->max_fdset)
864 n = current->files->max_fdset;
867 * We need 6 bitmaps (in/out/ex for both incoming and outgoing),
868 * since we used fdset we need to allocate memory in units of
873 bits = kmalloc(6 * size, GFP_KERNEL);
876 fds.in = (unsigned long *) bits;
877 fds.out = (unsigned long *) (bits + size);
878 fds.ex = (unsigned long *) (bits + 2*size);
879 fds.res_in = (unsigned long *) (bits + 3*size);
880 fds.res_out = (unsigned long *) (bits + 4*size);
881 fds.res_ex = (unsigned long *) (bits + 5*size);
883 if ((ret = get_fd_set(n, inp, fds.in)) ||
884 (ret = get_fd_set(n, outp, fds.out)) ||
885 (ret = get_fd_set(n, exp, fds.ex)))
887 zero_fd_set(n, fds.res_in);
888 zero_fd_set(n, fds.res_out);
889 zero_fd_set(n, fds.res_ex);
891 ret = do_select(n, &fds, &timeout);
893 if (tvp32 && !(current->personality & STICKY_TIMEOUTS)) {
894 time_t sec = 0, usec = 0;
898 usec *= (1000000/HZ);
900 if (put_user(sec, &tvp32->tv_sec) || put_user(usec, &tvp32->tv_usec)) {
909 ret = -ERESTARTNOHAND;
910 if (signal_pending(current))
915 set_fd_set(n, inp, fds.res_in);
916 set_fd_set(n, outp, fds.res_out);
917 set_fd_set(n, exp, fds.res_ex);
925 struct sel_arg_struct {
934 sys32_old_select (struct sel_arg_struct *arg)
936 struct sel_arg_struct a;
938 if (copy_from_user(&a, arg, sizeof(a)))
940 return sys32_select(a.n, (fd_set *) A(a.inp), (fd_set *) A(a.outp), (fd_set *) A(a.exp),
941 (struct compat_timeval *) A(a.tvp));
944 static struct iovec *
945 get_compat_iovec (struct compat_iovec *iov32, struct iovec *iov_buf, u32 count, int type)
948 struct iovec *ivp, *iov;
950 /* Get the "struct iovec" from user memory */
954 if (verify_area(VERIFY_READ, iov32, sizeof(struct compat_iovec)*count))
956 if (count > UIO_MAXIOV)
958 if (count > UIO_FASTIOV) {
959 iov = kmalloc(count*sizeof(struct iovec), GFP_KERNEL);
966 for (i = 0; i < count; i++) {
967 if (__get_user(len, &iov32->iov_len) || __get_user(buf, &iov32->iov_base)) {
972 if (verify_area(type, (void *)A(buf), len)) {
975 return((struct iovec *)0);
977 ivp->iov_base = (void *)A(buf);
978 ivp->iov_len = (__kernel_size_t) len;
986 sys32_readv (int fd, struct compat_iovec *vector, u32 count)
988 struct iovec iovstack[UIO_FASTIOV];
991 mm_segment_t old_fs = get_fs();
993 iov = get_compat_iovec(vector, iovstack, count, VERIFY_WRITE);
997 ret = sys_readv(fd, iov, count);
1005 sys32_writev (int fd, struct compat_iovec *vector, u32 count)
1007 struct iovec iovstack[UIO_FASTIOV];
1010 mm_segment_t old_fs = get_fs();
1012 iov = get_compat_iovec(vector, iovstack, count, VERIFY_READ);
1016 ret = sys_writev(fd, iov, count);
1018 if (iov != iovstack)
1026 #define SEMTIMEDOP 4
1037 sys32_ipc(u32 call, int first, int second, int third, u32 ptr, u32 fifth)
1041 version = call >> 16; /* hack for backward compatibility */
1047 return compat_sys_semtimedop(first, compat_ptr(ptr),
1048 second, compat_ptr(fifth));
1049 /* else fall through for normal semop() */
1051 /* struct sembuf is the same on 32 and 64bit :)) */
1052 return sys_semtimedop(first, compat_ptr(ptr), second,
1055 return sys_semget(first, second, third);
1057 return compat_sys_semctl(first, second, third, compat_ptr(ptr));
1060 return compat_sys_msgsnd(first, second, third, compat_ptr(ptr));
1062 return compat_sys_msgrcv(first, second, fifth, third, version, compat_ptr(ptr));
1064 return sys_msgget((key_t) first, second);
1066 return compat_sys_msgctl(first, second, compat_ptr(ptr));
1069 return compat_sys_shmat(first, second, third, version, compat_ptr(ptr));
1072 return sys_shmdt(compat_ptr(ptr));
1074 return sys_shmget(first, second, third);
1076 return compat_sys_shmctl(first, second, compat_ptr(ptr));
1085 * sys_time() can be implemented in user-level using
1086 * sys_gettimeofday(). IA64 did this but i386 Linux did not
1087 * so we have to implement this system call here.
1090 sys32_time (int *tloc)
1095 do_gettimeofday(&tv);
1099 if (put_user(i, tloc))
1106 compat_sys_wait4 (compat_pid_t pid, compat_uint_t * stat_addr, int options,
1107 struct compat_rusage *ru);
1110 sys32_waitpid (int pid, unsigned int *stat_addr, int options)
1112 return compat_sys_wait4(pid, stat_addr, options, NULL);
1116 ia32_peek (struct pt_regs *regs, struct task_struct *child, unsigned long addr, unsigned int *val)
1121 copied = access_process_vm(child, addr, val, sizeof(*val), 0);
1122 return (copied != sizeof(ret)) ? -EIO : 0;
1126 ia32_poke (struct pt_regs *regs, struct task_struct *child, unsigned long addr, unsigned int val)
1129 if (access_process_vm(child, addr, &val, sizeof(val), 1) != sizeof(val))
1135 * The order in which registers are stored in the ptrace regs structure
1148 #define PT_ORIG_EAX 11
1156 getreg (struct task_struct *child, int regno)
1158 struct pt_regs *child_regs;
1160 child_regs = ia64_task_regs(child);
1161 switch (regno / sizeof(int)) {
1162 case PT_EBX: return child_regs->r11;
1163 case PT_ECX: return child_regs->r9;
1164 case PT_EDX: return child_regs->r10;
1165 case PT_ESI: return child_regs->r14;
1166 case PT_EDI: return child_regs->r15;
1167 case PT_EBP: return child_regs->r13;
1168 case PT_EAX: return child_regs->r8;
1169 case PT_ORIG_EAX: return child_regs->r1; /* see dispatch_to_ia32_handler() */
1170 case PT_EIP: return child_regs->cr_iip;
1171 case PT_UESP: return child_regs->r12;
1172 case PT_EFL: return child->thread.eflag;
1173 case PT_DS: case PT_ES: case PT_FS: case PT_GS: case PT_SS:
1175 case PT_CS: return __USER_CS;
1177 printk(KERN_ERR "ia32.getreg(): unknown register %d\n", regno);
1184 putreg (struct task_struct *child, int regno, unsigned int value)
1186 struct pt_regs *child_regs;
1188 child_regs = ia64_task_regs(child);
1189 switch (regno / sizeof(int)) {
1190 case PT_EBX: child_regs->r11 = value; break;
1191 case PT_ECX: child_regs->r9 = value; break;
1192 case PT_EDX: child_regs->r10 = value; break;
1193 case PT_ESI: child_regs->r14 = value; break;
1194 case PT_EDI: child_regs->r15 = value; break;
1195 case PT_EBP: child_regs->r13 = value; break;
1196 case PT_EAX: child_regs->r8 = value; break;
1197 case PT_ORIG_EAX: child_regs->r1 = value; break;
1198 case PT_EIP: child_regs->cr_iip = value; break;
1199 case PT_UESP: child_regs->r12 = value; break;
1200 case PT_EFL: child->thread.eflag = value; break;
1201 case PT_DS: case PT_ES: case PT_FS: case PT_GS: case PT_SS:
1202 if (value != __USER_DS)
1204 "ia32.putreg: attempt to set invalid segment register %d = %x\n",
1208 if (value != __USER_CS)
1210 "ia32.putreg: attempt to to set invalid segment register %d = %x\n",
1214 printk(KERN_ERR "ia32.putreg: unknown register %d\n", regno);
1220 put_fpreg (int regno, struct _fpreg_ia32 *reg, struct pt_regs *ptp, struct switch_stack *swp,
1223 struct _fpreg_ia32 *f;
1226 f = (struct _fpreg_ia32 *)(((unsigned long)buf + 15) & ~15);
1227 if ((regno += tos) >= 8)
1231 ia64f2ia32f(f, &ptp->f8);
1234 ia64f2ia32f(f, &ptp->f9);
1237 ia64f2ia32f(f, &ptp->f10);
1240 ia64f2ia32f(f, &ptp->f11);
1246 ia64f2ia32f(f, &swp->f12 + (regno - 4));
1249 copy_to_user(reg, f, sizeof(*reg));
1253 get_fpreg (int regno, struct _fpreg_ia32 *reg, struct pt_regs *ptp, struct switch_stack *swp,
1257 if ((regno += tos) >= 8)
1261 copy_from_user(&ptp->f8, reg, sizeof(*reg));
1264 copy_from_user(&ptp->f9, reg, sizeof(*reg));
1267 copy_from_user(&ptp->f10, reg, sizeof(*reg));
1270 copy_from_user(&ptp->f11, reg, sizeof(*reg));
1276 copy_from_user(&swp->f12 + (regno - 4), reg, sizeof(*reg));
1283 save_ia32_fpstate (struct task_struct *tsk, struct ia32_user_i387_struct *save)
1285 struct switch_stack *swp;
1286 struct pt_regs *ptp;
1289 if (!access_ok(VERIFY_WRITE, save, sizeof(*save)))
1292 __put_user(tsk->thread.fcr & 0xffff, &save->cwd);
1293 __put_user(tsk->thread.fsr & 0xffff, &save->swd);
1294 __put_user((tsk->thread.fsr>>16) & 0xffff, &save->twd);
1295 __put_user(tsk->thread.fir, &save->fip);
1296 __put_user((tsk->thread.fir>>32) & 0xffff, &save->fcs);
1297 __put_user(tsk->thread.fdr, &save->foo);
1298 __put_user((tsk->thread.fdr>>32) & 0xffff, &save->fos);
1301 * Stack frames start with 16-bytes of temp space
1303 swp = (struct switch_stack *)(tsk->thread.ksp + 16);
1304 ptp = ia64_task_regs(tsk);
1305 tos = (tsk->thread.fsr >> 11) & 7;
1306 for (i = 0; i < 8; i++)
1307 put_fpreg(i, &save->st_space[i], ptp, swp, tos);
1312 restore_ia32_fpstate (struct task_struct *tsk, struct ia32_user_i387_struct *save)
1314 struct switch_stack *swp;
1315 struct pt_regs *ptp;
1317 unsigned int fsrlo, fsrhi, num32;
1319 if (!access_ok(VERIFY_READ, save, sizeof(*save)))
1322 __get_user(num32, (unsigned int *)&save->cwd);
1323 tsk->thread.fcr = (tsk->thread.fcr & (~0x1f3f)) | (num32 & 0x1f3f);
1324 __get_user(fsrlo, (unsigned int *)&save->swd);
1325 __get_user(fsrhi, (unsigned int *)&save->twd);
1326 num32 = (fsrhi << 16) | fsrlo;
1327 tsk->thread.fsr = (tsk->thread.fsr & (~0xffffffff)) | num32;
1328 __get_user(num32, (unsigned int *)&save->fip);
1329 tsk->thread.fir = (tsk->thread.fir & (~0xffffffff)) | num32;
1330 __get_user(num32, (unsigned int *)&save->foo);
1331 tsk->thread.fdr = (tsk->thread.fdr & (~0xffffffff)) | num32;
1334 * Stack frames start with 16-bytes of temp space
1336 swp = (struct switch_stack *)(tsk->thread.ksp + 16);
1337 ptp = ia64_task_regs(tsk);
1338 tos = (tsk->thread.fsr >> 11) & 7;
1339 for (i = 0; i < 8; i++)
1340 get_fpreg(i, &save->st_space[i], ptp, swp, tos);
1345 save_ia32_fpxstate (struct task_struct *tsk, struct ia32_user_fxsr_struct *save)
1347 struct switch_stack *swp;
1348 struct pt_regs *ptp;
1350 unsigned long mxcsr=0;
1351 unsigned long num128[2];
1353 if (!access_ok(VERIFY_WRITE, save, sizeof(*save)))
1356 __put_user(tsk->thread.fcr & 0xffff, &save->cwd);
1357 __put_user(tsk->thread.fsr & 0xffff, &save->swd);
1358 __put_user((tsk->thread.fsr>>16) & 0xffff, &save->twd);
1359 __put_user(tsk->thread.fir, &save->fip);
1360 __put_user((tsk->thread.fir>>32) & 0xffff, &save->fcs);
1361 __put_user(tsk->thread.fdr, &save->foo);
1362 __put_user((tsk->thread.fdr>>32) & 0xffff, &save->fos);
1365 * Stack frames start with 16-bytes of temp space
1367 swp = (struct switch_stack *)(tsk->thread.ksp + 16);
1368 ptp = ia64_task_regs(tsk);
1369 tos = (tsk->thread.fsr >> 11) & 7;
1370 for (i = 0; i < 8; i++)
1371 put_fpreg(i, (struct _fpreg_ia32 *)&save->st_space[4*i], ptp, swp, tos);
1373 mxcsr = ((tsk->thread.fcr>>32) & 0xff80) | ((tsk->thread.fsr>>32) & 0x3f);
1374 __put_user(mxcsr & 0xffff, &save->mxcsr);
1375 for (i = 0; i < 8; i++) {
1376 memcpy(&(num128[0]), &(swp->f16) + i*2, sizeof(unsigned long));
1377 memcpy(&(num128[1]), &(swp->f17) + i*2, sizeof(unsigned long));
1378 copy_to_user(&save->xmm_space[0] + 4*i, num128, sizeof(struct _xmmreg_ia32));
1384 restore_ia32_fpxstate (struct task_struct *tsk, struct ia32_user_fxsr_struct *save)
1386 struct switch_stack *swp;
1387 struct pt_regs *ptp;
1389 unsigned int fsrlo, fsrhi, num32;
1391 unsigned long num64;
1392 unsigned long num128[2];
1394 if (!access_ok(VERIFY_READ, save, sizeof(*save)))
1397 __get_user(num32, (unsigned int *)&save->cwd);
1398 tsk->thread.fcr = (tsk->thread.fcr & (~0x1f3f)) | (num32 & 0x1f3f);
1399 __get_user(fsrlo, (unsigned int *)&save->swd);
1400 __get_user(fsrhi, (unsigned int *)&save->twd);
1401 num32 = (fsrhi << 16) | fsrlo;
1402 tsk->thread.fsr = (tsk->thread.fsr & (~0xffffffff)) | num32;
1403 __get_user(num32, (unsigned int *)&save->fip);
1404 tsk->thread.fir = (tsk->thread.fir & (~0xffffffff)) | num32;
1405 __get_user(num32, (unsigned int *)&save->foo);
1406 tsk->thread.fdr = (tsk->thread.fdr & (~0xffffffff)) | num32;
1409 * Stack frames start with 16-bytes of temp space
1411 swp = (struct switch_stack *)(tsk->thread.ksp + 16);
1412 ptp = ia64_task_regs(tsk);
1413 tos = (tsk->thread.fsr >> 11) & 7;
1414 for (i = 0; i < 8; i++)
1415 get_fpreg(i, (struct _fpreg_ia32 *)&save->st_space[4*i], ptp, swp, tos);
1417 __get_user(mxcsr, (unsigned int *)&save->mxcsr);
1418 num64 = mxcsr & 0xff10;
1419 tsk->thread.fcr = (tsk->thread.fcr & (~0xff1000000000)) | (num64<<32);
1420 num64 = mxcsr & 0x3f;
1421 tsk->thread.fsr = (tsk->thread.fsr & (~0x3f00000000)) | (num64<<32);
1423 for (i = 0; i < 8; i++) {
1424 copy_from_user(num128, &save->xmm_space[0] + 4*i, sizeof(struct _xmmreg_ia32));
1425 memcpy(&(swp->f16) + i*2, &(num128[0]), sizeof(unsigned long));
1426 memcpy(&(swp->f17) + i*2, &(num128[1]), sizeof(unsigned long));
1432 * Note that the IA32 version of `ptrace' calls the IA64 routine for
1433 * many of the requests. This will only work for requests that do
1434 * not need access to the calling processes `pt_regs' which is located
1435 * at the address of `stack'. Once we call the IA64 `sys_ptrace' then
1436 * the address of `stack' will not be the address of the `pt_regs'.
1439 sys32_ptrace (int request, pid_t pid, unsigned int addr, unsigned int data,
1440 long arg4, long arg5, long arg6, long arg7, long stack)
1442 struct pt_regs *regs = (struct pt_regs *) &stack;
1443 struct task_struct *child;
1444 unsigned int value, tmp;
1448 if (request == PTRACE_TRACEME) {
1449 ret = sys_ptrace(request, pid, addr, data, arg4, arg5, arg6, arg7, stack);
1454 read_lock(&tasklist_lock);
1455 child = find_task_by_pid(pid);
1457 get_task_struct(child);
1458 read_unlock(&tasklist_lock);
1462 if (pid == 1) /* no messing around with init! */
1465 if (request == PTRACE_ATTACH) {
1466 ret = sys_ptrace(request, pid, addr, data, arg4, arg5, arg6, arg7, stack);
1470 ret = ptrace_check_attach(child, request == PTRACE_KILL);
1475 case PTRACE_PEEKTEXT:
1476 case PTRACE_PEEKDATA: /* read word at location addr */
1477 ret = ia32_peek(regs, child, addr, &value);
1479 ret = put_user(value, (unsigned int *) A(data));
1484 case PTRACE_POKETEXT:
1485 case PTRACE_POKEDATA: /* write the word at location addr */
1486 ret = ia32_poke(regs, child, addr, data);
1489 case PTRACE_PEEKUSR: /* read word at addr in USER area */
1491 if ((addr & 3) || addr > 17*sizeof(int))
1494 tmp = getreg(child, addr);
1495 if (!put_user(tmp, (unsigned int *) A(data)))
1499 case PTRACE_POKEUSR: /* write word at addr in USER area */
1501 if ((addr & 3) || addr > 17*sizeof(int))
1504 putreg(child, addr, data);
1508 case IA32_PTRACE_GETREGS:
1509 if (!access_ok(VERIFY_WRITE, (int *) A(data), 17*sizeof(int))) {
1513 for (i = 0; i < (int) (17*sizeof(int)); i += sizeof(int) ) {
1514 put_user(getreg(child, i), (unsigned int *) A(data));
1515 data += sizeof(int);
1520 case IA32_PTRACE_SETREGS:
1521 if (!access_ok(VERIFY_READ, (int *) A(data), 17*sizeof(int))) {
1525 for (i = 0; i < (int) (17*sizeof(int)); i += sizeof(int) ) {
1526 get_user(tmp, (unsigned int *) A(data));
1527 putreg(child, i, tmp);
1528 data += sizeof(int);
1533 case IA32_PTRACE_GETFPREGS:
1534 ret = save_ia32_fpstate(child, (struct ia32_user_i387_struct *) A(data));
1537 case IA32_PTRACE_GETFPXREGS:
1538 ret = save_ia32_fpxstate(child, (struct ia32_user_fxsr_struct *) A(data));
1541 case IA32_PTRACE_SETFPREGS:
1542 ret = restore_ia32_fpstate(child, (struct ia32_user_i387_struct *) A(data));
1545 case IA32_PTRACE_SETFPXREGS:
1546 ret = restore_ia32_fpxstate(child, (struct ia32_user_fxsr_struct *) A(data));
1549 case PTRACE_SYSCALL: /* continue, stop after next syscall */
1550 case PTRACE_CONT: /* restart after signal. */
1552 case PTRACE_SINGLESTEP: /* execute chile for one instruction */
1553 case PTRACE_DETACH: /* detach a process */
1554 ret = sys_ptrace(request, pid, addr, data, arg4, arg5, arg6, arg7, stack);
1558 ret = ptrace_request(child, request, addr, data);
1563 put_task_struct(child);
1570 * The IA64 maps 4 I/O ports for each 4K page
1572 #define IOLEN ((65536 / 4) * 4096)
1575 sys32_iopl (int level)
1577 extern unsigned long ia64_iobase;
1582 mm_segment_t old_fs = get_fs ();
1586 /* Trying to gain more privileges? */
1587 old = ia64_getreg(_IA64_REG_AR_EFLAG);
1588 if ((unsigned int) level > ((old >> 12) & 3)) {
1589 if (!capable(CAP_SYS_RAWIO))
1593 fd = sys_open("/dev/mem", O_SYNC | O_RDWR, 0);
1603 down_write(¤t->mm->mmap_sem);
1604 addr = do_mmap_pgoff(file, IA32_IOBASE,
1605 IOLEN, PROT_READ|PROT_WRITE, MAP_SHARED,
1606 (ia64_iobase & ~PAGE_OFFSET) >> PAGE_SHIFT);
1607 up_write(¤t->mm->mmap_sem);
1610 old = (old & ~0x3000) | (level << 12);
1611 ia64_setreg(_IA64_REG_AR_EFLAG, old);
1620 sys32_ioperm (unsigned int from, unsigned int num, int on)
1624 * Since IA64 doesn't have permission bits we'd have to go to
1625 * a lot of trouble to simulate them in software. There's
1626 * no point, only trusted programs can make this call so we'll
1627 * just turn it into an iopl call and let the process have
1628 * access to all I/O ports.
1630 * XXX proper ioperm() support should be emulated by
1631 * manipulating the page protections...
1633 return sys32_iopl(3);
1638 unsigned int ss_flags;
1639 unsigned int ss_size;
1643 sys32_sigaltstack (ia32_stack_t *uss32, ia32_stack_t *uoss32,
1644 long arg2, long arg3, long arg4, long arg5, long arg6, long arg7, long stack)
1646 struct pt_regs *pt = (struct pt_regs *) &stack;
1650 mm_segment_t old_fs = get_fs();
1653 if (copy_from_user(&buf32, uss32, sizeof(ia32_stack_t)))
1655 uss.ss_sp = (void *) (long) buf32.ss_sp;
1656 uss.ss_flags = buf32.ss_flags;
1657 /* MINSIGSTKSZ is different for ia32 vs ia64. We lie here to pass the
1658 check and set it to the user requested value later */
1659 if ((buf32.ss_flags != SS_DISABLE) && (buf32.ss_size < MINSIGSTKSZ_IA32)) {
1663 uss.ss_size = MINSIGSTKSZ;
1665 ret = do_sigaltstack(uss32 ? &uss : NULL, &uoss, pt->r12);
1666 current->sas_ss_size = buf32.ss_size;
1672 buf32.ss_sp = (long) uoss.ss_sp;
1673 buf32.ss_flags = uoss.ss_flags;
1674 buf32.ss_size = uoss.ss_size;
1675 if (copy_to_user(uoss32, &buf32, sizeof(ia32_stack_t)))
1684 current->state = TASK_INTERRUPTIBLE;
1686 return -ERESTARTNOHAND;
1690 sys32_msync (unsigned int start, unsigned int len, int flags)
1694 if (OFFSET4K(start))
1696 addr = PAGE_START(start);
1697 return sys_msync(addr, len + (start - addr), flags);
1703 unsigned int oldval;
1704 unsigned int oldlenp;
1705 unsigned int newval;
1706 unsigned int newlen;
1707 unsigned int __unused[4];
1711 sys32_sysctl (struct sysctl32 *args)
1713 #ifdef CONFIG_SYSCTL
1714 struct sysctl32 a32;
1715 mm_segment_t old_fs = get_fs ();
1716 void *oldvalp, *newvalp;
1721 if (copy_from_user(&a32, args, sizeof(a32)))
1725 * We need to pre-validate these because we have to disable address checking
1726 * before calling do_sysctl() because of OLDLEN but we can't run the risk of the
1727 * user specifying bad addresses here. Well, since we're dealing with 32 bit
1728 * addresses, we KNOW that access_ok() will always succeed, so this is an
1729 * expensive NOP, but so what...
1731 namep = (int *) A(a32.name);
1732 oldvalp = (void *) A(a32.oldval);
1733 newvalp = (void *) A(a32.newval);
1735 if ((oldvalp && get_user(oldlen, (int *) A(a32.oldlenp)))
1736 || !access_ok(VERIFY_WRITE, namep, 0)
1737 || !access_ok(VERIFY_WRITE, oldvalp, 0)
1738 || !access_ok(VERIFY_WRITE, newvalp, 0))
1743 ret = do_sysctl(namep, a32.nlen, oldvalp, &oldlen, newvalp, (size_t) a32.newlen);
1747 if (oldvalp && put_user (oldlen, (int *) A(a32.oldlenp)))
1757 sys32_newuname (struct new_utsname *name)
1759 int ret = sys_newuname(name);
1762 if (copy_to_user(name->machine, "i686\0\0\0", 8))
1768 sys32_getresuid16 (u16 *ruid, u16 *euid, u16 *suid)
1772 mm_segment_t old_fs = get_fs();
1775 ret = sys_getresuid(&a, &b, &c);
1778 if (put_user(a, ruid) || put_user(b, euid) || put_user(c, suid))
1784 sys32_getresgid16 (u16 *rgid, u16 *egid, u16 *sgid)
1788 mm_segment_t old_fs = get_fs();
1791 ret = sys_getresgid(&a, &b, &c);
1797 return put_user(a, rgid) | put_user(b, egid) | put_user(c, sgid);
1801 sys32_lseek (unsigned int fd, int offset, unsigned int whence)
1803 /* Sign-extension of "offset" is important here... */
1804 return sys_lseek(fd, offset, whence);
1808 groups16_to_user(short *grouplist, struct group_info *group_info)
1813 for (i = 0; i < group_info->ngroups; i++) {
1814 group = (short)GROUP_AT(group_info, i);
1815 if (put_user(group, grouplist+i))
1823 groups16_from_user(struct group_info *group_info, short *grouplist)
1828 for (i = 0; i < group_info->ngroups; i++) {
1829 if (get_user(group, grouplist+i))
1831 GROUP_AT(group_info, i) = (gid_t)group;
1838 sys32_getgroups16 (int gidsetsize, short *grouplist)
1845 get_group_info(current->group_info);
1846 i = current->group_info->ngroups;
1848 if (i > gidsetsize) {
1852 if (groups16_to_user(grouplist, current->group_info)) {
1858 put_group_info(current->group_info);
1863 sys32_setgroups16 (int gidsetsize, short *grouplist)
1865 struct group_info *group_info;
1868 if (!capable(CAP_SETGID))
1870 if ((unsigned)gidsetsize > NGROUPS_MAX)
1873 group_info = groups_alloc(gidsetsize);
1876 retval = groups16_from_user(group_info, grouplist);
1878 put_group_info(group_info);
1882 retval = set_current_groups(group_info);
1883 put_group_info(group_info);
1889 sys32_truncate64 (unsigned int path, unsigned int len_lo, unsigned int len_hi)
1891 return sys_truncate((const char *) A(path), ((unsigned long) len_hi << 32) | len_lo);
1895 sys32_ftruncate64 (int fd, unsigned int len_lo, unsigned int len_hi)
1897 return sys_ftruncate(fd, ((unsigned long) len_hi << 32) | len_lo);
1901 putstat64 (struct stat64 *ubuf, struct kstat *kbuf)
1906 if (clear_user(ubuf, sizeof(*ubuf)))
1909 hdev = huge_encode_dev(kbuf->dev);
1910 err = __put_user(hdev, (u32*)&ubuf->st_dev);
1911 err |= __put_user(hdev >> 32, ((u32*)&ubuf->st_dev) + 1);
1912 err |= __put_user(kbuf->ino, &ubuf->__st_ino);
1913 err |= __put_user(kbuf->ino, &ubuf->st_ino_lo);
1914 err |= __put_user(kbuf->ino >> 32, &ubuf->st_ino_hi);
1915 err |= __put_user(kbuf->mode, &ubuf->st_mode);
1916 err |= __put_user(kbuf->nlink, &ubuf->st_nlink);
1917 err |= __put_user(kbuf->uid, &ubuf->st_uid);
1918 err |= __put_user(kbuf->gid, &ubuf->st_gid);
1919 hdev = huge_encode_dev(kbuf->rdev);
1920 err = __put_user(hdev, (u32*)&ubuf->st_rdev);
1921 err |= __put_user(hdev >> 32, ((u32*)&ubuf->st_rdev) + 1);
1922 err |= __put_user(kbuf->size, &ubuf->st_size_lo);
1923 err |= __put_user((kbuf->size >> 32), &ubuf->st_size_hi);
1924 err |= __put_user(kbuf->atime.tv_sec, &ubuf->st_atime);
1925 err |= __put_user(kbuf->atime.tv_nsec, &ubuf->st_atime_nsec);
1926 err |= __put_user(kbuf->mtime.tv_sec, &ubuf->st_mtime);
1927 err |= __put_user(kbuf->mtime.tv_nsec, &ubuf->st_mtime_nsec);
1928 err |= __put_user(kbuf->ctime.tv_sec, &ubuf->st_ctime);
1929 err |= __put_user(kbuf->ctime.tv_nsec, &ubuf->st_ctime_nsec);
1930 err |= __put_user(kbuf->blksize, &ubuf->st_blksize);
1931 err |= __put_user(kbuf->blocks, &ubuf->st_blocks);
1936 sys32_stat64 (char *filename, struct stat64 *statbuf)
1939 long ret = vfs_stat(filename, &s);
1941 ret = putstat64(statbuf, &s);
1946 sys32_lstat64 (char *filename, struct stat64 *statbuf)
1949 long ret = vfs_lstat(filename, &s);
1951 ret = putstat64(statbuf, &s);
1956 sys32_fstat64 (unsigned int fd, struct stat64 *statbuf)
1959 long ret = vfs_fstat(fd, &s);
1961 ret = putstat64(statbuf, &s);
1983 sys32_sysinfo (struct sysinfo32 *info)
1988 mm_segment_t old_fs = get_fs();
1991 ret = sys_sysinfo(&s);
1993 /* Check to see if any memory value is too large for 32-bit and
1994 * scale down if needed.
1996 if ((s.totalram >> 32) || (s.totalswap >> 32)) {
1997 while (s.mem_unit < PAGE_SIZE) {
2001 s.totalram >>= bitcount;
2002 s.freeram >>= bitcount;
2003 s.sharedram >>= bitcount;
2004 s.bufferram >>= bitcount;
2005 s.totalswap >>= bitcount;
2006 s.freeswap >>= bitcount;
2007 s.totalhigh >>= bitcount;
2008 s.freehigh >>= bitcount;
2011 if (!access_ok(VERIFY_WRITE, info, sizeof(*info)))
2014 err = __put_user(s.uptime, &info->uptime);
2015 err |= __put_user(s.loads[0], &info->loads[0]);
2016 err |= __put_user(s.loads[1], &info->loads[1]);
2017 err |= __put_user(s.loads[2], &info->loads[2]);
2018 err |= __put_user(s.totalram, &info->totalram);
2019 err |= __put_user(s.freeram, &info->freeram);
2020 err |= __put_user(s.sharedram, &info->sharedram);
2021 err |= __put_user(s.bufferram, &info->bufferram);
2022 err |= __put_user(s.totalswap, &info->totalswap);
2023 err |= __put_user(s.freeswap, &info->freeswap);
2024 err |= __put_user(s.procs, &info->procs);
2025 err |= __put_user (s.totalhigh, &info->totalhigh);
2026 err |= __put_user (s.freehigh, &info->freehigh);
2027 err |= __put_user (s.mem_unit, &info->mem_unit);
2034 sys32_sched_rr_get_interval (pid_t pid, struct compat_timespec *interval)
2036 mm_segment_t old_fs = get_fs();
2041 ret = sys_sched_rr_get_interval(pid, &t);
2043 if (put_compat_timespec(&t, interval))
2049 sys32_pread (unsigned int fd, void *buf, unsigned int count, u32 pos_lo, u32 pos_hi)
2051 return sys_pread64(fd, buf, count, ((unsigned long) pos_hi << 32) | pos_lo);
2055 sys32_pwrite (unsigned int fd, void *buf, unsigned int count, u32 pos_lo, u32 pos_hi)
2057 return sys_pwrite64(fd, buf, count, ((unsigned long) pos_hi << 32) | pos_lo);
2061 sys32_sendfile (int out_fd, int in_fd, int *offset, unsigned int count)
2063 mm_segment_t old_fs = get_fs();
2067 if (offset && get_user(of, offset))
2071 ret = sys_sendfile(out_fd, in_fd, offset ? &of : NULL, count);
2074 if (!ret && offset && put_user(of, offset))
2081 sys32_personality (unsigned int personality)
2085 if (current->personality == PER_LINUX32 && personality == PER_LINUX)
2086 personality = PER_LINUX32;
2087 ret = sys_personality(personality);
2088 if (ret == PER_LINUX32)
2093 asmlinkage unsigned long
2094 sys32_brk (unsigned int brk)
2096 unsigned long ret, obrk;
2097 struct mm_struct *mm = current->mm;
2102 clear_user((void *) ret, PAGE_ALIGN(ret) - ret);
2107 * Exactly like fs/open.c:sys_open(), except that it doesn't set the O_LARGEFILE flag.
2110 sys32_open (const char * filename, int flags, int mode)
2115 tmp = getname(filename);
2118 fd = get_unused_fd();
2120 struct file *f = filp_open(tmp, flags, mode);
2137 /* Structure for ia32 emulation on ia64 */
2138 struct epoll_event32
2145 sys32_epoll_ctl(int epfd, int op, int fd, struct epoll_event32 *event)
2147 mm_segment_t old_fs = get_fs();
2148 struct epoll_event event64;
2149 int error = -EFAULT;
2152 if ((error = verify_area(VERIFY_READ, event,
2153 sizeof(struct epoll_event32))))
2156 __get_user(event64.events, &event->events);
2157 __get_user(data_halfword, &event->data[0]);
2158 event64.data = data_halfword;
2159 __get_user(data_halfword, &event->data[1]);
2160 event64.data |= (u64)data_halfword << 32;
2163 error = sys_epoll_ctl(epfd, op, fd, &event64);
2170 sys32_epoll_wait(int epfd, struct epoll_event32 *events, int maxevents,
2173 struct epoll_event *events64 = NULL;
2174 mm_segment_t old_fs = get_fs();
2175 int error, numevents, size;
2177 int do_free_pages = 0;
2179 if (maxevents <= 0) {
2183 /* Verify that the area passed by the user is writeable */
2184 if ((error = verify_area(VERIFY_WRITE, events,
2185 maxevents * sizeof(struct epoll_event32))))
2189 * Allocate space for the intermediate copy. If the space needed
2190 * is large enough to cause kmalloc to fail, then try again with
2193 size = maxevents * sizeof(struct epoll_event);
2194 events64 = kmalloc(size, GFP_KERNEL);
2195 if (events64 == NULL) {
2196 events64 = (struct epoll_event *)
2197 __get_free_pages(GFP_KERNEL, get_order(size));
2198 if (events64 == NULL)
2203 /* Do the system call */
2204 set_fs(KERNEL_DS); /* copy_to/from_user should work on kernel mem*/
2205 numevents = sys_epoll_wait(epfd, events64, maxevents, timeout);
2208 /* Don't modify userspace memory if we're returning an error */
2209 if (numevents > 0) {
2210 /* Translate the 64-bit structures back into the 32-bit
2212 for (evt_idx = 0; evt_idx < numevents; evt_idx++) {
2213 __put_user(events64[evt_idx].events,
2214 &events[evt_idx].events);
2215 __put_user((u32)events64[evt_idx].data,
2216 &events[evt_idx].data[0]);
2217 __put_user((u32)(events64[evt_idx].data >> 32),
2218 &events[evt_idx].data[1]);
2223 free_pages((unsigned long) events64, get_order(size));
2230 * Get a yet unused TLS descriptor index.
2235 struct thread_struct *t = ¤t->thread;
2238 for (idx = 0; idx < GDT_ENTRY_TLS_ENTRIES; idx++)
2239 if (desc_empty(t->tls_array + idx))
2240 return idx + GDT_ENTRY_TLS_MIN;
2245 * Set a given TLS descriptor:
2248 sys32_set_thread_area (struct ia32_user_desc *u_info)
2250 struct thread_struct *t = ¤t->thread;
2251 struct ia32_user_desc info;
2252 struct desc_struct *desc;
2255 if (copy_from_user(&info, u_info, sizeof(info)))
2257 idx = info.entry_number;
2260 * index -1 means the kernel should try to find and allocate an empty descriptor:
2263 idx = get_free_idx();
2266 if (put_user(idx, &u_info->entry_number))
2270 if (idx < GDT_ENTRY_TLS_MIN || idx > GDT_ENTRY_TLS_MAX)
2273 desc = t->tls_array + idx - GDT_ENTRY_TLS_MIN;
2275 cpu = smp_processor_id();
2277 if (LDT_empty(&info)) {
2281 desc->a = LDT_entry_a(&info);
2282 desc->b = LDT_entry_b(&info);
2289 * Get the current Thread-Local Storage area:
2292 #define GET_BASE(desc) ( \
2293 (((desc)->a >> 16) & 0x0000ffff) | \
2294 (((desc)->b << 16) & 0x00ff0000) | \
2295 ( (desc)->b & 0xff000000) )
2297 #define GET_LIMIT(desc) ( \
2298 ((desc)->a & 0x0ffff) | \
2299 ((desc)->b & 0xf0000) )
2301 #define GET_32BIT(desc) (((desc)->b >> 23) & 1)
2302 #define GET_CONTENTS(desc) (((desc)->b >> 10) & 3)
2303 #define GET_WRITABLE(desc) (((desc)->b >> 9) & 1)
2304 #define GET_LIMIT_PAGES(desc) (((desc)->b >> 23) & 1)
2305 #define GET_PRESENT(desc) (((desc)->b >> 15) & 1)
2306 #define GET_USEABLE(desc) (((desc)->b >> 20) & 1)
2309 sys32_get_thread_area (struct ia32_user_desc *u_info)
2311 struct ia32_user_desc info;
2312 struct desc_struct *desc;
2315 if (get_user(idx, &u_info->entry_number))
2317 if (idx < GDT_ENTRY_TLS_MIN || idx > GDT_ENTRY_TLS_MAX)
2320 desc = current->thread.tls_array + idx - GDT_ENTRY_TLS_MIN;
2322 info.entry_number = idx;
2323 info.base_addr = GET_BASE(desc);
2324 info.limit = GET_LIMIT(desc);
2325 info.seg_32bit = GET_32BIT(desc);
2326 info.contents = GET_CONTENTS(desc);
2327 info.read_exec_only = !GET_WRITABLE(desc);
2328 info.limit_in_pages = GET_LIMIT_PAGES(desc);
2329 info.seg_not_present = !GET_PRESENT(desc);
2330 info.useable = GET_USEABLE(desc);
2332 if (copy_to_user(u_info, &info, sizeof(info)))
2337 extern asmlinkage long
2338 sys_timer_create(clockid_t which_clock, struct sigevent *timer_event_spec,
2339 timer_t * created_timer_id);
2342 sys32_timer_create(u32 clock, struct sigevent32 *se32, timer_t *timer_id)
2350 return sys_timer_create(clock, NULL, timer_id);
2352 memset(&se, 0, sizeof(struct sigevent));
2353 if (get_user(se.sigev_value.sival_int, &se32->sigev_value.sival_int) ||
2354 __get_user(se.sigev_signo, &se32->sigev_signo) ||
2355 __get_user(se.sigev_notify, &se32->sigev_notify) ||
2356 __copy_from_user(&se._sigev_un._pad, &se32->_sigev_un._pad,
2357 sizeof(se._sigev_un._pad)))
2360 if (!access_ok(VERIFY_WRITE,timer_id,sizeof(timer_t)))
2365 err = sys_timer_create(clock, &se, &t);
2369 err = __put_user (t, timer_id);
2374 long sys32_fadvise64_64(int fd, __u32 offset_low, __u32 offset_high,
2375 __u32 len_low, __u32 len_high, int advice)
2377 return sys_fadvise64_64(fd,
2378 (((u64)offset_high)<<32) | offset_low,
2379 (((u64)len_high)<<32) | len_low,
2383 #ifdef NOTYET /* UNTESTED FOR IA64 FROM HERE DOWN */
2385 asmlinkage long sys32_setreuid(compat_uid_t ruid, compat_uid_t euid)
2389 sruid = (ruid == (compat_uid_t)-1) ? ((uid_t)-1) : ((uid_t)ruid);
2390 seuid = (euid == (compat_uid_t)-1) ? ((uid_t)-1) : ((uid_t)euid);
2391 return sys_setreuid(sruid, seuid);
2395 sys32_setresuid(compat_uid_t ruid, compat_uid_t euid,
2398 uid_t sruid, seuid, ssuid;
2400 sruid = (ruid == (compat_uid_t)-1) ? ((uid_t)-1) : ((uid_t)ruid);
2401 seuid = (euid == (compat_uid_t)-1) ? ((uid_t)-1) : ((uid_t)euid);
2402 ssuid = (suid == (compat_uid_t)-1) ? ((uid_t)-1) : ((uid_t)suid);
2403 return sys_setresuid(sruid, seuid, ssuid);
2407 sys32_setregid(compat_gid_t rgid, compat_gid_t egid)
2411 srgid = (rgid == (compat_gid_t)-1) ? ((gid_t)-1) : ((gid_t)rgid);
2412 segid = (egid == (compat_gid_t)-1) ? ((gid_t)-1) : ((gid_t)egid);
2413 return sys_setregid(srgid, segid);
2417 sys32_setresgid(compat_gid_t rgid, compat_gid_t egid,
2420 gid_t srgid, segid, ssgid;
2422 srgid = (rgid == (compat_gid_t)-1) ? ((gid_t)-1) : ((gid_t)rgid);
2423 segid = (egid == (compat_gid_t)-1) ? ((gid_t)-1) : ((gid_t)egid);
2424 ssgid = (sgid == (compat_gid_t)-1) ? ((gid_t)-1) : ((gid_t)sgid);
2425 return sys_setresgid(srgid, segid, ssgid);
2428 /* Stuff for NFS server syscalls... */
2429 struct nfsctl_svc32 {
2434 struct nfsctl_client32 {
2435 s8 cl32_ident[NFSCLNT_IDMAX+1];
2437 struct in_addr cl32_addrlist[NFSCLNT_ADDRMAX];
2440 u8 cl32_fhkey[NFSCLNT_KEYMAX];
2443 struct nfsctl_export32 {
2444 s8 ex32_client[NFSCLNT_IDMAX+1];
2445 s8 ex32_path[NFS_MAXPATHLEN+1];
2446 compat_dev_t ex32_dev;
2447 compat_ino_t ex32_ino;
2449 compat_uid_t ex32_anon_uid;
2450 compat_gid_t ex32_anon_gid;
2453 struct nfsctl_arg32 {
2454 s32 ca32_version; /* safeguard */
2456 struct nfsctl_svc32 u32_svc;
2457 struct nfsctl_client32 u32_client;
2458 struct nfsctl_export32 u32_export;
2461 #define ca32_svc u.u32_svc
2462 #define ca32_client u.u32_client
2463 #define ca32_export u.u32_export
2464 #define ca32_debug u.u32_debug
2467 union nfsctl_res32 {
2468 struct knfs_fh cr32_getfh;
2473 nfs_svc32_trans(struct nfsctl_arg *karg, struct nfsctl_arg32 *arg32)
2477 err = __get_user(karg->ca_version, &arg32->ca32_version);
2478 err |= __get_user(karg->ca_svc.svc_port, &arg32->ca32_svc.svc32_port);
2479 err |= __get_user(karg->ca_svc.svc_nthreads,
2480 &arg32->ca32_svc.svc32_nthreads);
2485 nfs_clnt32_trans(struct nfsctl_arg *karg, struct nfsctl_arg32 *arg32)
2489 err = __get_user(karg->ca_version, &arg32->ca32_version);
2490 err |= copy_from_user(&karg->ca_client.cl_ident[0],
2491 &arg32->ca32_client.cl32_ident[0],
2493 err |= __get_user(karg->ca_client.cl_naddr,
2494 &arg32->ca32_client.cl32_naddr);
2495 err |= copy_from_user(&karg->ca_client.cl_addrlist[0],
2496 &arg32->ca32_client.cl32_addrlist[0],
2497 (sizeof(struct in_addr) * NFSCLNT_ADDRMAX));
2498 err |= __get_user(karg->ca_client.cl_fhkeytype,
2499 &arg32->ca32_client.cl32_fhkeytype);
2500 err |= __get_user(karg->ca_client.cl_fhkeylen,
2501 &arg32->ca32_client.cl32_fhkeylen);
2502 err |= copy_from_user(&karg->ca_client.cl_fhkey[0],
2503 &arg32->ca32_client.cl32_fhkey[0],
2509 nfs_exp32_trans(struct nfsctl_arg *karg, struct nfsctl_arg32 *arg32)
2513 err = __get_user(karg->ca_version, &arg32->ca32_version);
2514 err |= copy_from_user(&karg->ca_export.ex_client[0],
2515 &arg32->ca32_export.ex32_client[0],
2517 err |= copy_from_user(&karg->ca_export.ex_path[0],
2518 &arg32->ca32_export.ex32_path[0],
2520 err |= __get_user(karg->ca_export.ex_dev,
2521 &arg32->ca32_export.ex32_dev);
2522 err |= __get_user(karg->ca_export.ex_ino,
2523 &arg32->ca32_export.ex32_ino);
2524 err |= __get_user(karg->ca_export.ex_flags,
2525 &arg32->ca32_export.ex32_flags);
2526 err |= __get_user(karg->ca_export.ex_anon_uid,
2527 &arg32->ca32_export.ex32_anon_uid);
2528 err |= __get_user(karg->ca_export.ex_anon_gid,
2529 &arg32->ca32_export.ex32_anon_gid);
2534 nfs_getfh32_res_trans(union nfsctl_res *kres, union nfsctl_res32 *res32)
2538 err = copy_to_user(&res32->cr32_getfh,
2540 sizeof(res32->cr32_getfh));
2541 err |= __put_user(kres->cr_debug, &res32->cr32_debug);
2546 sys32_nfsservctl(int cmd, struct nfsctl_arg32 *arg32, union nfsctl_res32 *res32)
2548 struct nfsctl_arg *karg = NULL;
2549 union nfsctl_res *kres = NULL;
2553 karg = kmalloc(sizeof(*karg), GFP_USER);
2557 kres = kmalloc(sizeof(*kres), GFP_USER);
2565 err = nfs_svc32_trans(karg, arg32);
2567 case NFSCTL_ADDCLIENT:
2568 err = nfs_clnt32_trans(karg, arg32);
2570 case NFSCTL_DELCLIENT:
2571 err = nfs_clnt32_trans(karg, arg32);
2574 err = nfs_exp32_trans(karg, arg32);
2584 err = sys_nfsservctl(cmd, karg, kres);
2587 if(!err && cmd == NFSCTL_GETFS)
2588 err = nfs_getfh32_res_trans(kres, res32);
2598 /* Handle adjtimex compatibility. */
2602 s32 offset, freq, maxerror, esterror;
2603 s32 status, constant, precision, tolerance;
2604 struct compat_timeval time;
2606 s32 ppsfreq, jitter, shift, stabil;
2607 s32 jitcnt, calcnt, errcnt, stbcnt;
2608 s32 :32; s32 :32; s32 :32; s32 :32;
2609 s32 :32; s32 :32; s32 :32; s32 :32;
2610 s32 :32; s32 :32; s32 :32; s32 :32;
2613 extern int do_adjtimex(struct timex *);
2616 sys32_adjtimex(struct timex32 *utp)
2621 memset(&txc, 0, sizeof(struct timex));
2623 if(get_user(txc.modes, &utp->modes) ||
2624 __get_user(txc.offset, &utp->offset) ||
2625 __get_user(txc.freq, &utp->freq) ||
2626 __get_user(txc.maxerror, &utp->maxerror) ||
2627 __get_user(txc.esterror, &utp->esterror) ||
2628 __get_user(txc.status, &utp->status) ||
2629 __get_user(txc.constant, &utp->constant) ||
2630 __get_user(txc.precision, &utp->precision) ||
2631 __get_user(txc.tolerance, &utp->tolerance) ||
2632 __get_user(txc.time.tv_sec, &utp->time.tv_sec) ||
2633 __get_user(txc.time.tv_usec, &utp->time.tv_usec) ||
2634 __get_user(txc.tick, &utp->tick) ||
2635 __get_user(txc.ppsfreq, &utp->ppsfreq) ||
2636 __get_user(txc.jitter, &utp->jitter) ||
2637 __get_user(txc.shift, &utp->shift) ||
2638 __get_user(txc.stabil, &utp->stabil) ||
2639 __get_user(txc.jitcnt, &utp->jitcnt) ||
2640 __get_user(txc.calcnt, &utp->calcnt) ||
2641 __get_user(txc.errcnt, &utp->errcnt) ||
2642 __get_user(txc.stbcnt, &utp->stbcnt))
2645 ret = do_adjtimex(&txc);
2647 if(put_user(txc.modes, &utp->modes) ||
2648 __put_user(txc.offset, &utp->offset) ||
2649 __put_user(txc.freq, &utp->freq) ||
2650 __put_user(txc.maxerror, &utp->maxerror) ||
2651 __put_user(txc.esterror, &utp->esterror) ||
2652 __put_user(txc.status, &utp->status) ||
2653 __put_user(txc.constant, &utp->constant) ||
2654 __put_user(txc.precision, &utp->precision) ||
2655 __put_user(txc.tolerance, &utp->tolerance) ||
2656 __put_user(txc.time.tv_sec, &utp->time.tv_sec) ||
2657 __put_user(txc.time.tv_usec, &utp->time.tv_usec) ||
2658 __put_user(txc.tick, &utp->tick) ||
2659 __put_user(txc.ppsfreq, &utp->ppsfreq) ||
2660 __put_user(txc.jitter, &utp->jitter) ||
2661 __put_user(txc.shift, &utp->shift) ||
2662 __put_user(txc.stabil, &utp->stabil) ||
2663 __put_user(txc.jitcnt, &utp->jitcnt) ||
2664 __put_user(txc.calcnt, &utp->calcnt) ||
2665 __put_user(txc.errcnt, &utp->errcnt) ||
2666 __put_user(txc.stbcnt, &utp->stbcnt))