Merge git://oss.sgi.com:8090/xfs/xfs-2.6
[linux-drm-fsl-dcu.git] / arch / x86_64 / ia32 / sys_ia32.c
index 9c130993380d8b3a27da7437da33be064f713052..200fdde18d968e70ce5d7bf2832db7e683a4f448 100644 (file)
@@ -60,6 +60,7 @@
 #include <linux/highuid.h>
 #include <linux/vmalloc.h>
 #include <linux/fsnotify.h>
+#include <linux/sysctl.h>
 #include <asm/mman.h>
 #include <asm/types.h>
 #include <asm/uaccess.h>
@@ -75,6 +76,8 @@
 
 int cp_compat_stat(struct kstat *kbuf, struct compat_stat __user *ubuf)
 {
+       compat_ino_t ino;
+
        typeof(ubuf->st_uid) uid = 0;
        typeof(ubuf->st_gid) gid = 0;
        SET_UID(uid, kbuf->uid);
@@ -83,9 +86,12 @@ int cp_compat_stat(struct kstat *kbuf, struct compat_stat __user *ubuf)
                return -EOVERFLOW;
        if (kbuf->size >= 0x7fffffff)
                return -EOVERFLOW;
+       ino = kbuf->ino;
+       if (sizeof(ino) < sizeof(kbuf->ino) && ino != kbuf->ino)
+               return -EOVERFLOW;
        if (!access_ok(VERIFY_WRITE, ubuf, sizeof(struct compat_stat)) ||
            __put_user (old_encode_dev(kbuf->dev), &ubuf->st_dev) ||
-           __put_user (kbuf->ino, &ubuf->st_ino) ||
+           __put_user (ino, &ubuf->st_ino) ||
            __put_user (kbuf->mode, &ubuf->st_mode) ||
            __put_user (kbuf->nlink, &ubuf->st_nlink) ||
            __put_user (uid, &ubuf->st_uid) ||
@@ -389,7 +395,9 @@ sys32_rt_sigprocmask(int how, compat_sigset_t __user *set,
                }
        }
        set_fs (KERNEL_DS);
-       ret = sys_rt_sigprocmask(how, set ? &s : NULL, oset ? &s : NULL,
+       ret = sys_rt_sigprocmask(how,
+                                set ? (sigset_t __user *)&s : NULL,
+                                oset ? (sigset_t __user *)&s : NULL,
                                 sigsetsize); 
        set_fs (old_fs);
        if (ret) return ret;
@@ -515,72 +523,6 @@ sys32_sysfs(int option, u32 arg1, u32 arg2)
        return sys_sysfs(option, arg1, arg2);
 }
 
-struct sysinfo32 {
-        s32 uptime;
-        u32 loads[3];
-        u32 totalram;
-        u32 freeram;
-        u32 sharedram;
-        u32 bufferram;
-        u32 totalswap;
-        u32 freeswap;
-        unsigned short procs;
-       unsigned short pad; 
-        u32 totalhigh;
-        u32 freehigh;
-        u32 mem_unit;
-        char _f[20-2*sizeof(u32)-sizeof(int)];
-};
-
-asmlinkage long
-sys32_sysinfo(struct sysinfo32 __user *info)
-{
-       struct sysinfo s;
-       int ret;
-       mm_segment_t old_fs = get_fs ();
-       int bitcount = 0;
-       
-       set_fs (KERNEL_DS);
-       ret = sys_sysinfo(&s);
-       set_fs (old_fs);
-
-        /* Check to see if any memory value is too large for 32-bit and scale
-        *  down if needed
-        */
-       if ((s.totalram >> 32) || (s.totalswap >> 32)) {
-               while (s.mem_unit < PAGE_SIZE) {
-                       s.mem_unit <<= 1;
-                       bitcount++;
-               }
-               s.totalram >>= bitcount;
-               s.freeram >>= bitcount;
-               s.sharedram >>= bitcount;
-               s.bufferram >>= bitcount;
-               s.totalswap >>= bitcount;
-               s.freeswap >>= bitcount;
-               s.totalhigh >>= bitcount;
-               s.freehigh >>= bitcount;
-       }
-
-       if (!access_ok(VERIFY_WRITE, info, sizeof(struct sysinfo32)) ||
-           __put_user (s.uptime, &info->uptime) ||
-           __put_user (s.loads[0], &info->loads[0]) ||
-           __put_user (s.loads[1], &info->loads[1]) ||
-           __put_user (s.loads[2], &info->loads[2]) ||
-           __put_user (s.totalram, &info->totalram) ||
-           __put_user (s.freeram, &info->freeram) ||
-           __put_user (s.sharedram, &info->sharedram) ||
-           __put_user (s.bufferram, &info->bufferram) ||
-           __put_user (s.totalswap, &info->totalswap) ||
-           __put_user (s.freeswap, &info->freeswap) ||
-           __put_user (s.procs, &info->procs) ||
-           __put_user (s.totalhigh, &info->totalhigh) || 
-           __put_user (s.freehigh, &info->freehigh) ||
-           __put_user (s.mem_unit, &info->mem_unit))
-               return -EFAULT;
-       return 0;
-}
-                
 asmlinkage long
 sys32_sched_rr_get_interval(compat_pid_t pid, struct compat_timespec __user *interval)
 {
@@ -589,7 +531,7 @@ sys32_sched_rr_get_interval(compat_pid_t pid, struct compat_timespec __user *int
        mm_segment_t old_fs = get_fs ();
        
        set_fs (KERNEL_DS);
-       ret = sys_sched_rr_get_interval(pid, &t);
+       ret = sys_sched_rr_get_interval(pid, (struct timespec __user *)&t);
        set_fs (old_fs);
        if (put_compat_timespec(&t, interval))
                return -EFAULT;
@@ -605,7 +547,7 @@ sys32_rt_sigpending(compat_sigset_t __user *set, compat_size_t sigsetsize)
        mm_segment_t old_fs = get_fs();
                
        set_fs (KERNEL_DS);
-       ret = sys_rt_sigpending(&s, sigsetsize);
+       ret = sys_rt_sigpending((sigset_t __user *)&s, sigsetsize);
        set_fs (old_fs);
        if (!ret) {
                switch (_NSIG_WORDS) {
@@ -630,7 +572,7 @@ sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo)
        if (copy_siginfo_from_user32(&info, uinfo))
                return -EFAULT;
        set_fs (KERNEL_DS);
-       ret = sys_rt_sigqueueinfo(pid, sig, &info);
+       ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __user *)&info);
        set_fs (old_fs);
        return ret;
 }
@@ -645,7 +587,7 @@ sys32_pause(void)
 }
 
 
