Add generic sys_old_mmap()
authorChristoph Hellwig <hch@lst.de>
Wed, 10 Mar 2010 23:21:15 +0000 (15:21 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 12 Mar 2010 23:52:32 +0000 (15:52 -0800)
Add a generic implementation of the old mmap() syscall, which expects its
argument in a memory block and switch all architectures over to use it.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mundt <lethal@linux-sh.org>
Cc: Jeff Dike <jdike@addtoit.com>
Cc: Hirokazu Takata <takata@linux-m32r.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@elte.hu>
Reviewed-by: H. Peter Anvin <hpa@zytor.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: "Luck, Tony" <tony.luck@intel.com>
Cc: James Morris <jmorris@namei.org>
Cc: Andreas Schwab <schwab@linux-m68k.org>
Acked-by: Jesper Nilsson <jesper.nilsson@axis.com>
Acked-by: Russell King <rmk+kernel@arm.linux.org.uk>
Acked-by: Greg Ungerer <gerg@uclinux.org>
Acked-by: David Howells <dhowells@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
31 files changed:
arch/arm/include/asm/unistd.h
arch/arm/kernel/calls.S
arch/arm/kernel/sys_arm.c
arch/cris/arch-v10/kernel/entry.S
arch/cris/arch-v32/kernel/entry.S
arch/cris/include/asm/unistd.h
arch/cris/kernel/sys_cris.c
arch/h8300/include/asm/unistd.h
arch/h8300/kernel/sys_h8300.c
arch/h8300/kernel/syscalls.S
arch/m68k/include/asm/unistd.h
arch/m68k/kernel/entry.S
arch/m68k/kernel/sys_m68k.c
arch/m68knommu/kernel/sys_m68k.c
arch/m68knommu/kernel/syscalltable.S
arch/s390/include/asm/unistd.h
arch/s390/kernel/entry.h
arch/s390/kernel/sys_s390.c
arch/s390/kernel/syscalls.S
arch/um/sys-i386/shared/sysdep/syscalls.h
arch/um/sys-i386/sys_call_table.S
arch/um/sys-i386/syscalls.c
arch/x86/ia32/sys_ia32.c
arch/x86/include/asm/sys_ia32.h
arch/x86/include/asm/syscalls.h
arch/x86/include/asm/unistd_32.h
arch/x86/kernel/sys_i386_32.c
arch/x86/kernel/syscall_table_32.S
include/linux/syscalls.h
mm/mmap.c
mm/nommu.c

index e18500d305ba104ab764bcd1060c975396f9a93c..e6eeb2d29953d95145684a23198a9fd284629e78 100644 (file)
 #define __ARCH_WANT_SYS_SIGPROCMASK
 #define __ARCH_WANT_SYS_RT_SIGACTION
 #define __ARCH_WANT_SYS_RT_SIGSUSPEND
+#define __ARCH_WANT_SYS_OLD_MMAP
 #define __ARCH_WANT_SYS_OLD_SELECT
 
 #if !defined(CONFIG_AEABI) || defined(CONFIG_OABI_COMPAT)
index 7671e9a7544996d9bb1c6d159d9ffb5d85decc74..37ae301cc47c81ccf8bb80d02e4d7aaed67622e9 100644 (file)
@@ -99,7 +99,7 @@
                CALL(sys_swapon)
                CALL(sys_reboot)
                CALL(OBSOLETE(sys_old_readdir)) /* used by libc4 */
-/* 90 */       CALL(OBSOLETE(old_mmap))        /* used by libc4 */
+/* 90 */       CALL(OBSOLETE(sys_old_mmap))    /* used by libc4 */
                CALL(sys_munmap)
                CALL(sys_truncate)
                CALL(sys_ftruncate)
index e59cddedcbbaa5e80886ee39cf8a465020412bff..a2e0e6f2ea7ff3725a8cd9e6e63283e4696f8e99 100644 (file)
 #include <linux/ipc.h>
 #include <linux/uaccess.h>
 
-struct mmap_arg_struct {
-       unsigned long addr;
-       unsigned long len;
-       unsigned long prot;
-       unsigned long flags;
-       unsigned long fd;
-       unsigned long offset;
-};
-
-asmlinkage int old_mmap(struct mmap_arg_struct __user *arg)
-{
-       int error = -EFAULT;
-       struct mmap_arg_struct a;
-
-       if (copy_from_user(&a, arg, sizeof(a)))
-               goto out;
-
-       error = -EINVAL;
-       if (a.offset & ~PAGE_MASK)
-               goto out;
-
-       error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT);
-out:
-       return error;
-}
-
 #if !defined(CONFIG_AEABI) || defined(CONFIG_OABI_COMPAT)
 /*
  * sys_ipc() is the de-multiplexer for the SysV IPC calls..
index c52bef39e250231ab21f9116e7abd7435e45ac3c..0d6420d087fd01d8e588315b3dec2d2d76791495 100644 (file)
@@ -692,7 +692,7 @@ sys_call_table:
        .long sys_swapon
        .long sys_reboot
        .long sys_old_readdir
-       .long old_mmap          /* 90 */
+       .long sys_old_mmap      /* 90 */
        .long sys_munmap
        .long sys_truncate
        .long sys_ftruncate
