1 /* $Id: sys_sparc32.c,v 1.184 2002/02/09 19:49:31 davem Exp $
2 * sys_sparc32.c: Conversion between 32bit and 64bit native syscalls.
4 * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
5 * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
7 * These routines maintain argument size conversion between 32bit and 64bit
11 #include <linux/config.h>
12 #include <linux/kernel.h>
13 #include <linux/sched.h>
16 #include <linux/file.h>
17 #include <linux/signal.h>
18 #include <linux/resource.h>
19 #include <linux/times.h>
20 #include <linux/utsname.h>
21 #include <linux/timex.h>
22 #include <linux/smp.h>
23 #include <linux/smp_lock.h>
24 #include <linux/sem.h>
25 #include <linux/msg.h>
26 #include <linux/shm.h>
27 #include <linux/slab.h>
28 #include <linux/uio.h>
29 #include <linux/nfs_fs.h>
30 #include <linux/quota.h>
31 #include <linux/module.h>
32 #include <linux/sunrpc/svc.h>
33 #include <linux/nfsd/nfsd.h>
34 #include <linux/nfsd/cache.h>
35 #include <linux/nfsd/xdr.h>
36 #include <linux/nfsd/syscall.h>
37 #include <linux/poll.h>
38 #include <linux/personality.h>
39 #include <linux/stat.h>
40 #include <linux/filter.h>
41 #include <linux/highmem.h>
42 #include <linux/highuid.h>
43 #include <linux/mman.h>
44 #include <linux/ipv6.h>
46 #include <linux/icmpv6.h>
47 #include <linux/syscalls.h>
48 #include <linux/sysctl.h>
49 #include <linux/binfmts.h>
50 #include <linux/dnotify.h>
51 #include <linux/security.h>
52 #include <linux/compat.h>
53 #include <linux/vfs.h>
54 #include <linux/netfilter_ipv4/ip_tables.h>
55 #include <linux/ptrace.h>
56 #include <linux/highuid.h>
58 #include <asm/types.h>
60 #include <asm/uaccess.h>
61 #include <asm/fpumacro.h>
62 #include <asm/semaphore.h>
63 #include <asm/mmu_context.h>
65 /* Use this to get at 32-bit user passed pointers. */
66 /* Things to consider: the low-level assembly stub does
67 srl x, 0, x for first four arguments, so if you have
68 pointer to something in the first four arguments, just
69 declare it as a pointer, not u32. On the other side,
70 arguments from 5th onwards should be declared as u32
71 for pointers, and need AA() around each usage.
72 A() macro should be used for places where you e.g.
73 have some internal variable u32 and just want to get
74 rid of a compiler warning. AA() has to be used in
75 places where you want to convert a function argument
76 to 32bit pointer or when you e.g. access pt_regs
77 structure and want to consider 32bit registers only.
80 #define A(__x) ((unsigned long)(__x))
82 ({ unsigned long __ret; \
83 __asm__ ("srl %0, 0, %0" \
90 asmlinkage long sys32_chown16(const char __user * filename, u16 user, u16 group)
92 return sys_chown(filename, low2highuid(user), low2highgid(group));
95 asmlinkage long sys32_lchown16(const char __user * filename, u16 user, u16 group)
97 return sys_lchown(filename, low2highuid(user), low2highgid(group));
100 asmlinkage long sys32_fchown16(unsigned int fd, u16 user, u16 group)
102 return sys_fchown(fd, low2highuid(user), low2highgid(group));
105 asmlinkage long sys32_setregid16(u16 rgid, u16 egid)
107 return sys_setregid(low2highgid(rgid), low2highgid(egid));
110 asmlinkage long sys32_setgid16(u16 gid)
112 return sys_setgid((gid_t)gid);
115 asmlinkage long sys32_setreuid16(u16 ruid, u16 euid)
117 return sys_setreuid(low2highuid(ruid), low2highuid(euid));
120 asmlinkage long sys32_setuid16(u16 uid)
122 return sys_setuid((uid_t)uid);
125 asmlinkage long sys32_setresuid16(u16 ruid, u16 euid, u16 suid)
127 return sys_setresuid(low2highuid(ruid), low2highuid(euid),
131 asmlinkage long sys32_getresuid16(u16 __user *ruid, u16 __user *euid, u16 __user *suid)
135 if (!(retval = put_user(high2lowuid(current->uid), ruid)) &&
136 !(retval = put_user(high2lowuid(current->euid), euid)))
137 retval = put_user(high2lowuid(current->suid), suid);
142 asmlinkage long sys32_setresgid16(u16 rgid, u16 egid, u16 sgid)
144 return sys_setresgid(low2highgid(rgid), low2highgid(egid),
148 asmlinkage long sys32_getresgid16(u16 __user *rgid, u16 __user *egid, u16 __user *sgid)
152 if (!(retval = put_user(high2lowgid(current->gid), rgid)) &&
153 !(retval = put_user(high2lowgid(current->egid), egid)))
154 retval = put_user(high2lowgid(current->sgid), sgid);
159 asmlinkage long sys32_setfsuid16(u16 uid)
161 return sys_setfsuid((uid_t)uid);
164 asmlinkage long sys32_setfsgid16(u16 gid)
166 return sys_setfsgid((gid_t)gid);
169 static int groups16_to_user(u16 __user *grouplist, struct group_info *group_info)
174 for (i = 0; i < group_info->ngroups; i++) {
175 group = (u16)GROUP_AT(group_info, i);
176 if (put_user(group, grouplist+i))
183 static int groups16_from_user(struct group_info *group_info, u16 __user *grouplist)
188 for (i = 0; i < group_info->ngroups; i++) {
189 if (get_user(group, grouplist+i))
191 GROUP_AT(group_info, i) = (gid_t)group;
197 asmlinkage long sys32_getgroups16(int gidsetsize, u16 __user *grouplist)
204 get_group_info(current->group_info);
205 i = current->group_info->ngroups;
207 if (i > gidsetsize) {
211 if (groups16_to_user(grouplist, current->group_info)) {
217 put_group_info(current->group_info);
221 asmlinkage long sys32_setgroups16(int gidsetsize, u16 __user *grouplist)
223 struct group_info *group_info;
226 if (!capable(CAP_SETGID))
228 if ((unsigned)gidsetsize > NGROUPS_MAX)
231 group_info = groups_alloc(gidsetsize);
234 retval = groups16_from_user(group_info, grouplist);
236 put_group_info(group_info);
240 retval = set_current_groups(group_info);
241 put_group_info(group_info);
246 asmlinkage long sys32_getuid16(void)
248 return high2lowuid(current->uid);
251 asmlinkage long sys32_geteuid16(void)
253 return high2lowuid(current->euid);
256 asmlinkage long sys32_getgid16(void)
258 return high2lowgid(current->gid);
261 asmlinkage long sys32_getegid16(void)
263 return high2lowgid(current->egid);
266 /* 32-bit timeval and related flotsam. */
268 static long get_tv32(struct timeval *o, struct compat_timeval __user *i)
270 return (!access_ok(VERIFY_READ, tv32, sizeof(*tv32)) ||
271 (__get_user(o->tv_sec, &i->tv_sec) |
272 __get_user(o->tv_usec, &i->tv_usec)));
275 static inline long put_tv32(struct compat_timeval __user *o, struct timeval *i)
277 return (!access_ok(VERIFY_WRITE, o, sizeof(*o)) ||
278 (__put_user(i->tv_sec, &o->tv_sec) |
279 __put_user(i->tv_usec, &o->tv_usec)));
282 struct msgbuf32 { s32 mtype; char mtext[1]; };
296 struct ipc_perm32 sem_perm; /* permissions .. see ipc.h */
297 compat_time_t sem_otime; /* last semop time */
298 compat_time_t sem_ctime; /* last change time */
299 u32 sem_base; /* ptr to first semaphore in array */
300 u32 sem_pending; /* pending operations to be processed */
301 u32 sem_pending_last; /* last pending operation */
302 u32 undo; /* undo requests on this array */
303 unsigned short sem_nsems; /* no. of semaphores in array */
306 struct semid64_ds32 {
307 struct ipc64_perm sem_perm; /* this structure is the same on sparc32 and sparc64 */
309 compat_time_t sem_otime;
311 compat_time_t sem_ctime;
319 struct ipc_perm32 msg_perm;
322 compat_time_t msg_stime;
323 compat_time_t msg_rtime;
324 compat_time_t msg_ctime;
327 unsigned short msg_cbytes;
328 unsigned short msg_qnum;
329 unsigned short msg_qbytes;
330 compat_ipc_pid_t msg_lspid;
331 compat_ipc_pid_t msg_lrpid;
334 struct msqid64_ds32 {
335 struct ipc64_perm msg_perm;
337 compat_time_t msg_stime;
339 compat_time_t msg_rtime;
341 compat_time_t msg_ctime;
342 unsigned int msg_cbytes;
343 unsigned int msg_qnum;
344 unsigned int msg_qbytes;
345 compat_pid_t msg_lspid;
346 compat_pid_t msg_lrpid;
347 unsigned int __unused1;
348 unsigned int __unused2;
353 struct ipc_perm32 shm_perm;
355 compat_time_t shm_atime;
356 compat_time_t shm_dtime;
357 compat_time_t shm_ctime;
358 compat_ipc_pid_t shm_cpid;
359 compat_ipc_pid_t shm_lpid;
360 unsigned short shm_nattch;
363 struct shmid64_ds32 {
364 struct ipc64_perm shm_perm;
366 compat_time_t shm_atime;
368 compat_time_t shm_dtime;
370 compat_time_t shm_ctime;
371 compat_size_t shm_segsz;
372 compat_pid_t shm_cpid;
373 compat_pid_t shm_lpid;
374 unsigned int shm_nattch;
375 unsigned int __unused1;
376 unsigned int __unused2;
381 * sys32_ipc() is the de-multiplexer for the SysV IPC calls in 32bit emulation..
383 * This is really horribly ugly.
385 #define IPCOP_MASK(__x) (1UL << ((__x)&~IPC_64))
386 static int do_sys32_semctl(int first, int second, int third, void *uptr)
395 if (get_user (pad, (u32 __user *)uptr))
397 if ((third & ~IPC_64) == SETVAL)
398 fourth.val = (int)pad;
400 fourth.__pad = (void __user *)A(pad);
401 if (IPCOP_MASK (third) &
402 (IPCOP_MASK (IPC_INFO) | IPCOP_MASK (SEM_INFO) | IPCOP_MASK (GETVAL) |
403 IPCOP_MASK (GETPID) | IPCOP_MASK (GETNCNT) | IPCOP_MASK (GETZCNT) |
404 IPCOP_MASK (GETALL) | IPCOP_MASK (SETALL) | IPCOP_MASK (IPC_RMID))) {
405 err = sys_semctl (first, second, third, fourth);
406 } else if (third & IPC_64) {
408 struct semid64_ds32 __user *usp =
409 (struct semid64_ds32 __user *)A(pad);
411 int need_back_translation;
413 if (third == (IPC_SET|IPC_64)) {
414 err = get_user (s.sem_perm.uid, &usp->sem_perm.uid);
415 err |= __get_user (s.sem_perm.gid, &usp->sem_perm.gid);
416 err |= __get_user (s.sem_perm.mode, &usp->sem_perm.mode);
419 fourth.__pad = (void __user *) &s;
421 need_back_translation =
422 (IPCOP_MASK (third) &
423 (IPCOP_MASK (SEM_STAT) | IPCOP_MASK (IPC_STAT))) != 0;
424 if (need_back_translation)
425 fourth.__pad = (void __user *) &s;
428 err = sys_semctl (first, second, third, fourth);
430 if (need_back_translation) {
431 int err2 = copy_to_user (&usp->sem_perm, &s.sem_perm, sizeof(struct ipc64_perm) + 2*sizeof(time_t));
432 err2 |= __put_user (s.sem_nsems, &usp->sem_nsems);
433 if (err2) err = -EFAULT;
437 struct semid_ds32 __user *usp =
438 (struct semid_ds32 __user *)A(pad);
440 int need_back_translation;
442 if (third == IPC_SET) {
443 err = get_user (s.sem_perm.uid, &usp->sem_perm.uid);
444 err |= __get_user (s.sem_perm.gid, &usp->sem_perm.gid);
445 err |= __get_user (s.sem_perm.mode, &usp->sem_perm.mode);
448 fourth.__pad = (void __user *) &s;
450 need_back_translation =
451 (IPCOP_MASK (third) &
452 (IPCOP_MASK (SEM_STAT) | IPCOP_MASK (IPC_STAT))) != 0;
453 if (need_back_translation)
454 fourth.__pad = (void __user *) &s;
457 err = sys_semctl (first, second, third, fourth);
459 if (need_back_translation) {
460 int err2 = put_user (s.sem_perm.key, &usp->sem_perm.key);
461 err2 |= __put_user (high2lowuid(s.sem_perm.uid), &usp->sem_perm.uid);
462 err2 |= __put_user (high2lowgid(s.sem_perm.gid), &usp->sem_perm.gid);
463 err2 |= __put_user (high2lowuid(s.sem_perm.cuid), &usp->sem_perm.cuid);
464 err2 |= __put_user (high2lowgid(s.sem_perm.cgid), &usp->sem_perm.cgid);
465 err2 |= __put_user (s.sem_perm.mode, &usp->sem_perm.mode);
466 err2 |= __put_user (s.sem_perm.seq, &usp->sem_perm.seq);
467 err2 |= __put_user (s.sem_otime, &usp->sem_otime);
468 err2 |= __put_user (s.sem_ctime, &usp->sem_ctime);
469 err2 |= __put_user (s.sem_nsems, &usp->sem_nsems);
470 if (err2) err = -EFAULT;
477 static int do_sys32_msgsnd (int first, int second, int third, void *uptr)
479 struct msgbuf *p = kmalloc (second + sizeof (struct msgbuf), GFP_USER);
480 struct msgbuf32 __user *up = (struct msgbuf32 __user *) uptr;
487 if (get_user (p->mtype, &up->mtype) ||
488 __copy_from_user (p->mtext, &up->mtext, second))
492 err = sys_msgsnd (first, (struct msgbuf __user *) p, second, third);
499 static int do_sys32_msgrcv (int first, int second, int msgtyp, int third,
500 int version, void *uptr)
502 struct msgbuf32 __user *up;
508 struct ipc_kludge __user *uipck =
509 (struct ipc_kludge __user *) uptr;
510 struct ipc_kludge ipck;
516 if (copy_from_user (&ipck, uipck, sizeof (struct ipc_kludge)))
518 uptr = (void *)A(ipck.msgp);
519 msgtyp = ipck.msgtyp;
522 p = kmalloc (second + sizeof (struct msgbuf), GFP_USER);
527 err = sys_msgrcv (first, (struct msgbuf __user *) p, second,
532 up = (struct msgbuf32 __user *) uptr;
533 if (put_user (p->mtype, &up->mtype) ||
534 __copy_to_user (&up->mtext, p->mtext, err))
542 static int do_sys32_msgctl (int first, int second, void *uptr)
546 if (IPCOP_MASK (second) &
547 (IPCOP_MASK (IPC_INFO) | IPCOP_MASK (MSG_INFO) |
548 IPCOP_MASK (IPC_RMID))) {
549 err = sys_msgctl (first, second,
550 (struct msqid_ds __user *)uptr);
551 } else if (second & IPC_64) {
553 struct msqid64_ds32 __user *up =
554 (struct msqid64_ds32 __user *) uptr;
557 if (second == (IPC_SET|IPC_64)) {
558 err = get_user (m.msg_perm.uid, &up->msg_perm.uid);
559 err |= __get_user (m.msg_perm.gid, &up->msg_perm.gid);
560 err |= __get_user (m.msg_perm.mode, &up->msg_perm.mode);
561 err |= __get_user (m.msg_qbytes, &up->msg_qbytes);
567 err = sys_msgctl (first, second, (struct msqid_ds __user *)&m);
569 if (IPCOP_MASK (second) &
570 (IPCOP_MASK (MSG_STAT) | IPCOP_MASK (IPC_STAT))) {
571 int err2 = copy_to_user(&up->msg_perm, &m.msg_perm, sizeof(struct ipc64_perm) + 3*sizeof(time_t));
572 err2 |= __put_user (m.msg_cbytes, &up->msg_cbytes);
573 err2 |= __put_user (m.msg_qnum, &up->msg_qnum);
574 err2 |= __put_user (m.msg_qbytes, &up->msg_qbytes);
575 err2 |= __put_user (m.msg_lspid, &up->msg_lspid);
576 err2 |= __put_user (m.msg_lrpid, &up->msg_lrpid);
582 struct msqid_ds32 __user *up =
583 (struct msqid_ds32 __user *)uptr;
586 if (second == IPC_SET) {
587 err = get_user (m.msg_perm.uid, &up->msg_perm.uid);
588 err |= __get_user (m.msg_perm.gid, &up->msg_perm.gid);
589 err |= __get_user (m.msg_perm.mode, &up->msg_perm.mode);
590 err |= __get_user (m.msg_qbytes, &up->msg_qbytes);
596 err = sys_msgctl (first, second, (struct msqid_ds __user *) &m);
598 if (IPCOP_MASK (second) &
599 (IPCOP_MASK (MSG_STAT) | IPCOP_MASK (IPC_STAT))) {
600 int err2 = put_user (m.msg_perm.key, &up->msg_perm.key);
601 err2 |= __put_user (high2lowuid(m.msg_perm.uid), &up->msg_perm.uid);
602 err2 |= __put_user (high2lowgid(m.msg_perm.gid), &up->msg_perm.gid);
603 err2 |= __put_user (high2lowuid(m.msg_perm.cuid), &up->msg_perm.cuid);
604 err2 |= __put_user (high2lowgid(m.msg_perm.cgid), &up->msg_perm.cgid);
605 err2 |= __put_user (m.msg_perm.mode, &up->msg_perm.mode);
606 err2 |= __put_user (m.msg_perm.seq, &up->msg_perm.seq);
607 err2 |= __put_user (m.msg_stime, &up->msg_stime);
608 err2 |= __put_user (m.msg_rtime, &up->msg_rtime);
609 err2 |= __put_user (m.msg_ctime, &up->msg_ctime);
610 err2 |= __put_user (m.msg_cbytes, &up->msg_cbytes);
611 err2 |= __put_user (m.msg_qnum, &up->msg_qnum);
612 err2 |= __put_user (m.msg_qbytes, &up->msg_qbytes);
613 err2 |= __put_user (m.msg_lspid, &up->msg_lspid);
614 err2 |= __put_user (m.msg_lrpid, &up->msg_lrpid);
624 static int do_sys32_shmat (int first, int second, int third, int version, void __user *uptr)
627 u32 __user *uaddr = (u32 __user *)A((u32)third);
632 err = do_shmat (first, uptr, second, &raddr);
635 err = put_user (raddr, uaddr);
640 static int do_sys32_shmctl (int first, int second, void *uptr)
644 if (IPCOP_MASK (second) &
645 (IPCOP_MASK (IPC_INFO) | IPCOP_MASK (SHM_LOCK) | IPCOP_MASK (SHM_UNLOCK) |
646 IPCOP_MASK (IPC_RMID))) {
647 if (second == (IPC_INFO|IPC_64))
648 second = IPC_INFO; /* So that we don't have to translate it */
649 err = sys_shmctl (first, second,
650 (struct shmid_ds __user *) uptr);
651 } else if ((second & IPC_64) && second != (SHM_INFO|IPC_64)) {
653 struct shmid64_ds32 __user *up =
654 (struct shmid64_ds32 __user *) uptr;
657 if (second == (IPC_SET|IPC_64)) {
658 err = get_user (s.shm_perm.uid, &up->shm_perm.uid);
659 err |= __get_user (s.shm_perm.gid, &up->shm_perm.gid);
660 err |= __get_user (s.shm_perm.mode, &up->shm_perm.mode);
666 err = sys_shmctl (first, second, (struct shmid_ds __user *)&s);
671 /* Mask it even in this case so it becomes a CSE. */
672 if (IPCOP_MASK (second) &
673 (IPCOP_MASK (SHM_STAT) | IPCOP_MASK (IPC_STAT))) {
674 int err2 = copy_to_user (&up->shm_perm, &s.shm_perm, sizeof(struct ipc64_perm) + 3*sizeof(time_t));
675 err2 |= __put_user (s.shm_segsz, &up->shm_segsz);
676 err2 |= __put_user (s.shm_nattch, &up->shm_nattch);
677 err2 |= __put_user (s.shm_cpid, &up->shm_cpid);
678 err2 |= __put_user (s.shm_lpid, &up->shm_lpid);
684 struct shmid_ds32 __user *up =
685 (struct shmid_ds32 __user *) uptr;
689 if (second == IPC_SET) {
690 err = get_user (s.shm_perm.uid, &up->shm_perm.uid);
691 err |= __get_user (s.shm_perm.gid, &up->shm_perm.gid);
692 err |= __get_user (s.shm_perm.mode, &up->shm_perm.mode);
698 err = sys_shmctl (first, second, (struct shmid_ds __user *) &s);
703 /* Mask it even in this case so it becomes a CSE. */
704 if (second == SHM_INFO) {
707 u32 shm_tot, shm_rss, shm_swp;
708 u32 swap_attempts, swap_successes;
710 struct shm_info32 __user *uip =
711 (struct shm_info32 __user *) uptr;
712 struct shm_info *kp = (struct shm_info *)&s;
713 int err2 = put_user (kp->used_ids, &uip->used_ids);
714 err2 |= __put_user (kp->shm_tot, &uip->shm_tot);
715 err2 |= __put_user (kp->shm_rss, &uip->shm_rss);
716 err2 |= __put_user (kp->shm_swp, &uip->shm_swp);
717 err2 |= __put_user (kp->swap_attempts, &uip->swap_attempts);
718 err2 |= __put_user (kp->swap_successes, &uip->swap_successes);
721 } else if (IPCOP_MASK (second) &
722 (IPCOP_MASK (SHM_STAT) | IPCOP_MASK (IPC_STAT))) {
723 int err2 = put_user (s.shm_perm.key, &up->shm_perm.key);
724 err2 |= __put_user (high2lowuid(s.shm_perm.uid), &up->shm_perm.uid);
725 err2 |= __put_user (high2lowuid(s.shm_perm.gid), &up->shm_perm.gid);
726 err2 |= __put_user (high2lowuid(s.shm_perm.cuid), &up->shm_perm.cuid);
727 err2 |= __put_user (high2lowuid(s.shm_perm.cgid), &up->shm_perm.cgid);
728 err2 |= __put_user (s.shm_perm.mode, &up->shm_perm.mode);
729 err2 |= __put_user (s.shm_perm.seq, &up->shm_perm.seq);
730 err2 |= __put_user (s.shm_atime, &up->shm_atime);
731 err2 |= __put_user (s.shm_dtime, &up->shm_dtime);
732 err2 |= __put_user (s.shm_ctime, &up->shm_ctime);
733 err2 |= __put_user (s.shm_segsz, &up->shm_segsz);
734 err2 |= __put_user (s.shm_nattch, &up->shm_nattch);
735 err2 |= __put_user (s.shm_cpid, &up->shm_cpid);
736 err2 |= __put_user (s.shm_lpid, &up->shm_lpid);
745 static int sys32_semtimedop(int semid, struct sembuf __user *tsems, int nsems,
746 const struct compat_timespec __user *timeout32)
748 struct compat_timespec t32;
749 struct timespec __user *t64 = compat_alloc_user_space(sizeof(*t64));
751 if (copy_from_user(&t32, timeout32, sizeof(t32)))
754 if (put_user(t32.tv_sec, &t64->tv_sec) ||
755 put_user(t32.tv_nsec, &t64->tv_nsec))
758 return sys_semtimedop(semid, tsems, nsems, t64);
761 asmlinkage int sys32_ipc (u32 call, int first, int second, int third, u32 ptr, u32 fifth)
765 version = call >> 16; /* hack for backward compatibility */
771 /* struct sembuf is the same on 32 and 64bit :)) */
772 err = sys_semtimedop (first, (struct sembuf __user *)AA(ptr), second, NULL);
775 err = sys32_semtimedop (first, (struct sembuf __user *)AA(ptr), second, (const struct compat_timespec __user *) AA(fifth));
777 err = sys_semget (first, second, third);
780 err = do_sys32_semctl (first, second, third, (void *)AA(ptr));
789 err = do_sys32_msgsnd (first, second, third, (void *)AA(ptr));
792 err = do_sys32_msgrcv (first, second, fifth, third,
793 version, (void *)AA(ptr));
796 err = sys_msgget ((key_t) first, second);
799 err = do_sys32_msgctl (first, second, (void *)AA(ptr));
808 err = do_sys32_shmat (first, second, third,
809 version, (void __user *)AA(ptr));
812 err = sys_shmdt ((char __user *)AA(ptr));
815 err = sys_shmget (first, second, third);
818 err = do_sys32_shmctl (first, second, (void *)AA(ptr));
831 asmlinkage int sys32_truncate64(const char __user * path, unsigned long high, unsigned long low)
836 return sys_truncate(path, (high << 32) | low);
839 asmlinkage int sys32_ftruncate64(unsigned int fd, unsigned long high, unsigned long low)
844 return sys_ftruncate(fd, (high << 32) | low);
847 /* readdir & getdents */
849 #define NAME_OFFSET(de) ((int) ((de)->d_name - (char __user *) (de)))
850 #define ROUND_UP(x) (((x)+sizeof(u32)-1) & ~(sizeof(u32)-1))
852 struct old_linux_dirent32 {
855 unsigned short d_namlen;
859 struct readdir_callback32 {
860 struct old_linux_dirent32 __user * dirent;
864 static int fillonedir(void * __buf, const char * name, int namlen,
865 loff_t offset, ino_t ino, unsigned int d_type)
867 struct readdir_callback32 * buf = (struct readdir_callback32 *) __buf;
868 struct old_linux_dirent32 __user * dirent;
873 dirent = buf->dirent;
874 put_user(ino, &dirent->d_ino);
875 put_user(offset, &dirent->d_offset);
876 put_user(namlen, &dirent->d_namlen);
877 copy_to_user(dirent->d_name, name, namlen);
878 put_user(0, dirent->d_name + namlen);
882 asmlinkage int old32_readdir(unsigned int fd, struct old_linux_dirent32 __user *dirent, unsigned int count)
886 struct readdir_callback32 buf;
895 error = vfs_readdir(file, fillonedir, &buf);
906 struct linux_dirent32 {
909 unsigned short d_reclen;
913 struct getdents_callback32 {
914 struct linux_dirent32 __user *current_dir;
915 struct linux_dirent32 __user *previous;
920 static int filldir(void * __buf, const char * name, int namlen, loff_t offset, ino_t ino,
923 struct linux_dirent32 __user * dirent;
924 struct getdents_callback32 * buf = (struct getdents_callback32 *) __buf;
925 int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 2);
927 buf->error = -EINVAL; /* only used if we fail.. */
928 if (reclen > buf->count)
930 dirent = buf->previous;
932 put_user(offset, &dirent->d_off);
933 dirent = buf->current_dir;
934 buf->previous = dirent;
935 put_user(ino, &dirent->d_ino);
936 put_user(reclen, &dirent->d_reclen);
937 copy_to_user(dirent->d_name, name, namlen);
938 put_user(0, dirent->d_name + namlen);
939 put_user(d_type, (char __user *) dirent + reclen - 1);
940 dirent = (void __user *) dirent + reclen;
941 buf->current_dir = dirent;
942 buf->count -= reclen;
946 asmlinkage int sys32_getdents(unsigned int fd, struct linux_dirent32 __user *dirent, unsigned int count)
949 struct linux_dirent32 __user *lastdirent;
950 struct getdents_callback32 buf;
957 buf.current_dir = dirent;
962 error = vfs_readdir(file, filldir, &buf);
965 lastdirent = buf.previous;
968 put_user(file->f_pos, &lastdirent->d_off);
969 error = count - buf.count;
977 /* end of readdir & getdents */
979 int cp_compat_stat(struct kstat *stat, struct compat_stat __user *statbuf)
983 if (stat->size > MAX_NON_LFS || !old_valid_dev(stat->dev) ||
984 !old_valid_dev(stat->rdev))
987 err = put_user(old_encode_dev(stat->dev), &statbuf->st_dev);
988 err |= put_user(stat->ino, &statbuf->st_ino);
989 err |= put_user(stat->mode, &statbuf->st_mode);
990 err |= put_user(stat->nlink, &statbuf->st_nlink);
991 err |= put_user(high2lowuid(stat->uid), &statbuf->st_uid);
992 err |= put_user(high2lowgid(stat->gid), &statbuf->st_gid);
993 err |= put_user(old_encode_dev(stat->rdev), &statbuf->st_rdev);
994 err |= put_user(stat->size, &statbuf->st_size);
995 err |= put_user(stat->atime.tv_sec, &statbuf->st_atime);
996 err |= put_user(0, &statbuf->__unused1);
997 err |= put_user(stat->mtime.tv_sec, &statbuf->st_mtime);
998 err |= put_user(0, &statbuf->__unused2);
999 err |= put_user(stat->ctime.tv_sec, &statbuf->st_ctime);
1000 err |= put_user(0, &statbuf->__unused3);
1001 err |= put_user(stat->blksize, &statbuf->st_blksize);
1002 err |= put_user(stat->blocks, &statbuf->st_blocks);
1003 err |= put_user(0, &statbuf->__unused4[0]);
1004 err |= put_user(0, &statbuf->__unused4[1]);
1009 asmlinkage int sys32_sysfs(int option, u32 arg1, u32 arg2)
1011 return sys_sysfs(option, arg1, arg2);
1023 unsigned short procs;
1028 char _f[20-2*sizeof(int)-sizeof(int)];
1031 asmlinkage int sys32_sysinfo(struct sysinfo32 __user *info)
1036 mm_segment_t old_fs = get_fs ();
1039 ret = sys_sysinfo((struct sysinfo __user *) &s);
1041 /* Check to see if any memory value is too large for 32-bit and
1042 * scale down if needed.
1044 if ((s.totalram >> 32) || (s.totalswap >> 32)) {
1045 while (s.mem_unit < PAGE_SIZE) {
1049 s.totalram >>= bitcount;
1050 s.freeram >>= bitcount;
1051 s.sharedram >>= bitcount;
1052 s.bufferram >>= bitcount;
1053 s.totalswap >>= bitcount;
1054 s.freeswap >>= bitcount;
1055 s.totalhigh >>= bitcount;
1056 s.freehigh >>= bitcount;
1059 err = put_user (s.uptime, &info->uptime);
1060 err |= __put_user (s.loads[0], &info->loads[0]);
1061 err |= __put_user (s.loads[1], &info->loads[1]);
1062 err |= __put_user (s.loads[2], &info->loads[2]);
1063 err |= __put_user (s.totalram, &info->totalram);
1064 err |= __put_user (s.freeram, &info->freeram);
1065 err |= __put_user (s.sharedram, &info->sharedram);
1066 err |= __put_user (s.bufferram, &info->bufferram);
1067 err |= __put_user (s.totalswap, &info->totalswap);
1068 err |= __put_user (s.freeswap, &info->freeswap);
1069 err |= __put_user (s.procs, &info->procs);
1070 err |= __put_user (s.totalhigh, &info->totalhigh);
1071 err |= __put_user (s.freehigh, &info->freehigh);
1072 err |= __put_user (s.mem_unit, &info->mem_unit);
1078 asmlinkage int sys32_sched_rr_get_interval(compat_pid_t pid, struct compat_timespec __user *interval)
1082 mm_segment_t old_fs = get_fs ();
1085 ret = sys_sched_rr_get_interval(pid, (struct timespec __user *) &t);
1087 if (put_compat_timespec(&t, interval))
1092 asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t __user *set, compat_sigset_t __user *oset, compat_size_t sigsetsize)
1095 compat_sigset_t s32;
1097 mm_segment_t old_fs = get_fs();
1100 if (copy_from_user (&s32, set, sizeof(compat_sigset_t)))
1102 switch (_NSIG_WORDS) {
1103 case 4: s.sig[3] = s32.sig[6] | (((long)s32.sig[7]) << 32);
1104 case 3: s.sig[2] = s32.sig[4] | (((long)s32.sig[5]) << 32);
1105 case 2: s.sig[1] = s32.sig[2] | (((long)s32.sig[3]) << 32);
1106 case 1: s.sig[0] = s32.sig[0] | (((long)s32.sig[1]) << 32);
1110 ret = sys_rt_sigprocmask(how,
1111 set ? (sigset_t __user *) &s : NULL,
1112 oset ? (sigset_t __user *) &s : NULL,
1115 if (ret) return ret;
1117 switch (_NSIG_WORDS) {
1118 case 4: s32.sig[7] = (s.sig[3] >> 32); s32.sig[6] = s.sig[3];
1119 case 3: s32.sig[5] = (s.sig[2] >> 32); s32.sig[4] = s.sig[2];
1120 case 2: s32.sig[3] = (s.sig[1] >> 32); s32.sig[2] = s.sig[1];
1121 case 1: s32.sig[1] = (s.sig[0] >> 32); s32.sig[0] = s.sig[0];
1123 if (copy_to_user (oset, &s32, sizeof(compat_sigset_t)))
1129 asmlinkage int sys32_rt_sigpending(compat_sigset_t __user *set, compat_size_t sigsetsize)
1132 compat_sigset_t s32;
1134 mm_segment_t old_fs = get_fs();
1137 ret = sys_rt_sigpending((sigset_t __user *) &s, sigsetsize);
1140 switch (_NSIG_WORDS) {
1141 case 4: s32.sig[7] = (s.sig[3] >> 32); s32.sig[6] = s.sig[3];
1142 case 3: s32.sig[5] = (s.sig[2] >> 32); s32.sig[4] = s.sig[2];
1143 case 2: s32.sig[3] = (s.sig[1] >> 32); s32.sig[2] = s.sig[1];
1144 case 1: s32.sig[1] = (s.sig[0] >> 32); s32.sig[0] = s.sig[0];
1146 if (copy_to_user (set, &s32, sizeof(compat_sigset_t)))
1153 sys32_rt_sigtimedwait(compat_sigset_t __user *uthese, siginfo_t32 __user *uinfo,
1154 struct compat_timespec __user *uts,
1155 compat_size_t sigsetsize)
1159 compat_sigset_t these32;
1164 /* XXX: Don't preclude handling different sized sigset_t's. */
1165 if (sigsetsize != sizeof(sigset_t))
1168 if (copy_from_user (&these32, uthese, sizeof(compat_sigset_t)))
1171 switch (_NSIG_WORDS) {
1172 case 4: these.sig[3] = these32.sig[6] | (((long)these32.sig[7]) << 32);
1173 case 3: these.sig[2] = these32.sig[4] | (((long)these32.sig[5]) << 32);
1174 case 2: these.sig[1] = these32.sig[2] | (((long)these32.sig[3]) << 32);
1175 case 1: these.sig[0] = these32.sig[0] | (((long)these32.sig[1]) << 32);
1179 * Invert the set of allowed signals to get those we
1182 sigdelsetmask(&these, sigmask(SIGKILL)|sigmask(SIGSTOP));
1186 if (get_compat_timespec(&ts, uts))
1188 if (ts.tv_nsec >= 1000000000L || ts.tv_nsec < 0
1193 spin_lock_irq(¤t->sighand->siglock);
1194 sig = dequeue_signal(current, &these, &info);
1196 timeout = MAX_SCHEDULE_TIMEOUT;
1198 timeout = (timespec_to_jiffies(&ts)
1199 + (ts.tv_sec || ts.tv_nsec));
1202 /* None ready -- temporarily unblock those we're
1203 * interested while we are sleeping in so that we'll
1204 * be awakened when they arrive. */
1205 current->real_blocked = current->blocked;
1206 sigandsets(¤t->blocked, ¤t->blocked, &these);
1207 recalc_sigpending();
1208 spin_unlock_irq(¤t->sighand->siglock);
1210 current->state = TASK_INTERRUPTIBLE;
1211 timeout = schedule_timeout(timeout);
1213 spin_lock_irq(¤t->sighand->siglock);
1214 sig = dequeue_signal(current, &these, &info);
1215 current->blocked = current->real_blocked;
1216 siginitset(¤t->real_blocked, 0);
1217 recalc_sigpending();
1220 spin_unlock_irq(¤t->sighand->siglock);
1225 if (copy_siginfo_to_user32(uinfo, &info))
1238 sys32_rt_sigqueueinfo(int pid, int sig, siginfo_t32 __user *uinfo)
1242 mm_segment_t old_fs = get_fs();
1244 if (copy_from_user (&info, uinfo, 3*sizeof(int)) ||
1245 copy_from_user (info._sifields._pad, uinfo->_sifields._pad, SI_PAD_SIZE))
1248 ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __user *) &info);
1253 asmlinkage int sys32_sigaction (int sig, struct old_sigaction32 __user *act,
1254 struct old_sigaction32 __user *oact)
1256 struct k_sigaction new_ka, old_ka;
1260 set_thread_flag(TIF_NEWSIGNALS);
1265 compat_old_sigset_t mask;
1266 u32 u_handler, u_restorer;
1268 ret = get_user(u_handler, &act->sa_handler);
1269 new_ka.sa.sa_handler = (void *) (long) u_handler;
1270 ret |= __get_user(u_restorer, &act->sa_restorer);
1271 new_ka.sa.sa_restorer = (void *) (long) u_restorer;
1272 ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
1273 ret |= __get_user(mask, &act->sa_mask);
1276 new_ka.ka_restorer = NULL;
1277 siginitset(&new_ka.sa.sa_mask, mask);
1280 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
1283 ret = put_user((long)old_ka.sa.sa_handler, &oact->sa_handler);
1284 ret |= __put_user((long)old_ka.sa.sa_restorer, &oact->sa_restorer);
1285 ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
1286 ret |= __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
1293 sys32_rt_sigaction(int sig, struct sigaction32 __user *act,
1294 struct sigaction32 __user *oact,
1295 void __user *restorer, compat_size_t sigsetsize)
1297 struct k_sigaction new_ka, old_ka;
1299 compat_sigset_t set32;
1301 /* XXX: Don't preclude handling different sized sigset_t's. */
1302 if (sigsetsize != sizeof(compat_sigset_t))
1305 /* All tasks which use RT signals (effectively) use
1306 * new style signals.
1308 set_thread_flag(TIF_NEWSIGNALS);
1311 u32 u_handler, u_restorer;
1313 new_ka.ka_restorer = restorer;
1314 ret = get_user(u_handler, &act->sa_handler);
1315 new_ka.sa.sa_handler = (void *) (long) u_handler;
1316 ret |= __copy_from_user(&set32, &act->sa_mask, sizeof(compat_sigset_t));
1317 switch (_NSIG_WORDS) {
1318 case 4: new_ka.sa.sa_mask.sig[3] = set32.sig[6] | (((long)set32.sig[7]) << 32);
1319 case 3: new_ka.sa.sa_mask.sig[2] = set32.sig[4] | (((long)set32.sig[5]) << 32);
1320 case 2: new_ka.sa.sa_mask.sig[1] = set32.sig[2] | (((long)set32.sig[3]) << 32);
1321 case 1: new_ka.sa.sa_mask.sig[0] = set32.sig[0] | (((long)set32.sig[1]) << 32);
1323 ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
1324 ret |= __get_user(u_restorer, &act->sa_restorer);
1325 new_ka.sa.sa_restorer = (void *) (long) u_restorer;
1330 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
1333 switch (_NSIG_WORDS) {
1334 case 4: set32.sig[7] = (old_ka.sa.sa_mask.sig[3] >> 32); set32.sig[6] = old_ka.sa.sa_mask.sig[3];
1335 case 3: set32.sig[5] = (old_ka.sa.sa_mask.sig[2] >> 32); set32.sig[4] = old_ka.sa.sa_mask.sig[2];
1336 case 2: set32.sig[3] = (old_ka.sa.sa_mask.sig[1] >> 32); set32.sig[2] = old_ka.sa.sa_mask.sig[1];
1337 case 1: set32.sig[1] = (old_ka.sa.sa_mask.sig[0] >> 32); set32.sig[0] = old_ka.sa.sa_mask.sig[0];
1339 ret = put_user((long)old_ka.sa.sa_handler, &oact->sa_handler);
1340 ret |= __copy_to_user(&oact->sa_mask, &set32, sizeof(compat_sigset_t));
1341 ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
1342 ret |= __put_user((long)old_ka.sa.sa_restorer, &oact->sa_restorer);
1351 * sparc32_execve() executes a new program after the asm stub has set
1352 * things up for us. This should basically do what I want it to.
1354 asmlinkage int sparc32_execve(struct pt_regs *regs)
1356 int error, base = 0;
1359 /* User register window flush is done by entry.S */
1361 /* Check for indirect call. */
1362 if((u32)regs->u_regs[UREG_G1] == 0)
1365 filename = getname((char __user *)AA(regs->u_regs[base + UREG_I0]));
1366 error = PTR_ERR(filename);
1367 if(IS_ERR(filename))
1369 error = compat_do_execve(filename,
1370 compat_ptr((u32)regs->u_regs[base + UREG_I1]),
1371 compat_ptr((u32)regs->u_regs[base + UREG_I2]), regs);
1376 current_thread_info()->xfsr[0] = 0;
1377 current_thread_info()->fpsaved[0] = 0;
1378 regs->tstate &= ~TSTATE_PEF;
1379 current->ptrace &= ~PT_DTRACE;
1385 #ifdef CONFIG_MODULES
1387 asmlinkage int sys32_init_module(void __user *umod, u32 len,
1388 const char __user *uargs)
1390 return sys_init_module(umod, len, uargs);
1393 asmlinkage int sys32_delete_module(const char __user *name_user,
1396 return sys_delete_module(name_user, flags);
1399 #else /* CONFIG_MODULES */
1402 sys32_init_module(const char *name_user, struct module *mod_user)
1408 sys32_delete_module(const char *name_user)
1413 #endif /* CONFIG_MODULES */
1415 /* Translations due to time_t size differences. Which affects all
1416 sorts of things, like timeval and itimerval. */
1418 extern struct timezone sys_tz;
1420 asmlinkage int sys32_gettimeofday(struct compat_timeval __user *tv,
1421 struct timezone __user *tz)
1425 do_gettimeofday(&ktv);
1426 if (put_tv32(tv, &ktv))
1430 if (copy_to_user(tz, &sys_tz, sizeof(sys_tz)))
1436 static inline long get_ts32(struct timespec *o, struct compat_timeval __user *i)
1440 if (!access_ok(VERIFY_READ, i, sizeof(*i)))
1442 if (__get_user(o->tv_sec, &i->tv_sec))
1444 if (__get_user(usec, &i->tv_usec))
1446 o->tv_nsec = usec * 1000;
1450 asmlinkage int sys32_settimeofday(struct compat_timeval __user *tv,
1451 struct timezone __user *tz)
1453 struct timespec kts;
1454 struct timezone ktz;
1457 if (get_ts32(&kts, tv))
1461 if (copy_from_user(&ktz, tz, sizeof(ktz)))
1465 return do_sys_settimeofday(tv ? &kts : NULL, tz ? &ktz : NULL);
1468 asmlinkage int sys32_utimes(char __user *filename,
1469 struct compat_timeval __user *tvs)
1471 struct timeval ktvs[2];
1474 if (get_tv32(&ktvs[0], tvs) ||
1475 get_tv32(&ktvs[1], 1+tvs))
1479 return do_utimes(filename, (tvs ? &ktvs[0] : NULL));
1482 /* These are here just in case some old sparc32 binary calls it. */
1483 asmlinkage int sys32_pause(void)
1485 current->state = TASK_INTERRUPTIBLE;
1487 return -ERESTARTNOHAND;
1490 /* PCI config space poking. */
1492 asmlinkage int sys32_pciconfig_read(u32 bus, u32 dfn, u32 off, u32 len, u32 ubuf)
1494 return sys_pciconfig_read((unsigned long) bus,
1495 (unsigned long) dfn,
1496 (unsigned long) off,
1497 (unsigned long) len,
1498 (unsigned char __user *)AA(ubuf));
1501 asmlinkage int sys32_pciconfig_write(u32 bus, u32 dfn, u32 off, u32 len, u32 ubuf)
1503 return sys_pciconfig_write((unsigned long) bus,
1504 (unsigned long) dfn,
1505 (unsigned long) off,
1506 (unsigned long) len,
1507 (unsigned char __user *)AA(ubuf));
1510 asmlinkage int sys32_prctl(int option, u32 arg2, u32 arg3, u32 arg4, u32 arg5)
1512 return sys_prctl(option,
1513 (unsigned long) arg2,
1514 (unsigned long) arg3,
1515 (unsigned long) arg4,
1516 (unsigned long) arg5);
1520 asmlinkage compat_ssize_t sys32_pread64(unsigned int fd, char __user *ubuf,
1521 compat_size_t count,
1522 u32 poshi, u32 poslo)
1524 return sys_pread64(fd, ubuf, count,
1525 ((loff_t)AA(poshi) << 32) | AA(poslo));
1528 asmlinkage compat_ssize_t sys32_pwrite64(unsigned int fd, char __user *ubuf,
1529 compat_size_t count, u32 poshi, u32 poslo)
1531 return sys_pwrite64(fd, ubuf, count, ((loff_t)AA(poshi) << 32) | AA(poslo));
1534 asmlinkage compat_ssize_t sys32_readahead(int fd, u32 offhi, u32 offlo, s32 count)
1536 return sys_readahead(fd, ((loff_t)AA(offhi) << 32) | AA(offlo), count);
1539 long sys32_fadvise64(int fd, u32 offhi, u32 offlo, s32 len, int advice)
1541 return sys_fadvise64_64(fd, ((loff_t)AA(offhi)<<32)|AA(offlo), len, advice);
1544 long sys32_fadvise64_64(int fd, u32 offhi, u32 offlo, u32 lenhi, u32 lenlo, int advice)
1546 return sys_fadvise64_64(fd, ((loff_t)AA(offhi)<<32)|AA(offlo),
1547 ((loff_t)AA(lenhi)<<32)|AA(lenlo), advice);
1550 asmlinkage int sys32_sendfile(int out_fd, int in_fd, compat_off_t __user *offset, s32 count)
1552 mm_segment_t old_fs = get_fs();
1556 if (offset && get_user(of, offset))
1560 ret = sys_sendfile(out_fd, in_fd,
1561 offset ? (off_t __user *) &of : NULL,
1565 if (offset && put_user(of, offset))
1571 asmlinkage int sys32_sendfile64(int out_fd, int in_fd, compat_loff_t __user *offset, s32 count)
1573 mm_segment_t old_fs = get_fs();
1577 if (offset && get_user(lof, offset))
1581 ret = sys_sendfile64(out_fd, in_fd,
1582 offset ? (loff_t __user *) &lof : NULL,
1586 if (offset && put_user(lof, offset))
1592 /* Handle adjtimex compatibility. */
1596 s32 offset, freq, maxerror, esterror;
1597 s32 status, constant, precision, tolerance;
1598 struct compat_timeval time;
1600 s32 ppsfreq, jitter, shift, stabil;
1601 s32 jitcnt, calcnt, errcnt, stbcnt;
1602 s32 :32; s32 :32; s32 :32; s32 :32;
1603 s32 :32; s32 :32; s32 :32; s32 :32;
1604 s32 :32; s32 :32; s32 :32; s32 :32;
1607 extern int do_adjtimex(struct timex *);
1609 asmlinkage int sys32_adjtimex(struct timex32 __user *utp)
1614 memset(&txc, 0, sizeof(struct timex));
1616 if(get_user(txc.modes, &utp->modes) ||
1617 __get_user(txc.offset, &utp->offset) ||
1618 __get_user(txc.freq, &utp->freq) ||
1619 __get_user(txc.maxerror, &utp->maxerror) ||
1620 __get_user(txc.esterror, &utp->esterror) ||
1621 __get_user(txc.status, &utp->status) ||
1622 __get_user(txc.constant, &utp->constant) ||
1623 __get_user(txc.precision, &utp->precision) ||
1624 __get_user(txc.tolerance, &utp->tolerance) ||
1625 __get_user(txc.time.tv_sec, &utp->time.tv_sec) ||
1626 __get_user(txc.time.tv_usec, &utp->time.tv_usec) ||
1627 __get_user(txc.tick, &utp->tick) ||
1628 __get_user(txc.ppsfreq, &utp->ppsfreq) ||
1629 __get_user(txc.jitter, &utp->jitter) ||
1630 __get_user(txc.shift, &utp->shift) ||
1631 __get_user(txc.stabil, &utp->stabil) ||
1632 __get_user(txc.jitcnt, &utp->jitcnt) ||
1633 __get_user(txc.calcnt, &utp->calcnt) ||
1634 __get_user(txc.errcnt, &utp->errcnt) ||
1635 __get_user(txc.stbcnt, &utp->stbcnt))
1638 ret = do_adjtimex(&txc);
1640 if(put_user(txc.modes, &utp->modes) ||
1641 __put_user(txc.offset, &utp->offset) ||
1642 __put_user(txc.freq, &utp->freq) ||
1643 __put_user(txc.maxerror, &utp->maxerror) ||
1644 __put_user(txc.esterror, &utp->esterror) ||
1645 __put_user(txc.status, &utp->status) ||
1646 __put_user(txc.constant, &utp->constant) ||
1647 __put_user(txc.precision, &utp->precision) ||
1648 __put_user(txc.tolerance, &utp->tolerance) ||
1649 __put_user(txc.time.tv_sec, &utp->time.tv_sec) ||
1650 __put_user(txc.time.tv_usec, &utp->time.tv_usec) ||
1651 __put_user(txc.tick, &utp->tick) ||
1652 __put_user(txc.ppsfreq, &utp->ppsfreq) ||
1653 __put_user(txc.jitter, &utp->jitter) ||
1654 __put_user(txc.shift, &utp->shift) ||
1655 __put_user(txc.stabil, &utp->stabil) ||
1656 __put_user(txc.jitcnt, &utp->jitcnt) ||
1657 __put_user(txc.calcnt, &utp->calcnt) ||
1658 __put_user(txc.errcnt, &utp->errcnt) ||
1659 __put_user(txc.stbcnt, &utp->stbcnt))
1665 /* This is just a version for 32-bit applications which does
1666 * not force O_LARGEFILE on.
1669 asmlinkage long sparc32_open(const char __user *filename, int flags, int mode)
1674 tmp = getname(filename);
1677 fd = get_unused_fd();
1679 struct file * f = filp_open(tmp, flags, mode);
1696 extern unsigned long do_mremap(unsigned long addr,
1697 unsigned long old_len, unsigned long new_len,
1698 unsigned long flags, unsigned long new_addr);
1700 asmlinkage unsigned long sys32_mremap(unsigned long addr,
1701 unsigned long old_len, unsigned long new_len,
1702 unsigned long flags, u32 __new_addr)
1704 struct vm_area_struct *vma;
1705 unsigned long ret = -EINVAL;
1706 unsigned long new_addr = AA(__new_addr);
1708 if (old_len > 0xf0000000UL || new_len > 0xf0000000UL)
1710 if (addr > 0xf0000000UL - old_len)
1712 down_write(¤t->mm->mmap_sem);
1713 if (flags & MREMAP_FIXED) {
1714 if (new_addr > 0xf0000000UL - new_len)
1716 } else if (addr > 0xf0000000UL - new_len) {
1717 unsigned long map_flags = 0;
1718 struct file *file = NULL;
1721 if (!(flags & MREMAP_MAYMOVE))
1724 vma = find_vma(current->mm, addr);
1726 if (vma->vm_flags & VM_SHARED)
1727 map_flags |= MAP_SHARED;
1728 file = vma->vm_file;
1731 /* MREMAP_FIXED checked above. */
1732 new_addr = get_unmapped_area(file, addr, new_len,
1733 vma ? vma->vm_pgoff : 0,
1734 map_flags, vma->vm_flags & VM_EXEC);
1736 if (new_addr & ~PAGE_MASK)
1738 flags |= MREMAP_FIXED;
1740 ret = do_mremap(addr, old_len, new_len, flags, new_addr);
1742 up_write(¤t->mm->mmap_sem);
1747 asmlinkage int sys_setpriority32(u32 which, u32 who, u32 niceval)
1749 return sys_setpriority((int) which,
1754 struct __sysctl_args32 {
1764 asmlinkage long sys32_sysctl(struct __sysctl_args32 __user *args)
1766 #ifndef CONFIG_SYSCTL
1769 struct __sysctl_args32 tmp;
1771 size_t oldlen, __user *oldlenp = NULL;
1772 unsigned long addr = (((unsigned long)&args->__unused[0]) + 7UL) & ~7UL;
1774 if (copy_from_user(&tmp, args, sizeof(tmp)))
1777 if (tmp.oldval && tmp.oldlenp) {
1778 /* Duh, this is ugly and might not work if sysctl_args
1779 is in read-only memory, but do_sysctl does indirectly
1780 a lot of uaccess in both directions and we'd have to
1781 basically copy the whole sysctl.c here, and
1782 glibc's __sysctl uses rw memory for the structure
1784 if (get_user(oldlen, (u32 __user *)A(tmp.oldlenp)) ||
1785 put_user(oldlen, (size_t __user *)addr))
1787 oldlenp = (size_t __user *)addr;
1791 error = do_sysctl((int __user *)A(tmp.name), tmp.nlen,
1792 (void __user *)A(tmp.oldval),
1793 oldlenp, (void __user *)A(tmp.newval), tmp.newlen);
1797 if (get_user(oldlen, (size_t __user *)addr) ||
1798 put_user(oldlen, (u32 __user *)A(tmp.oldlenp)))
1801 copy_to_user(args->__unused, tmp.__unused, sizeof(tmp.__unused));
1807 long sys32_lookup_dcookie(u32 cookie_high, u32 cookie_low,
1808 char __user *buf, size_t len)
1810 return sys_lookup_dcookie((u64)cookie_high << 32 | cookie_low,
1814 extern asmlinkage long
1815 sys_timer_create(clockid_t which_clock,
1816 struct sigevent __user *timer_event_spec,
1817 timer_t __user *created_timer_id);
1820 sys32_timer_create(u32 clock, struct sigevent32 __user *se32,
1821 timer_t __user *timer_id)
1829 return sys_timer_create(clock, NULL, timer_id);
1831 memset(&se, 0, sizeof(struct sigevent));
1832 if (get_user(se.sigev_value.sival_int, &se32->sigev_value.sival_int) ||
1833 __get_user(se.sigev_signo, &se32->sigev_signo) ||
1834 __get_user(se.sigev_notify, &se32->sigev_notify) ||
1835 __copy_from_user(&se._sigev_un._pad, &se32->_sigev_un._pad,
1836 sizeof(se._sigev_un._pad)))
1839 if (!access_ok(VERIFY_WRITE,timer_id,sizeof(timer_t)))
1844 err = sys_timer_create(clock,
1845 (struct sigevent __user *) &se,
1846 (timer_t __user *) &t);
1850 err = __put_user (t, timer_id);