This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] S/390: Don't use r11 in INTERNAL_VSYSCALL_NCS macro
- From: "Andreas Krebbel" <krebbel at linux dot vnet dot ibm dot com>
- To: libc-alpha at sources dot redhat dot com
- Date: Wed, 13 Jul 2011 15:29:33 +0200
- Subject: [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. */