index 435b9671bd4b75b4a92884fc008a05171672c1db..1f39861eac8cab0cf0fca86c3c0362525d5fe382 100644 (file)
@@ -615,7 +615,7 @@ sys_call_table:
        .long sys_swapon
        .long sys_reboot
        .long sys_old_readdir
-       .long old_mmap          /* 90 */
+       .long sys_old_mmap      /* 90 */
        .long sys_munmap
        .long sys_truncate
        .long sys_ftruncate
index c17079388bb909c8a9ab09ddb6533dab47e94ff4..8cffd22623fde4b1449debc44974740e22ba0ba5 100644 (file)
 #define __ARCH_WANT_SYS_LLSEEK
 #define __ARCH_WANT_SYS_NICE
 #define __ARCH_WANT_SYS_OLD_GETRLIMIT
+#define __ARCH_WANT_SYS_OLD_MMAP
 #define __ARCH_WANT_SYS_OLDUMOUNT
 #define __ARCH_WANT_SYS_SIGPENDING
 #define __ARCH_WANT_SYS_SIGPROCMASK
index c2bbb1ac98a964b9ffaa2ae8454d8becda607712..22f9d6cd947fa4d802f9259ef4c7cf6e4b50ab0e 100644 (file)
 #include <asm/uaccess.h>
 #include <asm/segment.h>
 
-asmlinkage unsigned long old_mmap(unsigned long __user *args)
-{        
-       unsigned long buffer[6];
-       int err = -EFAULT;
-
-       if (copy_from_user(&buffer, args, sizeof(buffer)))
-               goto out;
-
-       err = -EINVAL;
-       if (buffer[5] & ~PAGE_MASK) /* verify that offset is on page boundary */
-               goto out;
-
-       err = sys_mmap_pgoff(buffer[0], buffer[1], buffer[2], buffer[3],
-                       buffer[4], buffer[5] >> PAGE_SHIFT);
-out:
-       return err;
-}
-
 asmlinkage long
 sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot,
           unsigned long flags, unsigned long fd, unsigned long pgoff)
index 3bea0b3eb24f08763f4ae2a090639ec26c8e4630..54dab47269547180d11054987b04ac055e2a7bda 100644 (file)
 #define __ARCH_WANT_SYS_LLSEEK
 #define __ARCH_WANT_SYS_NICE
 #define __ARCH_WANT_SYS_OLD_GETRLIMIT
+#define __ARCH_WANT_SYS_OLD_MMAP
 #define __ARCH_WANT_SYS_OLD_SELECT
 #define __ARCH_WANT_SYS_OLDUMOUNT
 #define __ARCH_WANT_SYS_SIGPENDING
index e9a3ecf90c9c83247a28ec6988c3009f5ac80b17..1f13fd6e530941c440c75fe301c0fbddf0a7757b 100644 (file)
 #include <asm/traps.h>
 #include <asm/unistd.h>
 
-/*
- * Perform the select(nd, in, out, ex, tv) and mmap() system
- * calls. Linux/m68k cloned Linux/i386, which 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;
-};
-
-asmlinkage int old_mmap(struct mmap_arg_struct *arg)
-{
-       struct mmap_arg_struct a;
-       int error = -EFAULT;
-
-       if (copy_from_user(&a, arg, sizeof(a)))
-               goto out;
-
-       error = -EINVAL;
-       if (a.offset & ~PAGE_MASK)
-               goto out;
-
-       error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd,
-                              a.offset >> PAGE_SHIFT);
-out:
-       return error;
-}
-
 /*
  * sys_ipc() is the de-multiplexer for the SysV IPC calls..
  *
index fe5ae20e60c547fca682d8ab95d554379d16f3a7..faefaff7d43de491cb99df880047f9d637c788fe 100644 (file)
@@ -104,7 +104,7 @@ SYMBOL_NAME_LABEL(sys_call_table)
        .long SYMBOL_NAME(sys_swapon)
        .long SYMBOL_NAME(sys_reboot)
        .long SYMBOL_NAME(sys_old_readdir)
-       .long SYMBOL_NAME(old_mmap)             /* 90 */
+       .long SYMBOL_NAME(sys_old_mmap)         /* 90 */
        .long SYMBOL_NAME(sys_munmap)
        .long SYMBOL_NAME(sys_truncate)
        .long SYMBOL_NAME(sys_ftruncate)
