This is the mail archive of the libc-alpha@sourceware.org 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] S/390: Don't use r11 in INTERNAL_VSYSCALL_NCS macro


Hi,

as Jakub pointed out in:

https://bugzilla.redhat.com/show_bug.cgi?id=718215

clobbering r11 in the vsyscall macro might collide with r11 being used
as soft frame pointer when using alloca or dynamically sized arrays.

Tested on s390x - no regressions.

Bye,

-Andreas-


2011-07-13  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>

	* sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h
	(INTERNAL_VSYSCALL_NCS): Use r10 for backing up the return address
	register in order to avoid conflicts with the soft frame pointer
	being held in r11 when necessary.
	* sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
	(INTERNAL_VSYSCALL_NCS): Likewise.


Index: glibc/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h
===================================================================
--- glibc.orig/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h
+++ glibc/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h
@@ -50,7 +50,7 @@
    even if the call succeeded.  E.g., the `lseek' system call might return
    a large offset.  Therefore we must not anymore test for < 0, but test
    for a real error by making sure the value in gpr2 is a real error
-   number.  Linus said he will make sure the no syscall returns a value
+   number.  Linus said he will make sure that no syscall returns a value
    in -1 .. -4095 as a valid result so we can savely test with -4095.  */
 
 #undef PSEUDO
@@ -368,12 +368,12 @@
     DECLARGS_##nr(args)							      \
     register long _ret asm("2");						      \
     asm volatile (							      \
-    "lr 11,14\n\t"							      \
+    "lr 10,14\n\t"                                                           \
     "basr 14,%1\n\t"							      \
-    "lr 14,11\n\t"							      \
+    "lr 14,10\n\t"                                                           \
     : "=d" (_ret)							      \
     : "d" (fn) ASMFMT_##nr						      \
-    : "cc", "memory", "0", "1", "11" CLOBBER_##nr);			      \
+    : "cc", "memory", "0", "1", "10" CLOBBER_##nr);                          \
     _ret; })
 
 /* Pointer mangling support.  */
Index: glibc/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
===================================================================
--- glibc.orig/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
+++ glibc/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
@@ -62,7 +62,7 @@
    even if the call succeeded.	E.g., the `lseek' system call might return
    a large offset.  Therefore we must not anymore test for < 0, but test
    for a real error by making sure the value in gpr2 is a real error
-   number.  Linus said he will make sure the no syscall returns a value
+   number.  Linus said he will make sure that no syscall returns a value
    in -1 .. -4095 as a valid result so we can savely test with -4095.  */
 
 #undef PSEUDO
@@ -370,12 +370,12 @@
     DECLARGS_##nr(args)							      \
     register long _ret asm("2");					      \
     asm volatile (							      \
-    "lgr 11,14\n\t"							      \
+    "lgr 10,14\n\t"                                                          \
     "basr 14,%1\n\t"							      \
-    "lgr 14,11\n\t"							      \
+    "lgr 14,10\n\t"                                                          \
     : "=d" (_ret)							      \
     : "a" (fn) ASMFMT_##nr						      \
-    : "cc", "memory", "0", "1", "11" CLOBBER_##nr);			      \
+    : "cc", "memory", "0", "1", "10" CLOBBER_##nr);                          \
     _ret; })
 
 /* Pointer mangling support.  */


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