This is the mail archive of the
glibc-cvs@sourceware.org
mailing list for the glibc project.
GNU C Library master sources branch roland/arm-avoid-pc created. glibc-2.17-318-gd3f60a7
- From: roland at sourceware dot org
- To: glibc-cvs at sourceware dot org
- Date: 2 Mar 2013 00:34:55 -0000
- Subject: GNU C Library master sources branch roland/arm-avoid-pc created. glibc-2.17-318-gd3f60a7
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".
The branch, roland/arm-avoid-pc has been created
at d3f60a72df5f2cc46b8f71bcf9b3fed2e5486ec2 (commit)
- Log -----------------------------------------------------------------
http://sources.redhat.com/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=d3f60a72df5f2cc46b8f71bcf9b3fed2e5486ec2
commit d3f60a72df5f2cc46b8f71bcf9b3fed2e5486ec2
Author: Roland McGrath <roland@hack.frob.com>
Date: Fri Mar 1 16:34:15 2013 -0800
ARM: Support avoiding pc as destination register.
diff --git a/ports/ChangeLog.arm b/ports/ChangeLog.arm
index 28ec8f9..699f751 100644
--- a/ports/ChangeLog.arm
+++ b/ports/ChangeLog.arm
@@ -1,3 +1,9 @@
+2013-03-01 Roland McGrath <roland@hack.frob.com>
+
+ * sysdeps/arm/arm-features.h: Add comment about ARM_NO_PC_DEST.
+ * sysdeps/arm/memcpy.S [ARM_NO_PC_DEST]: Avoid pc as destination.
+ * sysdeps/arm/memmove.S [ARM_NO_PC_DEST]: Likewise.
+
2013-02-28 Richard Henderson <rth@redhat.com>
* sysdeps/arm/preconfigure: Adjust scan for __ARM_ARCH_* defines.
diff --git a/ports/sysdeps/arm/arm-features.h b/ports/sysdeps/arm/arm-features.h
index 31801cf..63fd692 100644
--- a/ports/sysdeps/arm/arm-features.h
+++ b/ports/sysdeps/arm/arm-features.h
@@ -36,4 +36,9 @@
at runtime (or that we never care about its state) and so need not
be checked for. */
+/* An OS-specific arm-features.h file may define ARM_NO_PC_DEST to
+ indicate that instructions using pc as a destination register
+ must never be used. */
+#define ARM_NO_PC_DEST 1 /* XXX testing */
+
#endif /* arm-features.h */
diff --git a/ports/sysdeps/arm/memcpy.S b/ports/sysdeps/arm/memcpy.S
index 98b9b47..a8691aa 100644
--- a/ports/sysdeps/arm/memcpy.S
+++ b/ports/sysdeps/arm/memcpy.S
@@ -88,7 +88,12 @@ ENTRY(memcpy)
CALGN( bcs 2f )
CALGN( adr r4, 6f )
CALGN( subs r2, r2, r3 ) @ C gets set
+#ifndef ARM_NO_PC_DEST
CALGN( add pc, r4, ip )
+#else
+ CALGN( add r4, r4, ip )
+ CALGN( bx r4 )
+#endif
PLD( pld [r1, #0] )
2: PLD( subs r2, r2, #96 )
@@ -107,8 +112,16 @@ ENTRY(memcpy)
5: ands ip, r2, #28
rsb ip, ip, #32
+#ifndef ARM_NO_PC_DEST
addne pc, pc, ip @ C is always clear here
b 7f
+#else
+ beq 7f
+ push r10
+ cfi_adjust_cfa_offset (4)
+ add r10, pc, ip
+ bx r10
+#endif
6: nop
ldr r3, [r1], #4
ldr r4, [r1], #4
@@ -118,8 +131,13 @@ ENTRY(memcpy)
ldr r8, [r1], #4
ldr lr, [r1], #4
+#ifndef ARM_NO_PC_DEST
add pc, pc, ip
nop
+#else
+ add r10, pc, ip
+ bx r10
+#endif
nop
str r3, [r0], #4
str r4, [r0], #4
@@ -129,6 +147,11 @@ ENTRY(memcpy)
str r8, [r0], #4
str lr, [r0], #4
+#ifndef ARM_NO_PC_DEST
+ pop r10
+ cfi_adjust_cfa_offset (-4)
+#endif
+
CALGN( bcs 2b )
7: ldmfd sp!, {r5 - r8}
@@ -146,7 +169,8 @@ ENTRY(memcpy)
strcsb r4, [r0], #1
strcsb ip, [r0]
-#if defined (__ARM_ARCH_4T__) && defined(__THUMB_INTERWORK__)
+#if ((defined (__ARM_ARCH_4T__) && defined(__THUMB_INTERWORK__)) \
+ || defined (ARM_NO_PC_DEST))
ldmfd sp!, {r0, r4, lr}
cfi_adjust_cfa_offset (-12)
cfi_restore (r4)
diff --git a/ports/sysdeps/arm/memmove.S b/ports/sysdeps/arm/memmove.S
index 059ca7a..f3f3935 100644
--- a/ports/sysdeps/arm/memmove.S
+++ b/ports/sysdeps/arm/memmove.S
@@ -104,7 +104,12 @@ ENTRY(memmove)
CALGN( bcs 2f )
CALGN( adr r4, 6f )
CALGN( subs r2, r2, ip ) @ C is set here
+#ifndef ARM_NO_PC_DEST
CALGN( add pc, r4, ip )
+#else
+ CALGN( add r4, r4, ip )
+ CALGN( bx r4 )
+#endif
PLD( pld [r1, #-4] )
2: PLD( subs r2, r2, #96 )
@@ -123,8 +128,16 @@ ENTRY(memmove)
5: ands ip, r2, #28
rsb ip, ip, #32
+#ifndef ARM_NO_PC_DEST
addne pc, pc, ip @ C is always clear here
b 7f
+#else
+ beq 7f
+ push r10
+ cfi_adjust_cfa_offset (4)
+ add r10, pc, ip
+ bx r10
+#endif
6: nop
ldr r3, [r1, #-4]!
ldr r4, [r1, #-4]!
@@ -134,8 +147,13 @@ ENTRY(memmove)
ldr r8, [r1, #-4]!
ldr lr, [r1, #-4]!
+#ifndef ARM_NO_PC_DEST
add pc, pc, ip
nop
+#else
+ add r10, pc, ip
+ bx r10
+#endif
nop
str r3, [r0, #-4]!
str r4, [r0, #-4]!
@@ -145,6 +163,11 @@ ENTRY(memmove)
str r8, [r0, #-4]!
str lr, [r0, #-4]!
+#ifndef ARM_NO_PC_DEST
+ pop r10
+ cfi_adjust_cfa_offset (-4)
+#endif
+
CALGN( bcs 2b )
7: ldmfd sp!, {r5 - r8}
@@ -162,7 +185,8 @@ ENTRY(memmove)
strcsb r4, [r0, #-1]!
strcsb ip, [r0, #-1]
-#if defined (__ARM_ARCH_4T__) && defined (__THUMB_INTERWORK__)
+#if ((defined (__ARM_ARCH_4T__) && defined (__THUMB_INTERWORK__)) \
+ || defined (ARM_NO_PC_DEST))
ldmfd sp!, {r0, r4, lr}
cfi_adjust_cfa_offset (-12)
cfi_restore (r4)
-----------------------------------------------------------------------
hooks/post-receive
--
GNU C Library master sources