summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Johnston <jjohnstn@redhat.com>2009-05-13 18:28:49 +0000
committerJeff Johnston <jjohnstn@redhat.com>2009-05-13 18:28:49 +0000
commiteba36c51fa066f1a8abdc41c42b9f5310d181a12 (patch)
tree13ff297c715a20e246939569ab32ceed04e5f87c
parent40c66067fb5eef002be164b35aa3637403fc1e48 (diff)
downloadcygnal-eba36c51fa066f1a8abdc41c42b9f5310d181a12.tar.gz
cygnal-eba36c51fa066f1a8abdc41c42b9f5310d181a12.tar.bz2
cygnal-eba36c51fa066f1a8abdc41c42b9f5310d181a12.zip
2009-05-13 Paul Brook <paul@codesourcery.com>
* libc/machine/arm/setjmp.S: Add ARMv6-M implementation.
-rw-r--r--newlib/ChangeLog4
-rw-r--r--newlib/libc/machine/arm/setjmp.S51
2 files changed, 54 insertions, 1 deletions
diff --git a/newlib/ChangeLog b/newlib/ChangeLog
index c8876719d..01f0107ab 100644
--- a/newlib/ChangeLog
+++ b/newlib/ChangeLog
@@ -1,3 +1,7 @@
+2009-05-13 Paul Brook <paul@codesourcery.com>
+
+ * libc/machine/arm/setjmp.S: Add ARMv6-M implementation.
+
2009-05-13 Corinna Vinschen <corinna@vinschen.de>
* libc/locale/locale.c (setlocale): Don't build on Cygwin.
diff --git a/newlib/libc/machine/arm/setjmp.S b/newlib/libc/machine/arm/setjmp.S
index 4bb2a46a7..2181a1874 100644
--- a/newlib/libc/machine/arm/setjmp.S
+++ b/newlib/libc/machine/arm/setjmp.S
@@ -55,6 +55,55 @@
For Thumb-2 do everything in Thumb mode. */
+#if defined(__ARM_ARCH_6M__)
+/* ARMv6-M has to be implemented in Thumb mode. */
+
+.thumb
+.thumb_func
+ .globl SYM (setjmp)
+ TYPE (setjmp)
+SYM (setjmp):
+ /* Save registers in jump buffer. */
+ stmia r0!, {r4, r5, r6, r7}
+ mov r1, r8
+ mov r2, r9
+ mov r3, r10
+ mov r4, fp
+ mov r5, sp
+ mov r6, lr
+ stmia r0!, {r1, r2, r3, r4, r5, r6}
+ sub r0, r0, #40
+ /* Restore callee-saved low regs. */
+ ldmia r0!, {r4, r5, r6, r7}
+ /* Return zero. */
+ mov r0, #0
+ bx lr
+
+.thumb_func
+ .globl SYM (longjmp)
+ TYPE (longjmp)
+SYM (longjmp):
+ /* Restore High regs. */
+ add r0, r0, #16
+ ldmia r0!, {r2, r3, r4, r5, r6}
+ mov r8, r2
+ mov r9, r3
+ mov r10, r4
+ mov fp, r5
+ mov sp, r6
+ ldmia r0!, {r3} /* lr */
+ /* Restore low regs. */
+ sub r0, r0, #40
+ ldmia r0!, {r4, r5, r6, r7}
+ /* Return the result argument, or 1 if it is zero. */
+ mov r0, r1
+ bne 1f
+ mov r0, #1
+1:
+ bx r3
+
+#else
+
#ifdef __APCS_26__
#define RET movs pc, lr
#elif defined(__thumb2__)
@@ -169,4 +218,4 @@ SYM (\name):
moveq a1, #1
FUNC_END longjmp
-
+#endif