X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fmips%2Fkernel%2Flinux32.c;fp=arch%2Fmips%2Fkernel%2Flinux32.c;h=b98d13492125d2f4245af0969d00dfb271d6aea5;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=2d5c90282976909f7bfd8eb8ea0805eedce2e842;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c index 2d5c90282..b98d13492 100644 --- a/arch/mips/kernel/linux32.c +++ b/arch/mips/kernel/linux32.c @@ -5,6 +5,7 @@ * Written by Ulf Carlsson (ulfc@engr.sgi.com) * sys32_execve from ia64/ia32 code, Feb 2000, Kanoj Sarcar (kanoj@sgi.com) */ +#include #include #include #include @@ -29,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -68,7 +70,7 @@ * Revalidate the inode. This is required for proper NFS attribute caching. */ -int cp_compat_stat(struct kstat *stat, struct compat_stat __user *statbuf) +int cp_compat_stat(struct kstat *stat, struct compat_stat *statbuf) { struct compat_stat tmp; @@ -78,8 +80,6 @@ int cp_compat_stat(struct kstat *stat, struct compat_stat __user *statbuf) memset(&tmp, 0, sizeof(tmp)); tmp.st_dev = new_encode_dev(stat->dev); tmp.st_ino = stat->ino; - if (sizeof(tmp.st_ino) < sizeof(stat->ino) && tmp.st_ino != stat->ino) - return -EOVERFLOW; tmp.st_mode = stat->mode; tmp.st_nlink = stat->nlink; SET_UID(tmp.st_uid, stat->uid); @@ -107,10 +107,6 @@ sys32_mmap2(unsigned long addr, unsigned long len, unsigned long prot, unsigned long error; error = -EINVAL; - if (pgoff & (~PAGE_MASK >> 12)) - goto out; - pgoff >>= PAGE_SHIFT-12; - if (!(flags & MAP_ANONYMOUS)) { error = -EBADF; file = fget(fd); @@ -130,7 +126,7 @@ out: } -asmlinkage int sys_truncate64(const char __user *path, unsigned int high, +asmlinkage int sys_truncate64(const char *path, unsigned int high, unsigned int low) { if ((int)high < 0) @@ -166,6 +162,12 @@ out: return error; } +asmlinkage int +sys32_waitpid(compat_pid_t pid, unsigned int *stat_addr, int options) +{ + return compat_sys_wait4(pid, stat_addr, options, NULL); +} + asmlinkage long sysn32_waitid(int which, compat_pid_t pid, siginfo_t __user *uinfo, int options, @@ -174,7 +176,6 @@ sysn32_waitid(int which, compat_pid_t pid, struct rusage ru; long ret; mm_segment_t old_fs = get_fs(); - int si_signo; if (!access_ok(VERIFY_WRITE, uinfo, sizeof(*uinfo))) return -EFAULT; @@ -184,9 +185,7 @@ sysn32_waitid(int which, compat_pid_t pid, uru ? (struct rusage __user *) &ru : NULL); set_fs (old_fs); - if (__get_user(si_signo, &uinfo->si_signo)) - return -EFAULT; - if (ret < 0 || si_signo == 0) + if (ret < 0 || uinfo->si_signo == 0) return ret; if (uru) @@ -210,14 +209,14 @@ struct sysinfo32 { char _f[8]; }; -asmlinkage int sys32_sysinfo(struct sysinfo32 __user *info) +asmlinkage int sys32_sysinfo(struct sysinfo32 *info) { struct sysinfo s; int ret, err; mm_segment_t old_fs = get_fs (); set_fs (KERNEL_DS); - ret = sys_sysinfo((struct sysinfo __user *)&s); + ret = sys_sysinfo(&s); set_fs (old_fs); err = put_user (s.uptime, &info->uptime); err |= __put_user (s.loads[0], &info->loads[0]); @@ -247,11 +246,11 @@ struct rlimit32 { }; #ifdef __MIPSEB__ -asmlinkage long sys32_truncate64(const char __user * path, unsigned long __dummy, +asmlinkage long sys32_truncate64(const char * path, unsigned long __dummy, int length_hi, int length_lo) #endif #ifdef __MIPSEL__ -asmlinkage long sys32_truncate64(const char __user * path, unsigned long __dummy, +asmlinkage long sys32_truncate64(const char * path, unsigned long __dummy, int length_lo, int length_hi) #endif { @@ -279,7 +278,7 @@ asmlinkage long sys32_ftruncate64(unsigned int fd, unsigned long __dummy, } static inline long -get_tv32(struct timeval *o, struct compat_timeval __user *i) +get_tv32(struct timeval *o, struct compat_timeval *i) { return (!access_ok(VERIFY_READ, i, sizeof(*i)) || (__get_user(o->tv_sec, &i->tv_sec) | @@ -287,7 +286,7 @@ get_tv32(struct timeval *o, struct compat_timeval __user *i) } static inline long -put_tv32(struct compat_timeval __user *o, struct timeval *i) +put_tv32(struct compat_timeval *o, struct timeval *i) { return (!access_ok(VERIFY_WRITE, o, sizeof(*o)) || (__put_user(i->tv_sec, &o->tv_sec) | @@ -297,7 +296,7 @@ put_tv32(struct compat_timeval __user *o, struct timeval *i) extern struct timezone sys_tz; asmlinkage int -sys32_gettimeofday(struct compat_timeval __user *tv, struct timezone __user *tz) +sys32_gettimeofday(struct compat_timeval *tv, struct timezone *tz) { if (tv) { struct timeval ktv; @@ -312,7 +311,7 @@ sys32_gettimeofday(struct compat_timeval __user *tv, struct timezone __user *tz) return 0; } -static inline long get_ts32(struct timespec *o, struct compat_timeval __user *i) +static inline long get_ts32(struct timespec *o, struct compat_timeval *i) { long usec; @@ -327,7 +326,7 @@ static inline long get_ts32(struct timespec *o, struct compat_timeval __user *i) } asmlinkage int -sys32_settimeofday(struct compat_timeval __user *tv, struct timezone __user *tz) +sys32_settimeofday(struct compat_timeval *tv, struct timezone *tz) { struct timespec kts; struct timezone ktz; @@ -345,7 +344,7 @@ sys32_settimeofday(struct compat_timeval __user *tv, struct timezone __user *tz) } asmlinkage int sys32_llseek(unsigned int fd, unsigned int offset_high, - unsigned int offset_low, loff_t __user * result, + unsigned int offset_low, loff_t * result, unsigned int origin) { return sys_llseek(fd, offset_high, offset_low, result, origin); @@ -355,27 +354,87 @@ asmlinkage int sys32_llseek(unsigned int fd, unsigned int offset_high, lseek back to original location. They fail just like lseek does on non-seekable files. */ -asmlinkage ssize_t sys32_pread(unsigned int fd, char __user * buf, +asmlinkage ssize_t sys32_pread(unsigned int fd, char * buf, size_t count, u32 unused, u64 a4, u64 a5) { - return sys_pread64(fd, buf, count, merge_64(a4, a5)); + ssize_t ret; + struct file * file; + ssize_t (*read)(struct file *, char *, size_t, loff_t *); + loff_t pos; + + ret = -EBADF; + file = fget(fd); + if (!file) + goto bad_file; + if (!(file->f_mode & FMODE_READ)) + goto out; + pos = merge_64(a4, a5); + ret = rw_verify_area(READ, file, &pos, count); + if (ret < 0) + goto out; + ret = -EINVAL; + if (!file->f_op || !(read = file->f_op->read)) + goto out; + if (pos < 0) + goto out; + ret = -ESPIPE; + if (!(file->f_mode & FMODE_PREAD)) + goto out; + ret = read(file, buf, count, &pos); + if (ret > 0) + dnotify_parent(file->f_dentry, DN_ACCESS); +out: + fput(file); +bad_file: + return ret; } -asmlinkage ssize_t sys32_pwrite(unsigned int fd, const char __user * buf, +asmlinkage ssize_t sys32_pwrite(unsigned int fd, const char * buf, size_t count, u32 unused, u64 a4, u64 a5) { - return sys_pwrite64(fd, buf, count, merge_64(a4, a5)); + ssize_t ret; + struct file * file; + ssize_t (*write)(struct file *, const char *, size_t, loff_t *); + loff_t pos; + + ret = -EBADF; + file = fget(fd); + if (!file) + goto bad_file; + if (!(file->f_mode & FMODE_WRITE)) + goto out; + pos = merge_64(a4, a5); + ret = rw_verify_area(WRITE, file, &pos, count); + if (ret < 0) + goto out; + ret = -EINVAL; + if (!file->f_op || !(write = file->f_op->write)) + goto out; + if (pos < 0) + goto out; + + ret = -ESPIPE; + if (!(file->f_mode & FMODE_PWRITE)) + goto out; + + ret = write(file, buf, count, &pos); + if (ret > 0) + dnotify_parent(file->f_dentry, DN_MODIFY); +out: + fput(file); +bad_file: + return ret; } asmlinkage int sys32_sched_rr_get_interval(compat_pid_t pid, - struct compat_timespec __user *interval) + struct compat_timespec *interval) { struct timespec t; int ret; mm_segment_t old_fs = get_fs (); set_fs (KERNEL_DS); - ret = sys_sched_rr_get_interval(pid, (struct timespec __user *)&t); + ret = sys_sched_rr_get_interval(pid, &t); set_fs (old_fs); if (put_user (t.tv_sec, &interval->tv_sec) || __put_user (t.tv_nsec, &interval->tv_nsec)) @@ -493,7 +552,7 @@ struct ipc_kludge32 { }; static int -do_sys32_semctl(int first, int second, int third, void __user *uptr) +do_sys32_semctl(int first, int second, int third, void *uptr) { union semun fourth; u32 pad; @@ -504,12 +563,12 @@ do_sys32_semctl(int first, int second, int third, void __user *uptr) if (!uptr) return -EINVAL; err = -EFAULT; - if (get_user (pad, (u32 __user *)uptr)) + if (get_user (pad, (u32 *)uptr)) return err; if ((third & ~IPC_64) == SETVAL) fourth.val = (int)pad; else - fourth.__pad = (void __user *)A(pad); + fourth.__pad = (void *)A(pad); switch (third & ~IPC_64) { case IPC_INFO: case IPC_RMID: @@ -527,14 +586,14 @@ do_sys32_semctl(int first, int second, int third, void __user *uptr) case IPC_STAT: case SEM_STAT: - fourth.__pad = (struct semid64_ds __user *)&s; + fourth.__pad = &s; old_fs = get_fs(); set_fs(KERNEL_DS); err = sys_semctl(first, second, third | IPC_64, fourth); set_fs(old_fs); if (third & IPC_64) { - struct semid64_ds32 __user *usp64 = (struct semid64_ds32 __user *) A(pad); + struct semid64_ds32 *usp64 = (struct semid64_ds32 *) A(pad); if (!access_ok(VERIFY_WRITE, usp64, sizeof(*usp64))) { err = -EFAULT; @@ -551,7 +610,7 @@ do_sys32_semctl(int first, int second, int third, void __user *uptr) err2 |= __put_user(s.sem_ctime, &usp64->sem_ctime); err2 |= __put_user(s.sem_nsems, &usp64->sem_nsems); } else { - struct semid_ds32 __user *usp32 = (struct semid_ds32 __user *) A(pad); + struct semid_ds32 *usp32 = (struct semid_ds32 *) A(pad); if (!access_ok(VERIFY_WRITE, usp32, sizeof(*usp32))) { err = -EFAULT; @@ -581,9 +640,9 @@ do_sys32_semctl(int first, int second, int third, void __user *uptr) } static int -do_sys32_msgsnd (int first, int second, int third, void __user *uptr) +do_sys32_msgsnd (int first, int second, int third, void *uptr) { - struct msgbuf32 __user *up = (struct msgbuf32 __user *)uptr; + struct msgbuf32 *up = (struct msgbuf32 *)uptr; struct msgbuf *p; mm_segment_t old_fs; int err; @@ -602,7 +661,7 @@ do_sys32_msgsnd (int first, int second, int third, void __user *uptr) goto out; old_fs = get_fs (); set_fs (KERNEL_DS); - err = sys_msgsnd (first, (struct msgbuf __user *)p, second, third); + err = sys_msgsnd (first, p, second, third); set_fs (old_fs); out: kfree (p); @@ -612,15 +671,15 @@ out: static int do_sys32_msgrcv (int first, int second, int msgtyp, int third, - int version, void __user *uptr) + int version, void *uptr) { - struct msgbuf32 __user *up; + struct msgbuf32 *up; struct msgbuf *p; mm_segment_t old_fs; int err; if (!version) { - struct ipc_kludge32 __user *uipck = (struct ipc_kludge32 __user *)uptr; + struct ipc_kludge32 *uipck = (struct ipc_kludge32 *)uptr; struct ipc_kludge32 ipck; err = -EINVAL; @@ -629,7 +688,7 @@ do_sys32_msgrcv (int first, int second, int msgtyp, int third, err = -EFAULT; if (copy_from_user (&ipck, uipck, sizeof (struct ipc_kludge32))) goto out; - uptr = (void __user *)AA(ipck.msgp); + uptr = (void *)AA(ipck.msgp); msgtyp = ipck.msgtyp; } @@ -641,11 +700,11 @@ do_sys32_msgrcv (int first, int second, int msgtyp, int third, goto out; old_fs = get_fs (); set_fs (KERNEL_DS); - err = sys_msgrcv (first, (struct msgbuf __user *)p, second + 4, msgtyp, third); + err = sys_msgrcv (first, p, second + 4, msgtyp, third); set_fs (old_fs); if (err < 0) goto free_then_out; - up = (struct msgbuf32 __user *)uptr; + up = (struct msgbuf32 *)uptr; if (put_user (p->mtype, &up->mtype) || __copy_to_user (&up->mtext, p->mtext, err)) err = -EFAULT; @@ -656,19 +715,19 @@ out: } static int -do_sys32_msgctl (int first, int second, void __user *uptr) +do_sys32_msgctl (int first, int second, void *uptr) { int err = -EINVAL, err2; struct msqid64_ds m; - struct msqid_ds32 __user *up32 = (struct msqid_ds32 __user *)uptr; - struct msqid64_ds32 __user *up64 = (struct msqid64_ds32 __user *)uptr; + struct msqid_ds32 *up32 = (struct msqid_ds32 *)uptr; + struct msqid64_ds32 *up64 = (struct msqid64_ds32 *)uptr; mm_segment_t old_fs; switch (second & ~IPC_64) { case IPC_INFO: case IPC_RMID: case MSG_INFO: - err = sys_msgctl (first, second, (struct msqid_ds __user *)uptr); + err = sys_msgctl (first, second, (struct msqid_ds *)uptr); break; case IPC_SET: @@ -695,7 +754,7 @@ do_sys32_msgctl (int first, int second, void __user *uptr) break; old_fs = get_fs(); set_fs(KERNEL_DS); - err = sys_msgctl(first, second | IPC_64, (struct msqid_ds __user *)&m); + err = sys_msgctl(first, second | IPC_64, (struct msqid_ds *)&m); set_fs(old_fs); break; @@ -703,7 +762,7 @@ do_sys32_msgctl (int first, int second, void __user *uptr) case MSG_STAT: old_fs = get_fs(); set_fs(KERNEL_DS); - err = sys_msgctl(first, second | IPC_64, (struct msqid_ds __user *)&m); + err = sys_msgctl(first, second | IPC_64, (struct msqid_ds *)&m); set_fs(old_fs); if (second & IPC_64) { if (!access_ok(VERIFY_WRITE, up64, sizeof(*up64))) { @@ -757,10 +816,10 @@ do_sys32_msgctl (int first, int second, void __user *uptr) } static int -do_sys32_shmat (int first, int second, int third, int version, void __user *uptr) +do_sys32_shmat (int first, int second, int third, int version, void *uptr) { unsigned long raddr; - u32 __user *uaddr = (u32 __user *)A((u32)third); + u32 *uaddr = (u32 *)A((u32)third); int err = -EINVAL; if (version == 1) @@ -779,11 +838,11 @@ struct shm_info32 { }; static int -do_sys32_shmctl (int first, int second, void __user *uptr) +do_sys32_shmctl (int first, int second, void *uptr) { - struct shmid64_ds32 __user *up64 = (struct shmid64_ds32 __user *)uptr; - struct shmid_ds32 __user *up32 = (struct shmid_ds32 __user *)uptr; - struct shm_info32 __user *uip = (struct shm_info32 __user *)uptr; + struct shmid64_ds32 *up64 = (struct shmid64_ds32 *)uptr; + struct shmid_ds32 *up32 = (struct shmid_ds32 *)uptr; + struct shm_info32 *uip = (struct shm_info32 *)uptr; int err = -EFAULT, err2; struct shmid64_ds s64; mm_segment_t old_fs; @@ -796,7 +855,7 @@ do_sys32_shmctl (int first, int second, void __user *uptr) case IPC_RMID: case SHM_LOCK: case SHM_UNLOCK: - err = sys_shmctl(first, second, (struct shmid_ds __user *)uptr); + err = sys_shmctl(first, second, (struct shmid_ds *)uptr); break; case IPC_SET: if (second & IPC_64) { @@ -812,7 +871,7 @@ do_sys32_shmctl (int first, int second, void __user *uptr) break; old_fs = get_fs(); set_fs(KERNEL_DS); - err = sys_shmctl(first, second & ~IPC_64, (struct shmid_ds __user *)&s); + err = sys_shmctl(first, second & ~IPC_64, &s); set_fs(old_fs); break; @@ -820,7 +879,7 @@ do_sys32_shmctl (int first, int second, void __user *uptr) case SHM_STAT: old_fs = get_fs(); set_fs(KERNEL_DS); - err = sys_shmctl(first, second | IPC_64, (void __user *) &s64); + err = sys_shmctl(first, second | IPC_64, (void *) &s64); set_fs(old_fs); if (err < 0) break; @@ -870,7 +929,7 @@ do_sys32_shmctl (int first, int second, void __user *uptr) case SHM_INFO: old_fs = get_fs(); set_fs(KERNEL_DS); - err = sys_shmctl(first, second, (void __user *)&si); + err = sys_shmctl(first, second, (void *)&si); set_fs(old_fs); if (err < 0) break; @@ -892,11 +951,11 @@ do_sys32_shmctl (int first, int second, void __user *uptr) return err; } -static int sys32_semtimedop(int semid, struct sembuf __user *tsems, int nsems, - const struct compat_timespec __user *timeout32) +static int sys32_semtimedop(int semid, struct sembuf *tsems, int nsems, + const struct compat_timespec *timeout32) { struct compat_timespec t32; - struct timespec __user *t64 = compat_alloc_user_space(sizeof(*t64)); + struct timespec *t64 = compat_alloc_user_space(sizeof(*t64)); if (copy_from_user(&t32, timeout32, sizeof(t32))) return -EFAULT; @@ -919,11 +978,11 @@ sys32_ipc (u32 call, int first, int second, int third, u32 ptr, u32 fifth) switch (call) { case SEMOP: /* struct sembuf is the same on 32 and 64bit :)) */ - err = sys_semtimedop (first, (struct sembuf __user *)AA(ptr), second, + err = sys_semtimedop (first, (struct sembuf *)AA(ptr), second, NULL); break; case SEMTIMEDOP: - err = sys32_semtimedop (first, (struct sembuf __user *)AA(ptr), second, + err = sys32_semtimedop (first, (struct sembuf *)AA(ptr), second, (const struct compat_timespec __user *)AA(fifth)); break; case SEMGET: @@ -931,36 +990,36 @@ sys32_ipc (u32 call, int first, int second, int third, u32 ptr, u32 fifth) break; case SEMCTL: err = do_sys32_semctl (first, second, third, - (void __user *)AA(ptr)); + (void *)AA(ptr)); break; case MSGSND: err = do_sys32_msgsnd (first, second, third, - (void __user *)AA(ptr)); + (void *)AA(ptr)); break; case MSGRCV: err = do_sys32_msgrcv (first, second, fifth, third, - version, (void __user *)AA(ptr)); + version, (void *)AA(ptr)); break; case MSGGET: err = sys_msgget ((key_t) first, second); break; case MSGCTL: - err = do_sys32_msgctl (first, second, (void __user *)AA(ptr)); + err = do_sys32_msgctl (first, second, (void *)AA(ptr)); break; case SHMAT: err = do_sys32_shmat (first, second, third, - version, (void __user *)AA(ptr)); + version, (void *)AA(ptr)); break; case SHMDT: - err = sys_shmdt ((char __user *)A(ptr)); + err = sys_shmdt ((char *)A(ptr)); break; case SHMGET: err = sys_shmget (first, (unsigned)second, third); break; case SHMCTL: - err = do_sys32_shmctl (first, second, (void __user *)AA(ptr)); + err = do_sys32_shmctl (first, second, (void *)AA(ptr)); break; default: err = -EINVAL; @@ -971,7 +1030,7 @@ sys32_ipc (u32 call, int first, int second, int third, u32 ptr, u32 fifth) } asmlinkage long sys32_shmat(int shmid, char __user *shmaddr, - int shmflg, int32_t __user *addr) + int shmflg, int32_t *addr) { unsigned long raddr; int err; @@ -996,13 +1055,12 @@ struct sysctl_args32 #ifdef CONFIG_SYSCTL -asmlinkage long sys32_sysctl(struct sysctl_args32 __user *args) +asmlinkage long sys32_sysctl(struct sysctl_args32 *args) { struct sysctl_args32 tmp; int error; - size_t oldlen; - size_t __user *oldlenp = NULL; - unsigned long addr = (((unsigned long)&args->__unused[0]) + 7) & ~7; + size_t oldlen, *oldlenp = NULL; + unsigned long addr = (((long)&args->__unused[0]) + 7) & ~7; if (copy_from_user(&tmp, args, sizeof(tmp))) return -EFAULT; @@ -1014,20 +1072,20 @@ asmlinkage long sys32_sysctl(struct sysctl_args32 __user *args) basically copy the whole sysctl.c here, and glibc's __sysctl uses rw memory for the structure anyway. */ - if (get_user(oldlen, (u32 __user *)A(tmp.oldlenp)) || - put_user(oldlen, (size_t __user *)addr)) + if (get_user(oldlen, (u32 *)A(tmp.oldlenp)) || + put_user(oldlen, (size_t *)addr)) return -EFAULT; - oldlenp = (size_t __user *)addr; + oldlenp = (size_t *)addr; } lock_kernel(); - error = do_sysctl((int __user *)A(tmp.name), tmp.nlen, (void __user *)A(tmp.oldval), - oldlenp, (void __user *)A(tmp.newval), tmp.newlen); + error = do_sysctl((int *)A(tmp.name), tmp.nlen, (void *)A(tmp.oldval), + oldlenp, (void *)A(tmp.newval), tmp.newlen); unlock_kernel(); if (oldlenp) { if (!error) { - if (get_user(oldlen, (size_t __user *)addr) || - put_user(oldlen, (u32 __user *)A(tmp.oldlenp))) + if (get_user(oldlen, (size_t *)addr) || + put_user(oldlen, (u32 *)A(tmp.oldlenp))) error = -EFAULT; } copy_to_user(args->__unused, tmp.__unused, sizeof(tmp.__unused)); @@ -1037,7 +1095,7 @@ asmlinkage long sys32_sysctl(struct sysctl_args32 __user *args) #endif /* CONFIG_SYSCTL */ -asmlinkage long sys32_newuname(struct new_utsname __user * name) +asmlinkage long sys32_newuname(struct new_utsname * name) { int ret = 0; @@ -1072,9 +1130,9 @@ struct ustat32 { char f_fpack[6]; }; -extern asmlinkage long sys_ustat(dev_t dev, struct ustat __user * ubuf); +extern asmlinkage long sys_ustat(dev_t dev, struct ustat * ubuf); -asmlinkage int sys32_ustat(dev_t dev, struct ustat32 __user * ubuf32) +asmlinkage int sys32_ustat(dev_t dev, struct ustat32 * ubuf32) { int err; struct ustat tmp; @@ -1082,7 +1140,7 @@ asmlinkage int sys32_ustat(dev_t dev, struct ustat32 __user * ubuf32) mm_segment_t old_fs = get_fs(); set_fs(KERNEL_DS); - err = sys_ustat(dev, (struct ustat __user *)&tmp); + err = sys_ustat(dev, &tmp); set_fs (old_fs); if (err) @@ -1098,7 +1156,80 @@ out: return err; } -asmlinkage int sys32_sendfile(int out_fd, int in_fd, compat_off_t __user *offset, +/* Handle adjtimex compatibility. */ + +struct timex32 { + u32 modes; + s32 offset, freq, maxerror, esterror; + s32 status, constant, precision, tolerance; + struct compat_timeval time; + s32 tick; + s32 ppsfreq, jitter, shift, stabil; + s32 jitcnt, calcnt, errcnt, stbcnt; + s32 :32; s32 :32; s32 :32; s32 :32; + s32 :32; s32 :32; s32 :32; s32 :32; + s32 :32; s32 :32; s32 :32; s32 :32; +}; + +extern int do_adjtimex(struct timex *); + +asmlinkage int sys32_adjtimex(struct timex32 *utp) +{ + struct timex txc; + int ret; + + memset(&txc, 0, sizeof(struct timex)); + + if (get_user(txc.modes, &utp->modes) || + __get_user(txc.offset, &utp->offset) || + __get_user(txc.freq, &utp->freq) || + __get_user(txc.maxerror, &utp->maxerror) || + __get_user(txc.esterror, &utp->esterror) || + __get_user(txc.status, &utp->status) || + __get_user(txc.constant, &utp->constant) || + __get_user(txc.precision, &utp->precision) || + __get_user(txc.tolerance, &utp->tolerance) || + __get_user(txc.time.tv_sec, &utp->time.tv_sec) || + __get_user(txc.time.tv_usec, &utp->time.tv_usec) || + __get_user(txc.tick, &utp->tick) || + __get_user(txc.ppsfreq, &utp->ppsfreq) || + __get_user(txc.jitter, &utp->jitter) || + __get_user(txc.shift, &utp->shift) || + __get_user(txc.stabil, &utp->stabil) || + __get_user(txc.jitcnt, &utp->jitcnt) || + __get_user(txc.calcnt, &utp->calcnt) || + __get_user(txc.errcnt, &utp->errcnt) || + __get_user(txc.stbcnt, &utp->stbcnt)) + return -EFAULT; + + ret = do_adjtimex(&txc); + + if (put_user(txc.modes, &utp->modes) || + __put_user(txc.offset, &utp->offset) || + __put_user(txc.freq, &utp->freq) || + __put_user(txc.maxerror, &utp->maxerror) || + __put_user(txc.esterror, &utp->esterror) || + __put_user(txc.status, &utp->status) || + __put_user(txc.constant, &utp->constant) || + __put_user(txc.precision, &utp->precision) || + __put_user(txc.tolerance, &utp->tolerance) || + __put_user(txc.time.tv_sec, &utp->time.tv_sec) || + __put_user(txc.time.tv_usec, &utp->time.tv_usec) || + __put_user(txc.tick, &utp->tick) || + __put_user(txc.ppsfreq, &utp->ppsfreq) || + __put_user(txc.jitter, &utp->jitter) || + __put_user(txc.shift, &utp->shift) || + __put_user(txc.stabil, &utp->stabil) || + __put_user(txc.jitcnt, &utp->jitcnt) || + __put_user(txc.calcnt, &utp->calcnt) || + __put_user(txc.errcnt, &utp->errcnt) || + __put_user(txc.stbcnt, &utp->stbcnt)) + ret = -EFAULT; + + return ret; +} + +asmlinkage int sys32_sendfile(int out_fd, int in_fd, compat_off_t *offset, s32 count) { mm_segment_t old_fs = get_fs(); @@ -1109,7 +1240,7 @@ asmlinkage int sys32_sendfile(int out_fd, int in_fd, compat_off_t __user *offset return -EFAULT; set_fs(KERNEL_DS); - ret = sys_sendfile(out_fd, in_fd, offset ? (off_t __user *)&of : NULL, count); + ret = sys_sendfile(out_fd, in_fd, offset ? &of : NULL, count); set_fs(old_fs); if (offset && put_user(of, offset)) @@ -1124,16 +1255,6 @@ asmlinkage ssize_t sys32_readahead(int fd, u32 pad0, u64 a2, u64 a3, return sys_readahead(fd, merge_64(a2, a3), count); } -asmlinkage long sys32_sync_file_range(int fd, int __pad, - unsigned long a2, unsigned long a3, - unsigned long a4, unsigned long a5, - int flags) -{ - return sys_sync_file_range(fd, - merge_64(a2, a3), merge_64(a4, a5), - flags); -} - /* Argument list sizes for sys_socketcall */ #define AL(x) ((x) * sizeof(unsigned int)) static unsigned char socketcall_nargs[18]={AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), @@ -1149,7 +1270,7 @@ static unsigned char socketcall_nargs[18]={AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), * it is set by the callees. */ -asmlinkage long sys32_socketcall(int call, unsigned int __user *args32) +asmlinkage long sys32_socketcall(int call, unsigned int *args32) { unsigned int a[6]; unsigned int a0,a1; @@ -1171,7 +1292,7 @@ asmlinkage long sys32_socketcall(int call, unsigned int __user *args32) struct sockaddr __user *addr, int __user *addr_len); extern asmlinkage long sys_shutdown(int fd, int how); extern asmlinkage long sys_setsockopt(int fd, int level, int optname, char __user *optval, int optlen); - extern asmlinkage long sys_getsockopt(int fd, int level, int optname, char __user *optval, int __user *optlen); + extern asmlinkage long sys_getsockopt(int fd, int level, int optname, char __user *optval, int *optlen); extern asmlinkage long sys_sendmsg(int fd, struct msghdr __user *msg, unsigned flags); extern asmlinkage long sys_recvmsg(int fd, struct msghdr __user *msg, unsigned int flags); @@ -1291,7 +1412,7 @@ _sys32_clone(nabi_no_regargs struct pt_regs regs) newsp = regs.regs[5]; if (!newsp) newsp = regs.regs[29]; - parent_tidptr = (int __user *) regs.regs[6]; + parent_tidptr = (int *) regs.regs[6]; /* Use __dummy4 instead of getting it off the stack, so that syscall() works. */