index 1582c2db1c86c7f69663151f61e6d5dfe387cce4..d801154310ea8fa4c9f64d278541ceb143d5ae47 100644 (file)
 #define __ARCH_WANT_SYS_LLSEEK
 #define __ARCH_WANT_SYS_NICE
 #define __ARCH_WANT_SYS_OLD_GETRLIMIT
+#define __ARCH_WANT_SYS_OLD_MMAP
 #define __ARCH_WANT_SYS_OLD_SELECT
 #define __ARCH_WANT_SYS_OLDUMOUNT
 #define __ARCH_WANT_SYS_SIGPENDING
index 09b1f09be3a6abb32aaa161859d98d6f0f71f469..2391bdff09962e7a51d36c7842290ea90932ca54 100644 (file)
@@ -518,7 +518,7 @@ sys_call_table:
        .long sys_swapon
        .long sys_reboot
        .long sys_old_readdir
-       .long old_mmap          /* 90 */
+       .long sys_old_mmap      /* 90 */
        .long sys_munmap
        .long sys_truncate
        .long sys_ftruncate
index 03b58dd86c7afdf365373aac259680c416d48551..7b309e7b6cefff2ec8fe3215049930573be88469 100644 (file)
@@ -46,40 +46,6 @@ asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
        return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff);
 }
 
-/*
- * Perform the select(nd, in, out, ex, tv) and mmap() system
- * calls. Linux/m68k cloned Linux/i386, which 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;
-};
-
-asmlinkage int old_mmap(struct mmap_arg_struct __user *arg)
-{
-       struct mmap_arg_struct a;
-       int error = -EFAULT;
-
-       if (copy_from_user(&a, arg, sizeof(a)))
-               goto out;
-
-       error = -EINVAL;
-       if (a.offset & ~PAGE_MASK)
-               goto out;
-
-       error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd,
-                              a.offset >> PAGE_SHIFT);
-out:
-       return error;
-}
-
 /*
  * sys_ipc() is the de-multiplexer for the SysV IPC calls..
  *
index e0d3f13e77a89dbfb90d23cfff1745fbae0cff41..3e371cc9fd918862294de1cdd770b564d7ee8a0e 100644 (file)
 #include <asm/cacheflush.h>
 #include <asm/unistd.h>
 
-/*
- * Perform the select(nd, in, out, ex, tv) and mmap() system
- * calls. Linux/m68k cloned Linux/i386, which 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;
-};
-
-asmlinkage int old_mmap(struct mmap_arg_struct *arg)
-{
-       struct mmap_arg_struct a;
-       int error = -EFAULT;
-
-       if (copy_from_user(&a, arg, sizeof(a)))
-               goto out;
-
-       error = -EINVAL;
-       if (a.offset & ~PAGE_MASK)
-               goto out;
-
-       error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd,
-                               a.offset >> PAGE_SHIFT);
-out:
-       return error;
-}
-
 /*
  * sys_ipc() is the de-multiplexer for the SysV IPC calls..
  *
index 405738351700ade7754f1193d0e0bfaee25a0caa..b30b3eb197a5d2c157d6e96f8d60de45395d4a21 100644 (file)
@@ -108,7 +108,7 @@ ENTRY(sys_call_table)
        .long sys_ni_syscall    /* sys_swapon */
        .long sys_reboot
        .long sys_old_readdir
-       .long old_mmap          /* 90 */
+       .long sys_old_mmap      /* 90 */
        .long sys_munmap
        .long sys_truncate
        .long sys_ftruncate
index 6e9f049fa823eba6a042492602b3b41dcfa7772f..5f0075150a651d99457c9e048f967187c1c65c50 100644 (file)
 #define __ARCH_WANT_SYS_LLSEEK
 #define __ARCH_WANT_SYS_NICE
 #define __ARCH_WANT_SYS_OLD_GETRLIMIT
