about summary refs log tree commit diff
path: root/sysdeps/arm/dl-tlsdesc.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/arm/dl-tlsdesc.S')
-rw-r--r--sysdeps/arm/dl-tlsdesc.S31
1 files changed, 12 insertions, 19 deletions
diff --git a/sysdeps/arm/dl-tlsdesc.S b/sysdeps/arm/dl-tlsdesc.S
index 1644a32793..e87e7fb001 100644
--- a/sysdeps/arm/dl-tlsdesc.S
+++ b/sysdeps/arm/dl-tlsdesc.S
@@ -186,7 +186,9 @@ _dl_tlsdesc_lazy_resolver:
 	.size	_dl_tlsdesc_lazy_resolver, .-_dl_tlsdesc_lazy_resolver
 
 /* Holder for lazy tls descriptors being resolve in another thread.
-   Same ABI as the lazy resolver itself.  */
+
+   Our calling convention is to clobber r0, r1 and the processor
+   flags.  All others that are modified must be saved */
 	.hidden _dl_tlsdesc_resolve_hold
 	.global	_dl_tlsdesc_resolve_hold
 	.type	_dl_tlsdesc_resolve_hold,#function
@@ -194,29 +196,20 @@ _dl_tlsdesc_lazy_resolver:
 	eabi_fnstart
 	.align 2
 _dl_tlsdesc_resolve_hold:
-	/* Tell the unwinder that r2 has already been pushed.  */
-	eabi_save ({r2})
-	cfi_adjust_cfa_offset (4)
+	eabi_save ({r2,r3,ip,lr})
+	push	{r2, r3, ip, lr}
+	cfi_adjust_cfa_offset (16)
 	cfi_rel_offset (r2, 0)
-	eabi_save ({r0,r1,r3,ip,lr})
-	push	{r0, r1, r3, ip, lr}
-	cfi_adjust_cfa_offset (20)
-	cfi_rel_offset (r0, 0)
-	cfi_rel_offset (r1, 4)
-	cfi_rel_offset (r3, 8)
-	cfi_rel_offset (ip, 12)
-	cfi_rel_offset (lr, 16)
-	adr	r2, _dl_tlsdesc_resolve_hold
+	cfi_rel_offset (r3, 4)
+	cfi_rel_offset (ip, 8)
+	cfi_rel_offset (lr, 12)
+	adr	r1, _dl_tlsdesc_resolve_hold
 	bl	_dl_tlsdesc_resolve_hold_fixup
-	pop	{r0, r1, r3, ip, lr}
-	cfi_adjust_cfa_offset (-20)
+	pop	{r2, r3, ip, lr}
+	cfi_adjust_cfa_offset (-16)
 	cfi_restore (lr)
 	cfi_restore (ip)
 	cfi_restore (r3)
-	cfi_restore (r1)
-	cfi_restore (r0)
-	pop	{r2}
-	cfi_adjust_cfa_offset (-4)
 	cfi_restore (r2)
 	sfi_breg r0, \
 	ldr     r1, [\B, #4]