This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] PPC INTERNAL_SYSCALL fix


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)

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]