This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
[PATCH] PPC INTERNAL_SYSCALL fix
- From: Steve Munroe <sjmunroe at us dot ibm dot com>
- To: libc-alpha at sources dot redhat dot com, janis187 at us dot ibm dot com, Dwayne McConnell <dgm69 at us dot ibm dot com>, Marcus Meissner <meissner at suse dot de>
- Date: Fri, 07 May 2004 16:48:15 -0500
- Subject: [PATCH] PPC INTERNAL_SYSCALL fix
- Organization: IBM LTC
- Reply-to: sjmunroe at vnet dot ibm dot com
This patch fixes a problem in sched_setaffinity where the the usage:
INTERNAL_SYSCALL (sched_getaffinity, err, 3, getpid(), psize, p)
calls the getpid() function in the middle of the syscall setup. This
clobbered the r0 value which is the syscall#.
This patch assigns all parms to temporary longs before setting up the
syscall. This insures that the getpid() is complete before the syscall
is expanded.
Thanks to Marcus Meisser for finding this.
2004-04-29 Steven Munroe <sjmunroe@us.ibm.com>
* sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h (LOADARGS_1,
LOADARGS_2, LOADARGS_3, LOADARGS_4, LOADARGS_5, LOADARGS_6):
Load argument values into temporary variables.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h (LOADARGS_1,
LOADARGS_2, LOADARGS_3, LOADARGS_4, LOADARGS_5, LOADARGS_6):
Load argument values into temporary variables.
diff -urN libc23-cvstip-20040504/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h libc23/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h
--- libc23-cvstip-20040504/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h 2003-05-21 14:17:35.000000000 -0500
+++ libc23/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep.h 2004-05-04 14:14:50.000000000 -0500
@@ -114,42 +114,48 @@
# define LOADARGS_0(name, dummy) \
r0 = __NR_##name
-# define LOADARGS_1(name, arg1) \
+# define LOADARGS_1(name, __arg1) \
+ long arg1 = (long)(__arg1); \
LOADARGS_0(name, 0); \
extern void __illegally_sized_syscall_##name##_arg1 (void); \
- if (__builtin_classify_type (arg1) != 5 && sizeof (arg1) > 4) \
+ if (__builtin_classify_type (__arg1) != 5 && sizeof (__arg1) > 4) \
__illegally_sized_syscall_##name##_arg1 (); \
- r3 = (long) (arg1)
-# define LOADARGS_2(name, arg1, arg2) \
- LOADARGS_1(name, arg1); \
+ r3 = arg1
+# define LOADARGS_2(name, __arg1, __arg2) \
+ long arg2 = (long)(__arg2); \
+ LOADARGS_1(name, __arg1); \
extern void __illegally_sized_syscall_##name##_arg2 (void); \
- if (__builtin_classify_type (arg2) != 5 && sizeof (arg2) > 4) \
+ if (__builtin_classify_type (__arg2) != 5 && sizeof (__arg2) > 4) \
__illegally_sized_syscall_##name##_arg2 (); \
- r4 = (long) (arg2)
-# define LOADARGS_3(name, arg1, arg2, arg3) \
- LOADARGS_2(name, arg1, arg2); \
+ r4 = arg2
+# define LOADARGS_3(name, __arg1, __arg2, __arg3) \
+ long arg3 = (long)(__arg3); \
+ LOADARGS_2(name, __arg1, __arg2); \
extern void __illegally_sized_syscall_##name##_arg3 (void); \
- if (__builtin_classify_type (arg3) != 5 && sizeof (arg3) > 4) \
+ if (__builtin_classify_type (__arg3) != 5 && sizeof (__arg3) > 4) \
__illegally_sized_syscall_##name##_arg3 (); \
- r5 = (long) (arg3)
-# define LOADARGS_4(name, arg1, arg2, arg3, arg4) \
- LOADARGS_3(name, arg1, arg2, arg3); \
+ r5 = arg3
+# define LOADARGS_4(name, __arg1, __arg2, __arg3, __arg4) \
+ long arg4 = (long)(__arg4); \
+ LOADARGS_3(name, __arg1, __arg2, __arg3); \
extern void __illegally_sized_syscall_##name##_arg4 (void); \
- if (__builtin_classify_type (arg4) != 5 && sizeof (arg4) > 4) \
+ if (__builtin_classify_type (__arg4) != 5 && sizeof (__arg4) > 4) \
__illegally_sized_syscall_##name##_arg4 (); \
- r6 = (long) (arg4)
-# define LOADARGS_5(name, arg1, arg2, arg3, arg4, arg5) \
- LOADARGS_4(name, arg1, arg2, arg3, arg4); \
+ r6 = arg4
+# define LOADARGS_5(name, __arg1, __arg2, __arg3, __arg4, __arg5) \
+ long arg5 = (long)(__arg5); \
+ LOADARGS_4(name, __arg1, __arg2, __arg3, __arg4); \
extern void __illegally_sized_syscall_##name##_arg5 (void); \
- if (__builtin_classify_type (arg5) != 5 && sizeof (arg5) > 4) \
+ if (__builtin_classify_type (__arg5) != 5 && sizeof (__arg5) > 4) \
__illegally_sized_syscall_##name##_arg5 (); \
- r7 = (long) (arg5)
-# define LOADARGS_6(name, arg1, arg2, arg3, arg4, arg5, arg6) \
- LOADARGS_5(name, arg1, arg2, arg3, arg4, arg5); \
+ r7 = arg5
+# define LOADARGS_6(name, __arg1, __arg2, __arg3, __arg4, __arg5, __arg6) \
+ long arg6 = (long)(__arg6); \
+ LOADARGS_5(name, __arg1, __arg2, __arg3, __arg4, __arg5); \
extern void __illegally_sized_syscall_##name##_arg6 (void); \
- if (__builtin_classify_type (arg6) != 5 && sizeof (arg6) > 4) \
+ if (__builtin_classify_type (__arg6) != 5 && sizeof (__arg6) > 4) \
__illegally_sized_syscall_##name##_arg6 (); \
- r8 = (long) (arg6)
+ r8 = arg6
# define ASM_INPUT_0 "0" (r0)
# define ASM_INPUT_1 ASM_INPUT_0, "1" (r3)
diff -urN libc23-cvstip-20040504/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h libc23/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h
--- libc23-cvstip-20040504/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h 2003-05-21 14:17:35.000000000 -0500
+++ libc23/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep.h 2004-05-04 14:14:50.000000000 -0500
@@ -127,42 +127,48 @@
#define LOADARGS_0(name, dummy) \
r0 = __NR_##name
-#define LOADARGS_1(name, arg1) \
+#define LOADARGS_1(name, __arg1) \
+ long arg1 = (long)(__arg1); \
LOADARGS_0(name, 0); \
extern void __illegally_sized_syscall_##name##_arg1 (void); \
- if (__builtin_classify_type (arg1) != 5 && sizeof (arg1) > 8) \
+ if (__builtin_classify_type (__arg1) != 5 && sizeof (__arg1) > 8) \
__illegally_sized_syscall_##name##_arg1 (); \
- r3 = (long) (arg1)
-#define LOADARGS_2(name, arg1, arg2) \
- LOADARGS_1(name, arg1); \
+ r3 = arg1
+#define LOADARGS_2(name, __arg1, __arg2) \
+ long arg2 = (long)(__arg2); \
+ LOADARGS_1(name, __arg1); \
extern void __illegally_sized_syscall_##name##_arg2 (void); \
- if (__builtin_classify_type (arg2) != 5 && sizeof (arg2) > 8) \
+ if (__builtin_classify_type (__arg2) != 5 && sizeof (__arg2) > 8) \
__illegally_sized_syscall_##name##_arg2 (); \
- r4 = (long) (arg2)
-#define LOADARGS_3(name, arg1, arg2, arg3) \
- LOADARGS_2(name, arg1, arg2); \
+ r4 = arg2
+#define LOADARGS_3(name, __arg1, __arg2, __arg3) \
+ long arg3 = (long)(__arg3); \
+ LOADARGS_2(name, __arg1, __arg2); \
extern void __illegally_sized_syscall_##name##_arg3 (void); \
- if (__builtin_classify_type (arg3) != 5 && sizeof (arg3) > 8) \
+ if (__builtin_classify_type (__arg3) != 5 && sizeof (__arg3) > 8) \
__illegally_sized_syscall_##name##_arg3 (); \
- r5 = (long) (arg3)
-#define LOADARGS_4(name, arg1, arg2, arg3, arg4) \
- LOADARGS_3(name, arg1, arg2, arg3); \
+ r5 = arg3
+#define LOADARGS_4(name, __arg1, __arg2, __arg3, __arg4) \
+ long arg4 = (long)(__arg4); \
+ LOADARGS_3(name, __arg1, __arg2, __arg3); \
extern void __illegally_sized_syscall_##name##_arg4 (void); \
- if (__builtin_classify_type (arg4) != 5 && sizeof (arg4) > 8) \
+ if (__builtin_classify_type (__arg4) != 5 && sizeof (__arg4) > 8) \
__illegally_sized_syscall_##name##_arg4 (); \
- r6 = (long) (arg4)
-#define LOADARGS_5(name, arg1, arg2, arg3, arg4, arg5) \
- LOADARGS_4(name, arg1, arg2, arg3, arg4); \
+ r6 = arg4
+#define LOADARGS_5(name, __arg1, __arg2, __arg3, __arg4, __arg5) \
+ long arg5 = (long)(__arg5); \
+ LOADARGS_4(name, __arg1, __arg2, __arg3, __arg4); \
extern void __illegally_sized_syscall_##name##_arg5 (void); \
- if (__builtin_classify_type (arg5) != 5 && sizeof (arg5) > 8) \
+ if (__builtin_classify_type (__arg5) != 5 && sizeof (__arg5) > 8) \
__illegally_sized_syscall_##name##_arg5 (); \
- r7 = (long) (arg5)
-#define LOADARGS_6(name, arg1, arg2, arg3, arg4, arg5, arg6) \
- LOADARGS_5(name, arg1, arg2, arg3, arg4, arg5); \
+ r7 = arg5
+#define LOADARGS_6(name, __arg1, __arg2, __arg3, __arg4, __arg5, __arg6) \
+ long arg6 = (long)(__arg6); \
+ LOADARGS_5(name, __arg1, __arg2, __arg3, __arg4, __arg5); \
extern void __illegally_sized_syscall_##name##_arg6 (void); \
- if (__builtin_classify_type (arg6) != 5 && sizeof (arg6) > 8) \
+ if (__builtin_classify_type (__arg6) != 5 && sizeof (__arg6) > 8) \
__illegally_sized_syscall_##name##_arg6 (); \
- r8 = (long) (arg6)
+ r8 = arg6
#define ASM_INPUT_0 "0" (r0)
#define ASM_INPUT_1 ASM_INPUT_0, "1" (r3)