public inbox for libc-ports@sourceware.org
 help / color / mirror / Atom feed
* [PATCH, COMMITTED] BZ #15128 [AArch64] Save and restore q0-q7 on entry to dynamic linker.
@ 2013-12-18 12:05 Marcus Shawcroft
  2014-01-06 22:04 ` Andrew Pinski
  0 siblings, 1 reply; 3+ messages in thread
From: Marcus Shawcroft @ 2013-12-18 12:05 UTC (permalink / raw)
  To: libc-ports

[-- Attachment #1: Type: text/plain, Size: 229 bytes --]

This patch ensures that all argument passing registers are saved and
restored on entry to the dynamic linker and resolves BZ #15128.

Regression tested.  Committed to trunk.  Back port to 2.18 branch will follow.

Cheers
/Marcus

[-- Attachment #2: glibc-15128.txt --]
[-- Type: text/plain, Size: 4450 bytes --]

commit 18b991db8133f0cce3b61805e80dbb1e6f5e61e8
Author: Marcus Shawcroft <marcus.shawcroft@linaro.org>
Date:   Wed Dec 18 10:00:07 2013 +0000

    [AArch64] Save and restore q0-q7 on entry to dynamic linker.
    
    [BZ #15128] Ensure all argument passing registers are saved and
    restored on entry to dynamic linker.

diff --git a/NEWS b/NEWS
index 7886834..874ab33 100644
--- a/NEWS
+++ b/NEWS
@@ -12,17 +12,17 @@ Version 2.19
   156, 387, 431, 832, 926, 2801, 4772, 6786, 6787, 6807, 6810, 7003, 9954,
   10253, 10278, 11087, 11157, 11214, 12100, 12486, 13028, 13982, 13985,
   14029, 14032, 14120, 14143, 14155, 14547, 14699, 14752, 14876, 14910,
-  15004, 15048, 15089, 15218, 15268, 15277, 15308, 15362, 15374, 15400,
-  15425, 15427, 15483, 15522, 15531, 15532, 15593, 15601, 15608, 15609,
-  15610, 15632, 15640, 15670, 15672, 15680, 15681, 15723, 15734, 15735,
-  15736, 15748, 15749, 15754, 15760, 15763, 15764, 15797, 15799, 15825,
-  15843, 15844, 15847, 15849, 15855, 15856, 15857, 15859, 15867, 15886,
-  15887, 15890, 15892, 15893, 15895, 15897, 15901, 15905, 15909, 15915,
-  15917, 15919, 15921, 15923, 15939, 15941, 15948, 15963, 15966, 15985,
-  15988, 15997, 16032, 16034, 16036, 16037, 16038, 16041, 16055, 16071,
-  16072, 16074, 16077, 16078, 16103, 16112, 16143, 16144, 16146, 16150,
-  16151, 16153, 16167, 16172, 16195, 16214, 16245, 16271, 16274, 16283,
-  16289, 16314, 16316, 16330.
+  15004, 15048, 15089, 15128, 15218, 15268, 15277, 15308, 15362, 15374,
+  15400, 15425, 15427, 15483, 15522, 15531, 15532, 15593, 15601, 15608,
+  15609, 15610, 15632, 15640, 15670, 15672, 15680, 15681, 15723, 15734,
+  15735, 15736, 15748, 15749, 15754, 15760, 15763, 15764, 15797, 15799,
+  15825, 15843, 15844, 15847, 15849, 15855, 15856, 15857, 15859, 15867,
+  15886, 15887, 15890, 15892, 15893, 15895, 15897, 15901, 15905, 15909,
+  15915, 15917, 15919, 15921, 15923, 15939, 15941, 15948, 15963, 15966,
+  15985, 15988, 15997, 16032, 16034, 16036, 16037, 16038, 16041, 16055,
+  16071, 16072, 16074, 16077, 16078, 16103, 16112, 16143, 16144, 16146,
+  16150, 16151, 16153, 16167, 16172, 16195, 16214, 16245, 16271, 16274,
+  16283, 16289, 16314, 16316, 16330.
 
 * The public headers no longer use __unused nor __block.  This change is to
   support compiling programs that are derived from BSD sources and use
diff --git a/ports/ChangeLog.aarch64 b/ports/ChangeLog.aarch64
index b1f6729..279a227 100644
--- a/ports/ChangeLog.aarch64
+++ b/ports/ChangeLog.aarch64
@@ -1,3 +1,9 @@
+2013-12-18  Marcus Shawcroft  <marcus.shawcroft@linaro.org>
+
+	[BZ #15128]
+	* sysdeps/aarch64/dl-trampoline.S (_dl_runtime_resolve): Save and
+	restore q0-q7.
+
 2013-12-17  Marcus Shawcroft  <marcus.shawcroft@linaro.org>
 
 	* sysdeps/unix/sysv/linux/aarch64/nptl/lowlevellock.h
diff --git a/ports/sysdeps/aarch64/dl-trampoline.S b/ports/sysdeps/aarch64/dl-trampoline.S
index 94c69a0..923ca76 100644
--- a/ports/sysdeps/aarch64/dl-trampoline.S
+++ b/ports/sysdeps/aarch64/dl-trampoline.S
@@ -41,7 +41,7 @@ _dl_runtime_resolve:
 	cfi_rel_offset (lr, 8)
 
 	/* Save arguments.  */
-	stp	x8, x9, [sp, #-80]!
+	stp	x8, x9, [sp, #-(80+8*16)]!
 	cfi_adjust_cfa_offset (80)
 	cfi_rel_offset (x8, 0)
 	cfi_rel_offset (x9, 8)
@@ -62,11 +62,27 @@ _dl_runtime_resolve:
 	cfi_rel_offset (x0, 64)
 	cfi_rel_offset (x1, 72)
 
+	stp	q0, q1, [sp, #(80+0*16)]
+	cfi_rel_offset (q0, 80+0*16)
+	cfi_rel_offset (q1, 80+1*16)
+
+	stp	q2, q3, [sp, #(80+2*16)]
+	cfi_rel_offset (q0, 80+2*16)
+	cfi_rel_offset (q1, 80+3*16)
+
+	stp	q4, q5, [sp, #(80+4*16)]
+	cfi_rel_offset (q0, 80+4*16)
+	cfi_rel_offset (q1, 80+5*16)
+
+	stp	q6, q7, [sp, #(80+6*16)]
+	cfi_rel_offset (q0, 80+6*16)
+	cfi_rel_offset (q1, 80+7*16)
+
 	/* Get pointer to linker struct.  */
 	ldr	x0, [ip0, #-8]
 
 	/* Prepare to call _dl_fixup().  */
-	ldr	x1, [sp, 80]	/* Recover &PLTGOT[n] */
+	ldr	x1, [sp, 80+8*16]	/* Recover &PLTGOT[n] */
 
 	sub     x1, x1, ip0
 	add     x1, x1, x1, lsl #1
@@ -81,12 +97,16 @@ _dl_runtime_resolve:
 	mov	ip0, x0
 
 	/* Get arguments and return address back.  */
+	ldp	q0, q1, [sp, #(80+0*16)]
+	ldp	q2, q3, [sp, #(80+2*16)]
+	ldp	q4, q5, [sp, #(80+4*16)]
+	ldp	q6, q7, [sp, #(80+6*16)]
 	ldp	x0, x1, [sp, #64]
 	ldp	x2, x3, [sp, #48]
 	ldp	x4, x5, [sp, #32]
 	ldp	x6, x7, [sp, #16]
-	ldp	x8, x9, [sp], #80
-	cfi_adjust_cfa_offset (-80)
+	ldp	x8, x9, [sp], #(80+8*16)
+	cfi_adjust_cfa_offset (-(80+8*16))
 
 	ldp	ip1, lr, [sp], #16
 	cfi_adjust_cfa_offset (-16)

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH, COMMITTED] BZ #15128 [AArch64] Save and restore q0-q7 on entry to dynamic linker.
  2013-12-18 12:05 [PATCH, COMMITTED] BZ #15128 [AArch64] Save and restore q0-q7 on entry to dynamic linker Marcus Shawcroft
@ 2014-01-06 22:04 ` Andrew Pinski
  2014-01-07 10:19   ` Marcus Shawcroft
  0 siblings, 1 reply; 3+ messages in thread
From: Andrew Pinski @ 2014-01-06 22:04 UTC (permalink / raw)
  To: Marcus Shawcroft; +Cc: libc-ports

On Wed, Dec 18, 2013 at 4:05 AM, Marcus Shawcroft
<marcus.shawcroft@linaro.org> wrote:
> This patch ensures that all argument passing registers are saved and
> restored on entry to the dynamic linker and resolves BZ #15128.
>
> Regression tested.  Committed to trunk.  Back port to 2.18 branch will follow.


There is a bug in this patch:
- stp x8, x9, [sp, #-80]!
+ stp x8, x9, [sp, #-(80+8*16)]!
  cfi_adjust_cfa_offset (80)


You forgot to update the cfi_adjust_cfa_offset to be 80+8*16.

Thanks,
Andrew Pinski

>
> Cheers
> /Marcus

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH, COMMITTED] BZ #15128 [AArch64] Save and restore q0-q7 on entry to dynamic linker.
  2014-01-06 22:04 ` Andrew Pinski
@ 2014-01-07 10:19   ` Marcus Shawcroft
  0 siblings, 0 replies; 3+ messages in thread
From: Marcus Shawcroft @ 2014-01-07 10:19 UTC (permalink / raw)
  To: Andrew Pinski; +Cc: libc-ports

On 6 January 2014 22:04, Andrew Pinski <pinskia@gmail.com> wrote:

> You forgot to update the cfi_adjust_cfa_offset to be 80+8*16.

Thanks for pointing that out, fix here:
https://sourceware.org/ml/libc-ports/2014-01/msg00018.html

/Marcus

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2014-01-07 10:19 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-12-18 12:05 [PATCH, COMMITTED] BZ #15128 [AArch64] Save and restore q0-q7 on entry to dynamic linker Marcus Shawcroft
2014-01-06 22:04 ` Andrew Pinski
2014-01-07 10:19   ` Marcus Shawcroft

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).