+#define __ARCH_WANT_SYS_OLD_MMAP
 #define __ARCH_WANT_SYS_OLDUMOUNT
 #define __ARCH_WANT_SYS_SIGPENDING
 #define __ARCH_WANT_SYS_SIGPROCMASK
index 9905a0cacf93b97f462004629d6b2a1d6f11faae..5de54d2af0b2e9dbe4db97560aa96756b7dd61e6 100644 (file)
@@ -25,12 +25,11 @@ void __init startup_init(void);
 void die(const char * str, struct pt_regs * regs, long err);
 
 struct new_utsname;
-struct mmap_arg_struct;
+struct s390_mmap_arg_struct;
 struct fadvise64_64_args;
 struct old_sigaction;
 
-long sys_mmap2(struct mmap_arg_struct __user  *arg);
-long sys_s390_old_mmap(struct mmap_arg_struct __user *arg);
+long sys_mmap2(struct s390_mmap_arg_struct __user  *arg);
 long sys_ipc(uint call, int first, unsigned long second,
             unsigned long third, void __user *ptr);
 long sys_s390_newuname(struct new_utsname __user *name);
index 86a74c9c9e63c2b7d377ee7c725d7381377ae0a3..b2563509b5a9d1fb01ad30d6e1f2e63d6db9dcc9 100644 (file)
 #include "entry.h"
 
 /*
- * Perform the select(nd, in, out, ex, tv) and mmap() system
- * calls. Linux for S/390 isn't able to handle more than 5
- * system call parameters, so these system calls used a memory
- * block for parameter passing..
+ * Perform the mmap() system call. Linux for S/390 isn't able to handle more
+ * than 5 system call parameters, so this system call uses a memory block
+ * for parameter passing.
  */
 
