فهرست منبع

fix posix_fadvise syscall args on powerpc, unify with arm fix

commit 6d38c9cf80f47623e5e48190046673bbd0dc410b provided an
arm-specific version of posix_fadvise to address the alternate
argument order the kernel expects on arm, but neglected to address
that powerpc (32-bit) has the same issue. instead of having arch
variant files in duplicate, simply put the alternate version in the
top-level file under the control of a macro defined in syscall_arch.h.
Rich Felker 8 سال پیش
والد
کامیت
3dd27f3aab
4فایلهای تغییر یافته به همراه12 افزوده شده و 12 حذف شده
  1. 2 0
      arch/arm/syscall_arch.h
  2. 2 0
      arch/powerpc/syscall_arch.h
  3. 0 12
      src/fcntl/arm/posix_fadvise.c
  4. 8 0
      src/fcntl/posix_fadvise.c

+ 2 - 0
arch/arm/syscall_arch.h

@@ -76,3 +76,5 @@ static inline long __syscall6(long n, long a, long b, long c, long d, long e, lo
 #define VDSO_USEFUL
 #define VDSO_CGT_SYM "__vdso_clock_gettime"
 #define VDSO_CGT_VER "LINUX_2.6"
+
+#define SYSCALL_FADVISE_6_ARG

+ 2 - 0
arch/powerpc/syscall_arch.h

@@ -5,3 +5,5 @@
 
 #undef SYSCALL_NO_INLINE
 #define SYSCALL_NO_INLINE
+
+#define SYSCALL_FADVISE_6_ARG

+ 0 - 12
src/fcntl/arm/posix_fadvise.c

@@ -1,12 +0,0 @@
-#include <fcntl.h>
-#include "syscall.h"
-#include "libc.h"
-
-int posix_fadvise(int fd, off_t base, off_t len, int advice)
-{
-	/* ARM-specific syscall argument order */
-	return -__syscall(SYS_fadvise, fd, advice,
-		__SYSCALL_LL_E(base), __SYSCALL_LL_E(len));
-}
-
-LFS64(posix_fadvise);

+ 8 - 0
src/fcntl/posix_fadvise.c

@@ -4,8 +4,16 @@
 
 int posix_fadvise(int fd, off_t base, off_t len, int advice)
 {
+#if defined(SYSCALL_FADVISE_6_ARG)
+	/* Some archs, at least arm and powerpc, have the syscall
+	 * arguments reordered to avoid needing 7 argument registers
+	 * due to 64-bit argument alignment. */
+	return -__syscall(SYS_fadvise, fd, advice,
+		__SYSCALL_LL_E(base), __SYSCALL_LL_E(len));
+#else
 	return -__syscall(SYS_fadvise, fd, __SYSCALL_LL_O(base),
 		__SYSCALL_LL_E(len), advice);
+#endif
 }
 
 LFS64(posix_fadvise);