vserver 1.9.5.x5
[linux-2.6.git] / arch / um / kernel / syscall_kern.c
index 6094be0..296686b 100644 (file)
 /*  Unlocked, I don't care if this is a bit off */
 int nsyscalls = 0;
 
-long um_mount(char * dev_name, char * dir_name, char * type,
-             unsigned long new_flags, void * data)
+long um_mount(char __user * dev_name, char __user * dir_name,
+             char __user * type, unsigned long new_flags, void __user * data)
 {
-       if(type == NULL) type = "";
        return(sys_mount(dev_name, dir_name, type, new_flags, data));
 }
 
@@ -58,12 +57,11 @@ long sys_vfork(void)
 }
 
 /* common code for old and new mmaps */
-static inline long do_mmap2(
-       unsigned long addr, unsigned long len,
-       unsigned long prot, unsigned long flags,
-       unsigned long fd, unsigned long pgoff)
+long sys_mmap2(unsigned long addr, unsigned long len,
+              unsigned long prot, unsigned long flags,
+              unsigned long fd, unsigned long pgoff)
 {
-       int error = -EBADF;
+       long error = -EBADF;
        struct file * file = NULL;
 
        flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
@@ -83,38 +81,15 @@ static inline long do_mmap2(
        return error;
 }
 
-long sys_mmap2(unsigned long addr, unsigned long len,
-              unsigned long prot, unsigned long flags,
-              unsigned long fd, unsigned long pgoff)
+long old_mmap(unsigned long addr, unsigned long len,
+             unsigned long prot, unsigned long flags,
+             unsigned long fd, unsigned long offset)
 {
-       return do_mmap2(addr, len, prot, flags, fd, pgoff);
-}
-
-/*
- * Perform the select(nd, in, out, ex, tv) and mmap() system
- * calls. Linux/i386 didn't use to be able to handle more than
- * 4 system call parameters, so these system calls used a memory
- * block for parameter passing..
- */
-
-struct mmap_arg_struct {
-       unsigned long addr;
-       unsigned long len;
-       unsigned long prot;
-       unsigned long flags;
-       unsigned long fd;
-       unsigned long offset;
-};
-
-int old_mmap(unsigned long addr, unsigned long len,
-            unsigned long prot, unsigned long flags,
-            unsigned long fd, unsigned long offset)
-{
-       int err = -EINVAL;
+       long err = -EINVAL;
        if (offset & ~PAGE_MASK)
                goto out;
 
-       err = do_mmap2(addr, len, prot, flags, fd, offset >> PAGE_SHIFT);
+       err = sys_mmap2(addr, len, prot, flags, fd, offset >> PAGE_SHIFT);
  out:
        return err;
 }
@@ -122,10 +97,10 @@ int old_mmap(unsigned long addr, unsigned long len,
  * sys_pipe() is the normal C calling standard for creating
  * a pipe. It's not the way unix traditionally does this, though.
  */
-int sys_pipe(unsigned long * fildes)
+long sys_pipe(unsigned long __user * fildes)
 {
         int fd[2];
-        int error;
+        long error;
 
         error = do_pipe(fd);
         if (!error) {
@@ -135,94 +110,10 @@ int sys_pipe(unsigned long * fildes)
         return error;
 }
 
-/*
- * sys_ipc() is the de-multiplexer for the SysV IPC calls..
- *
- * This is really horribly ugly.
- */
-int sys_ipc (uint call, int first, int second,
-            int third, void *ptr, long fifth)
-{
-       int version, ret;
-
-       version = call >> 16; /* hack for backward compatibility */
-       call &= 0xffff;
-
-       switch (call) {
-       case SEMOP:
-               return sys_semtimedop(first, (struct sembuf *) ptr, second, 
-                                     NULL);
-       case SEMTIMEDOP:
-               return sys_semtimedop(first, (struct sembuf *) ptr, second,
-                                     (const struct timespec *) fifth);
-       case SEMGET:
-               return sys_semget (first, second, third);
-       case SEMCTL: {
-               union semun fourth;
-               if (!ptr)
-                       return -EINVAL;
-               if (get_user(fourth.__pad, (void **) ptr))
-                       return -EFAULT;
-               return sys_semctl (first, second, third, fourth);
-       }
-
-       case MSGSND:
-               return sys_msgsnd (first, (struct msgbuf *) ptr, 
-                                  second, third);
-       case MSGRCV:
-               switch (version) {
-               case 0: {
-                       struct ipc_kludge tmp;
-                       if (!ptr)
-                               return -EINVAL;
-                       
-                       if (copy_from_user(&tmp,
-                                          (struct ipc_kludge *) ptr, 
-                                          sizeof (tmp)))
-                               return -EFAULT;
-                       return sys_msgrcv (first, tmp.msgp, second,
-                                          tmp.msgtyp, third);
-               }
-               default:
-                       panic("msgrcv with version != 0");
-                       return sys_msgrcv (first,
-                                          (struct msgbuf *) ptr,
-                                          second, fifth, third);
-               }
-       case MSGGET:
-               return sys_msgget ((key_t) first, second);
-       case MSGCTL:
-               return sys_msgctl (first, second, (struct msqid_ds *) ptr);
-
-       case SHMAT:
-               switch (version) {
-               default: {
-                       ulong raddr;
-                       ret = do_shmat (first, (char *) ptr, second, &raddr);
-                       if (ret)
-                               return ret;
-                       return put_user (raddr, (ulong *) third);
-               }
-               case 1: /* iBCS2 emulator entry point */
-                       if (!segment_eq(get_fs(), get_ds()))
-                               return -EINVAL;
-                       return do_shmat (first, (char *) ptr, second, (ulong *) third);
-               }
-       case SHMDT: 
-               return sys_shmdt ((char *)ptr);
-       case SHMGET:
-               return sys_shmget (first, second, third);
-       case SHMCTL:
-               return sys_shmctl (first, second,
-                                  (struct shmid_ds *) ptr);
-       default:
-               return -ENOSYS;
-       }
-}
 
-int sys_uname(struct old_utsname * name)
+long sys_uname(struct old_utsname * name)
 {
-       int err;
+       long err;
        if (!name)
                return -EFAULT;
        down_read(&uts_sem);
@@ -231,9 +122,9 @@ int sys_uname(struct old_utsname * name)
        return err?-EFAULT:0;
 }
 
-int sys_olduname(struct oldold_utsname * name)
+long sys_olduname(struct oldold_utsname * name)
 {
-       int error;
+       long error;
        struct new_utsname *ptr;
 
        if (!name)
@@ -272,7 +163,7 @@ long execute_syscall(void *r)
        return(CHOOSE_MODE_PROC(execute_syscall_tt, execute_syscall_skas, r));
 }
 
-spinlock_t syscall_lock = SPIN_LOCK_UNLOCKED;
+DEFINE_SPINLOCK(syscall_lock);
 
 static int syscall_index = 0;