linux-mips
[Top] [All Lists]

Re: [PATCH] Fix some system calls with long long arguments

To: linux-mips@linux-mips.org
Subject: Re: [PATCH] Fix some system calls with long long arguments
From: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Date: Fri, 18 May 2007 00:46:13 +0900 (JST)
Cc: ralf@linux-mips.org, kraj@mvista.com, libc-ports@sourceware.org
In-reply-to: <20070316.015325.118975069.anemo@mba.ocn.ne.jp>
Original-recipient: rfc822;linux-mips@linux-mips.org
References: <20070309.003749.39154822.anemo@mba.ocn.ne.jp> <20070315.103511.89758184.nemoto@toshiba-tops.co.jp> <20070316.015325.118975069.anemo@mba.ocn.ne.jp>
Sender: linux-mips-bounce@linux-mips.org
On Fri, 16 Mar 2007 01:53:25 +0900 (JST), Atsushi Nemoto <anemo@mba.ocn.ne.jp> 
wrote:
> > Anyway we should take some action while current implementation is
> > broken (except N64).
> > 
> > Which is a way to go?
> 
> Here is a sample fix for N32 readahead and sync_file_range.

I fixed N32/O32 readahead, sync_file_range, fadvise, fadvise64
syscalls on both kernel and glibc side.

Here is a kernel side fixes.


Subject: [PATCH] Fix some system calls with long long arguments

* O32 fadvise64() pass long long arguments by register pairs.  Add
  sys32 version for 64 bit kernel.
* N32 readahead() can pass a long long argument by one register.  No
  need to use sys32_readahead.

Signed-off-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
---
 arch/mips/kernel/linux32.c     |   10 ++++++++++
 arch/mips/kernel/scall64-n32.S |    2 +-
 arch/mips/kernel/scall64-o32.S |    2 +-
 3 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c
index 37849ed..06e04da 100644
--- a/arch/mips/kernel/linux32.c
+++ b/arch/mips/kernel/linux32.c
@@ -556,6 +556,16 @@ asmlinkage long sys32_sync_file_range(int fd, int __pad,
                        flags);
 }
 
+asmlinkage long sys32_fadvise64_64(int fd, int __pad,
+       unsigned long a2, unsigned long a3,
+       unsigned long a4, unsigned long a5,
+       int flags)
+{
+       return sys_fadvise64_64(fd,
+                       merge_64(a2, a3), merge_64(a4, a5),
+                       flags);
+}
+
 save_static_function(sys32_clone);
 __attribute_used__ noinline static int
 _sys32_clone(nabi_no_regargs struct pt_regs regs)
diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S
index 6eac283..1631035 100644
--- a/arch/mips/kernel/scall64-n32.S
+++ b/arch/mips/kernel/scall64-n32.S
@@ -299,7 +299,7 @@ EXPORT(sysn32_call_table)
        PTR     sys_ni_syscall                  /* res. for afs_syscall */
        PTR     sys_ni_syscall                  /* res. for security */
        PTR     sys_gettid
-       PTR     sys32_readahead
+       PTR     sys_readahead
        PTR     sys_setxattr                    /* 6180 */
        PTR     sys_lsetxattr
        PTR     sys_fsetxattr
diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S
index 7e74b41..2aa9942 100644
--- a/arch/mips/kernel/scall64-o32.S
+++ b/arch/mips/kernel/scall64-o32.S
@@ -459,7 +459,7 @@ sys_call_table:
        PTR     sys_remap_file_pages
        PTR     sys_set_tid_address
        PTR     sys_restart_syscall
-       PTR     sys_fadvise64_64
+       PTR     sys32_fadvise64_64
        PTR     compat_sys_statfs64             /* 4255 */
        PTR     compat_sys_fstatfs64
        PTR     compat_sys_timer_create

<Prev in Thread] Current Thread [Next in Thread>