-struct mmap_arg_struct {
+struct s390_mmap_arg_struct {
        unsigned long addr;
        unsigned long len;
        unsigned long prot;
@@ -48,9 +47,9 @@ struct mmap_arg_struct {
        unsigned long offset;
 };
 
-SYSCALL_DEFINE1(mmap2, struct mmap_arg_struct __user *, arg)
+SYSCALL_DEFINE1(mmap2, struct s390_mmap_arg_struct __user *, arg)
 {
-       struct mmap_arg_struct a;
+       struct s390_mmap_arg_struct a;
        int error = -EFAULT;
 
        if (copy_from_user(&a, arg, sizeof(a)))
@@ -60,23 +59,6 @@ out:
        return error;
 }
 
-SYSCALL_DEFINE1(s390_old_mmap, struct mmap_arg_struct __user *, arg)
-{
-       struct mmap_arg_struct a;
-       long error = -EFAULT;
-
-       if (copy_from_user(&a, arg, sizeof(a)))
-               goto out;
-
-       error = -EINVAL;
-       if (a.offset & ~PAGE_MASK)
-               goto out;
-
-       error = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT);
-out:
-       return error;
-}
-
 /*
  * sys_ipc() is the de-multiplexer for the SysV IPC calls..
  *
index 30eca070d4268953d209b54394c99806afced91e..2a24766567affd6e46ed5a87ddf8a8d448b289db 100644 (file)
@@ -98,7 +98,7 @@ SYSCALL(sys_uselib,sys_uselib,sys32_uselib_wrapper)
 SYSCALL(sys_swapon,sys_swapon,sys32_swapon_wrapper)
 SYSCALL(sys_reboot,sys_reboot,sys32_reboot_wrapper)
 SYSCALL(sys_ni_syscall,sys_ni_syscall,old32_readdir_wrapper)   /* old readdir syscall */
-SYSCALL(sys_s390_old_mmap,sys_s390_old_mmap,old32_mmap_wrapper)        /* 90 */
+SYSCALL(sys_old_mmap,sys_old_mmap,old32_mmap_wrapper)          /* 90 */
 SYSCALL(sys_munmap,sys_munmap,sys32_munmap_wrapper)
 SYSCALL(sys_truncate,sys_truncate,sys32_truncate_wrapper)
 SYSCALL(sys_ftruncate,sys_ftruncate,sys32_ftruncate_wrapper)
index e7787679e3174b2cd891a27f8a9a380f0a390be7..05cb796aecb55f102ca67e4e8240c98a966d968f 100644 (file)
@@ -13,8 +13,6 @@ typedef long syscall_handler_t(struct pt_regs);
  */
 extern syscall_handler_t sys_rt_sigaction;
 
-extern syscall_handler_t old_mmap_i386;
-
 extern syscall_handler_t *sys_call_table[];
 
 #define EXECUTE_SYSCALL(syscall, regs) \
index c6260dd6ebb9f3338eee3b7f7242fe419e096b64..de274071455d0096ecd7e85589d6ce2fd2689c64 100644 (file)
@@ -7,7 +7,7 @@
 #define sys_vm86old sys_ni_syscall
 #define sys_vm86 sys_ni_syscall
 
-#define old_mmap old_mmap_i386
+#define old_mmap sys_old_mmap
 
 #define ptregs_fork sys_fork
 #define ptregs_execve sys_execve
index 0e49d2a20c17db7d29715a02adc8229670df460a..d0aa8f125ee67ad85e9b7ee32d5a7c16c64cb9ad 100644 (file)
 #include "asm/uaccess.h"
 #include "asm/unistd.h"
 
-/*
- * 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;
-};
-
-extern int old_mmap(unsigned long addr, unsigned long len,
-                   unsigned long prot, unsigned long flags,
-                   unsigned long fd, unsigned long offset);
-
-long old_mmap_i386(struct mmap_arg_struct __user *arg)
-{
-       struct mmap_arg_struct a;
-       int err = -EFAULT;
-
-       if (copy_from_user(&a, arg, sizeof(a)))
-               goto out;
-
-       err = old_mmap(a.addr, a.len, a.prot, a.flags, a.fd, a.offset);
- out:
-       return err;
-}
-
 /*
  * The prototype on i386 is:
  *
index cb80816e7a16f3b8602d6d1f7d67c67fef14e508..56c99f46e289afac94576007f6b8478efe4507ef 100644 (file)
@@ -143,7 +143,7 @@ asmlinkage long sys32_fstatat(unsigned int dfd, char __user *filename,
  * block for parameter passing..
  */
 
-struct mmap_arg_struct {
+struct mmap_arg_struct32 {
        unsigned int addr;
        unsigned int len;
        unsigned int prot;
@@ -152,9 +152,9 @@ struct mmap_arg_struct {
        unsigned int offset;
 };
 
-asmlinkage long sys32_mmap(struct mmap_arg_struct __user *arg)
+asmlinkage long sys32_mmap(struct mmap_arg_struct32 __user *arg)
 {
-       struct mmap_arg_struct a;
+       struct mmap_arg_struct32 a;
 
        if (copy_from_user(&a, arg, sizeof(a)))
                return -EFAULT;
index b26fc750e416bd1232d284a13fd76c345c6c97dc..7d348d80366980430082211285e3935c273c6961 100644 (file)
@@ -26,8 +26,8 @@ asmlinkage long sys32_lstat64(char __user *, struct stat64 __user *);
 asmlinkage long sys32_fstat64(unsigned int, struct stat64 __user *);
 asmlinkage long sys32_fstatat(unsigned int, char __user *,
                              struct stat64 __user *, int);
-struct mmap_arg_struct;
-asmlinkage long sys32_mmap(struct mmap_arg_struct __user *);
+struct mmap_arg_struct32;
+asmlinkage long sys32_mmap(struct mmap_arg_struct32 __user *);
 asmlinkage long sys32_mprotect(unsigned long, size_t, unsigned long);
 
 struct sigaction32;
index 8406d06c118d15795dfd2b674bf368683d5aab5d..86ab6a0623fdc78331f8459e861c22d062f99023 100644 (file)
@@ -51,11 +51,9 @@ asmlinkage int sys_sigaction(int, const struct old_sigaction __user *,
 unsigned long sys_sigreturn(struct pt_regs *);
 
 /* kernel/sys_i386_32.c */
-struct mmap_arg_struct;
 struct oldold_utsname;
 struct old_utsname;
 
-asmlinkage int old_mmap(struct mmap_arg_struct __user *);
 asmlinkage int sys_ipc(uint, int, int, int, void __user *, long);
 asmlinkage int sys_uname(struct old_utsname __user *);
 asmlinkage int sys_olduname(struct oldold_utsname __user *);
index 4eb2667b54aef5276139c9cebb5a2c725e6ba54b..daa65d9aae9569c872be666aa8513392d0723b6f 100644 (file)
 #define __ARCH_WANT_SYS_LLSEEK
 #define __ARCH_WANT_SYS_NICE
 #define __ARCH_WANT_SYS_OLD_GETRLIMIT
+#define __ARCH_WANT_SYS_OLD_MMAP
 #define __ARCH_WANT_SYS_OLD_SELECT
 #define __ARCH_WANT_SYS_OLDUMOUNT
 #define __ARCH_WANT_SYS_SIGPENDING
index 345dbd19a2b31c2118d53d70b393fed1511aa807..7955e90c8341504253f7e93010cf90c58f1b3d95 100644 (file)
 
 #include <asm/syscalls.h>
 
-/*
- * 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;
-};
-
-asmlinkage int old_mmap(struct mmap_arg_struct __user *arg)
-{
-       struct mmap_arg_struct a;
-       int err = -EFAULT;
-
-       if (copy_from_user(&a, arg, sizeof(a)))
-               goto out;
-
-       err = -EINVAL;
-       if (a.offset & ~PAGE_MASK)
-               goto out;
-
-       err = sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags,
-                       a.fd, a.offset >> PAGE_SHIFT);
-out:
-       return err;
-}
-
 /*
  * sys_ipc() is the de-multiplexer for the SysV IPC calls..
  *
index 4d10abacecdbc8b165130466c46c6e54eaca1514..8b3729341216c011a1599c752f457b1acc8fee44 100644 (file)
@@ -89,7 +89,7 @@ ENTRY(sys_call_table)
        .long sys_swapon
        .long sys_reboot
        .long sys_old_readdir
-       .long old_mmap          /* 90 */
+       .long sys_old_mmap      /* 90 */
        .long sys_munmap
        .long sys_truncate
        .long sys_ftruncate
index 85a9f21fe11a6626d8be998baf15e2d60ad98485..b60907e3b0d55ebca4390a82dab0b10151fa3936 100644 (file)
@@ -23,6 +23,7 @@ struct kexec_segment;
 struct linux_dirent;
 struct linux_dirent64;
 struct list_head;
+struct mmap_arg_struct;
 struct msgbuf;
 struct msghdr;
 struct mmsghdr;
@@ -838,4 +839,6 @@ asmlinkage long sys_perf_event_open(
 asmlinkage long sys_mmap_pgoff(unsigned long addr, unsigned long len,
                        unsigned long prot, unsigned long flags,
                        unsigned long fd, unsigned long pgoff);
+asmlinkage long sys_old_mmap(struct mmap_arg_struct __user *arg);
+
 #endif
index f1b4448626bf2698ed6cdb9b641b8e12aad21130..75557c639ad419c49aff37f1a57de548077f702d 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -1088,6 +1088,30 @@ out:
        return retval;
 }
 
+#ifdef __ARCH_WANT_SYS_OLD_MMAP
+struct mmap_arg_struct {
+       unsigned long addr;
+       unsigned long len;
+       unsigned long prot;
+       unsigned long flags;
+       unsigned long fd;
+       unsigned long offset;
+};
+
+SYSCALL_DEFINE1(old_mmap, struct mmap_arg_struct __user *, arg)
+{
+       struct mmap_arg_struct a;
+
+       if (copy_from_user(&a, arg, sizeof(a)))
+               return -EFAULT;
+       if (a.offset & ~PAGE_MASK)
+               return -EINVAL;
+
+       return sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd,
+                             a.offset >> PAGE_SHIFT);
+}
+#endif /* __ARCH_WANT_SYS_OLD_MMAP */
+
 /*
  * Some shared mappigns will want the pages marked read-only
  * to track write events. If so, we'll downgrade vm_page_prot
index b9b5cceb1b68261b3c88760a6e0a56d1d626818c..605ace8982a8dcbc14ac061ab824166a16220180 100644 (file)
@@ -1428,6 +1428,30 @@ out:
        return retval;
 }
 
+#ifdef __ARCH_WANT_SYS_OLD_MMAP
+struct mmap_arg_struct {
+       unsigned long addr;
+       unsigned long len;
+       unsigned long prot;
+       unsigned long flags;
+       unsigned long fd;
+       unsigned long offset;
+};
+
+SYSCALL_DEFINE1(old_mmap, struct mmap_arg_struct __user *, arg)
+{
+       struct mmap_arg_struct a;
+
+       if (copy_from_user(&a, arg, sizeof(a)))
+               return -EFAULT;
+       if (a.offset & ~PAGE_MASK)
+               return -EINVAL;
+
+       return sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd,
+                             a.offset >> PAGE_SHIFT);
+}
+#endif /* __ARCH_WANT_SYS_OLD_MMAP */
+
 /*
  * split a vma into two pieces at address 'addr', a new vma is allocated either
  * for the first part or the tail.