On Sat, 17 Feb 2007 00:43:29 +0900 (JST), Atsushi Nemoto <anemo@mba.ocn.ne.jp>
wrote:
> 1) unistd.h defines __NR_fadvise64 for all ABI but no
> __NR_fadvise64_64. But sys_fadvise64_64 is used for all syscall
> entries. For N64, sys_fadvise64 and sys_fadvise64_64 are same so no
> problem, but for other ABIs size of 'len' argument cause mismatch
> between kernel and libc.
>
> 2) On O32, glibc pass a 'long long' argument by hi and lo words, but
> kernel needs padding word between 'fd' and 'offset' argument.
>
> 3) On N32, glibc pass a 'long long' argument by hi and lo words, but
> kernel expects a single register value for 'long long' argument.
>
> 4) __ARCH_WANT_SYS_FADVISE64 is defined in unistd.h but sys_fadvise64
> is not used.
>
> What is preferred way to fix those issues?
>
> It seems N64 do not need any fix.
>
> For N32 and O32, kernel should be fixed anyway, but which syscall
> should be supported? And whether kernel or libc should take care of
> 'long long' issue?
Then how about this absolutely untested patch?
diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S
index 7c0b393..4d46b1d 100644
--- a/arch/mips/kernel/scall32-o32.S
+++ b/arch/mips/kernel/scall32-o32.S
@@ -596,7 +596,7 @@ einval: li v0, -EINVAL
sys sys_remap_file_pages 5
sys sys_set_tid_address 1
sys sys_restart_syscall 0
- sys sys_fadvise64_64 7
+ sys _sys_fadvise64 5
sys sys_statfs64 3 /* 4255 */
sys sys_fstatfs64 2
sys sys_timer_create 3
@@ -647,7 +647,7 @@ einval: li v0, -EINVAL
sys sys_ppoll 5
sys sys_unshare 1
sys sys_splice 4
- sys sys_sync_file_range 7 /* 4305 */
+ sys _sys_sync_file_range 6 /* 4305 */
sys sys_tee 4
sys sys_vmsplice 4
sys sys_move_pages 6
@@ -656,6 +656,7 @@ einval: li v0, -EINVAL
sys sys_kexec_load 4
sys sys_getcpu 3
sys sys_epoll_pwait 6
+ sys _sys_fadvise64_64 6
.endm
/* We pre-compute the number of _instruction_ bytes needed to
diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S
index f17e31e..2013773 100644
--- a/arch/mips/kernel/scall64-n32.S
+++ b/arch/mips/kernel/scall64-n32.S
@@ -336,7 +336,7 @@ EXPORT(sysn32_call_table)
PTR sys_set_tid_address
PTR sys_restart_syscall
PTR compat_sys_semtimedop /* 6215 */
- PTR sys_fadvise64_64
+ PTR _sys_fadvise64
PTR compat_sys_statfs64
PTR compat_sys_fstatfs64
PTR sys_sendfile64
@@ -397,3 +397,4 @@ EXPORT(sysn32_call_table)
PTR compat_sys_kexec_load
PTR sys_getcpu
PTR compat_sys_epoll_pwait
+ PTR _sys_fadvise64_64
diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S
index 142c9b7..3cc443b 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 _sys_fadvise64
PTR compat_sys_statfs64 /* 4255 */
PTR compat_sys_fstatfs64
PTR compat_sys_timer_create
@@ -519,4 +519,5 @@ sys_call_table:
PTR compat_sys_kexec_load
PTR sys_getcpu
PTR compat_sys_epoll_pwait
+ PTR _sys_fadvise64_64
.size sys_call_table,.-sys_call_table
diff --git a/arch/mips/kernel/syscall.c b/arch/mips/kernel/syscall.c
index 26e1a7e..ab8af1c 100644
--- a/arch/mips/kernel/syscall.c
+++ b/arch/mips/kernel/syscall.c
@@ -435,3 +435,29 @@ int kernel_execve(const char *filename,
return -__v0;
}
+
+#if defined(CONFIG_32BIT) || defined(CONFIG_MIPS32_COMPAT)
+#ifdef __BIG_ENDIAN
+#define merge_64(r1,r2) (((u64)(r1) << 32) + ((u32)(r2)))
+#else
+#define merge_64(r1,r2) (((u64)(r2) << 32) + ((u32)(r1)))
+#endif
+asmlinkage long _sys_fadvise64_64(int fd, long a1, long a2, long a3, long a4,
+ int advice)
+{
+ return sys_fadvise64_64(fd, merge_64(a1, a2), merge_64(a3, a4),
+ advice);
+}
+
+asmlinkage long _sys_fadvise64(int fd, long a1, long a2, size_t len, int
advice)
+{
+ return sys_fadvise64_64(fd, merge_64(a1, a2), len, advice);
+}
+
+asmlinkage long _sys_sync_file_range(int fd, long a1, long a2, long a3, long
a4,
+ unsigned int flags)
+{
+ return sys_sync_file_range(fd, merge_64(a1, a2), merge_64(a3, a4),
+ flags);
+}
+#endif
diff --git a/include/asm-mips/unistd.h b/include/asm-mips/unistd.h
index 696cff3..bf3ff4a 100644
--- a/include/asm-mips/unistd.h
+++ b/include/asm-mips/unistd.h
@@ -334,6 +334,7 @@
#define __NR_kexec_load (__NR_Linux + 311)
#define __NR_getcpu (__NR_Linux + 312)
#define __NR_epoll_pwait (__NR_Linux + 313)
+#define __NR_fadvise64_64 (__NR_Linux + 314)
/*
* Offset of the last Linux o32 flavoured syscall
@@ -918,6 +919,7 @@
#define __NR_kexec_load (__NR_Linux + 274)
#define __NR_getcpu (__NR_Linux + 275)
#define __NR_epoll_pwait (__NR_Linux + 276)
+#define __NR_fadvise64_64 (__NR_Linux + 277)
/*
* Offset of the last N32 flavoured syscall
|