about summary refs log tree commit diff
diff options
context:
space:
mode:
authorIlya Leoshkevich <iii@linux.ibm.com>2018-08-10 09:07:42 +0200
committerStefan Liebler <stli@linux.ibm.com>2018-08-10 09:07:42 +0200
commitb215eee1e1dca1ed76678afff2710ed7a38aedc4 (patch)
tree956f6d266f79b77c311129e2c33b621609cd515d
parent329c6fec8b8c72e43948730d93ad80bf7447b36a (diff)
downloadglibc-b215eee1e1dca1ed76678afff2710ed7a38aedc4.tar.gz
glibc-b215eee1e1dca1ed76678afff2710ed7a38aedc4.tar.xz
glibc-b215eee1e1dca1ed76678afff2710ed7a38aedc4.zip
S390: Do not clobber R0 in 32-bit _dl_runtime_resolve
Preparation for the usage of R0 by __fentry__.

ChangeLog:

	* sysdeps/s390/s390-32/dl-trampoline.h (_dl_runtime_resolve):
	Do not clobber R0.
-rw-r--r--ChangeLog5
-rw-r--r--sysdeps/s390/s390-32/dl-trampoline.h10
2 files changed, 13 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 751186d350..8dd005990b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2018-08-10  Ilya Leoshkevich  <iii@linux.ibm.com>
 
+	* sysdeps/s390/s390-32/dl-trampoline.h (_dl_runtime_resolve):
+	Do not clobber R0.
+
+2018-08-10  Ilya Leoshkevich  <iii@linux.ibm.com>
+
 	* sysdeps/s390/s390-64/dl-trampoline.h (_dl_runtime_profile):
 	Use symbolic offsets for stack variables.
 
diff --git a/sysdeps/s390/s390-32/dl-trampoline.h b/sysdeps/s390/s390-32/dl-trampoline.h
index fa83b79926..da50d9e9dc 100644
--- a/sysdeps/s390/s390-32/dl-trampoline.h
+++ b/sysdeps/s390/s390-32/dl-trampoline.h
@@ -26,8 +26,9 @@
  *   v24, v26, v28, v30, v25, v27, v29, v31 : vector parameter registers
  *   24(r15), 28(r15) : PLT arguments PLT1, PLT2
  *   96(r15) : additional stack parameters
- * The normal clobber rules for function calls apply:
- *   r0 - r5 : call clobbered
+ * The slightly tightened normal clobber rules for function calls apply:
+ *   r0 : call saved (for __fentry__)
+ *   r1 - r5 : call clobbered
  *   r6 - r13 :	call saved
  *   r14 : return address (call clobbered)
  *   r15 : stack pointer (call saved)
@@ -50,6 +51,7 @@
 #define V29_OFF -144
 #define V30_OFF -128
 #define V31_OFF -112
+#define R0_OFF -76
 #define PLT1_OFF -72
 #define PLT2_OFF -68
 #define R2_OFF -64
@@ -65,6 +67,8 @@
 	cfi_startproc
 	.align 16
 _dl_runtime_resolve:
+	st     %r0,CFA_OFF+R0_OFF(%r15)
+	cfi_offset (r0, R0_OFF)
 	stm    %r2,%r5,CFA_OFF+R2_OFF(%r15) # save registers
 	cfi_offset (r2, R2_OFF)
 	cfi_offset (r3, R3_OFF)
@@ -119,6 +123,7 @@ _dl_runtime_resolve:
 	ld     %f0,CFA_OFF+F0_OFF(%r15)
 	ld     %f2,CFA_OFF+F2_OFF(%r15)
 	lm     %r2,%r5,CFA_OFF+R2_OFF(%r15)
+	l      %r0,CFA_OFF+R0_OFF(%r15)
 	br     %r1
 1:	.long  _dl_fixup - 0b
 	cfi_endproc
@@ -131,6 +136,7 @@ _dl_runtime_resolve:
 #undef V29_OFF
 #undef V30_OFF
 #undef V31_OFF
+#undef R0_OFF
 #undef PLT1_OFF
 #undef PLT2_OFF
 #undef R2_OFF