-#ifdef CONFIG_SYSCTL
+#ifdef CONFIG_SYSCTL_SYSCALL
 struct sysctl_ia32 {
        unsigned int    name;
        int             nlen;
@@ -666,9 +608,6 @@ sys32_sysctl(struct sysctl_ia32 __user *args32)
        size_t oldlen;
        int __user *namep;
        long ret;
-       extern int do_sysctl(int *name, int nlen, void *oldval, size_t *oldlenp,
-                    void *newval, size_t newlen);
-
 
        if (copy_from_user(&a32, args32, sizeof (a32)))
                return -EFAULT;
@@ -692,7 +631,8 @@ sys32_sysctl(struct sysctl_ia32 __user *args32)
 
        set_fs(KERNEL_DS);
        lock_kernel();
-       ret = do_sysctl(namep, a32.nlen, oldvalp, &oldlen, newvalp, (size_t) a32.newlen);
+       ret = do_sysctl(namep, a32.nlen, oldvalp, (size_t __user *)&oldlen,
+                       newvalp, (size_t) a32.newlen);
        unlock_kernel();
        set_fs(old_fs);
 
@@ -743,7 +683,8 @@ sys32_sendfile(int out_fd, int in_fd, compat_off_t __user *offset, s32 count)
                return -EFAULT;
                
        set_fs(KERNEL_DS);
-       ret = sys_sendfile(out_fd, in_fd, offset ? &of : NULL, count);
+       ret = sys_sendfile(out_fd, in_fd, offset ? (off_t __user *)&of : NULL,
+                          count);
        set_fs(old_fs);
        
        if (offset && put_user(of, offset))
@@ -778,36 +719,40 @@ asmlinkage long sys32_mmap2(unsigned long addr, unsigned long len,
 
 asmlinkage long sys32_olduname(struct oldold_utsname __user * name)
 {
-       int error;
+       int err;
 
        if (!name)
                return -EFAULT;
-       if (!access_ok(VERIFY_WRITE,name,sizeof(struct oldold_utsname)))
+       if (!access_ok(VERIFY_WRITE, name, sizeof(struct oldold_utsname)))
                return -EFAULT;
   
        down_read(&uts_sem);
-       
-       error = __copy_to_user(&name->sysname,&system_utsname.sysname,__OLD_UTS_LEN);
-        __put_user(0,name->sysname+__OLD_UTS_LEN);
-        __copy_to_user(&name->nodename,&system_utsname.nodename,__OLD_UTS_LEN);
-        __put_user(0,name->nodename+__OLD_UTS_LEN);
-        __copy_to_user(&name->release,&system_utsname.release,__OLD_UTS_LEN);
-        __put_user(0,name->release+__OLD_UTS_LEN);
-        __copy_to_user(&name->version,&system_utsname.version,__OLD_UTS_LEN);
-        __put_user(0,name->version+__OLD_UTS_LEN);
-        { 
-                char *arch = "x86_64";
-                if (personality(current->personality) == PER_LINUX32)
-                        arch = "i686";
+
+       err = __copy_to_user(&name->sysname,&utsname()->sysname,
+                               __OLD_UTS_LEN);
+       err |= __put_user(0,name->sysname+__OLD_UTS_LEN);
+       err |= __copy_to_user(&name->nodename,&utsname()->nodename,
+                               __OLD_UTS_LEN);
+       err |= __put_user(0,name->nodename+__OLD_UTS_LEN);
+       err |= __copy_to_user(&name->release,&utsname()->release,
+                               __OLD_UTS_LEN);
+       err |= __put_user(0,name->release+__OLD_UTS_LEN);
+       err |= __copy_to_user(&name->version,&utsname()->version,
+                               __OLD_UTS_LEN);
+       err |= __put_user(0,name->version+__OLD_UTS_LEN);
+       {
+               char *arch = "x86_64";
+               if (personality(current->personality) == PER_LINUX32)
+                       arch = "i686";
                 
-                __copy_to_user(&name->machine,arch,strlen(arch)+1);
-        }
-       
-        up_read(&uts_sem);
-        
-        error = error ? -EFAULT : 0;
-        
-        return error;
+               err |= __copy_to_user(&name->machine, arch, strlen(arch)+1);
+       }
+
+       up_read(&uts_sem);
+
+       err = err ? -EFAULT : 0;
+
+       return err;
 }
 
 long sys32_uname(struct old_utsname __user * name)
@@ -816,7 +761,7 @@ long sys32_uname(struct old_utsname __user * name)
        if (!name)
                return -EFAULT;
        down_read(&uts_sem);
-       err=copy_to_user(name, &system_utsname, sizeof (*name));
+       err = copy_to_user(name, utsname(), sizeof (*name));
        up_read(&uts_sem);
        if (personality(current->personality) == PER_LINUX32) 
                err |= copy_to_user(&name->machine, "i686", 5);
@@ -831,7 +776,7 @@ long sys32_ustat(unsigned dev, struct ustat32 __user *u32p)
        
        seg = get_fs(); 
        set_fs(KERNEL_DS); 
-       ret = sys_ustat(dev,&u); 
+       ret = sys_ustat(dev, (struct ustat __user *)&u);
        set_fs(seg);
        if (ret >= 0) { 
                if (!access_ok(VERIFY_WRITE,u32p,sizeof(struct ustat32)) ||