Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony Green <green@moxielogic.com>2019-12-13 21:08:06 +0300
committerAnthony Green <green@moxielogic.com>2019-12-13 21:08:06 +0300
commit31227ba53d39ec1dac19a488c967ebbe9a04c19a (patch)
tree7a003993a68ed3889f16ce5dbd62fea3105ed90d
parent69772c43327727c49b7691717a7886fa1088d5bf (diff)
Fix setjmp/longjmp for the moxie port.
These functions needs to save and restore the stack frame, because that's where the return address is stored.
-rw-r--r--newlib/libc/include/machine/setjmp.h2
-rw-r--r--newlib/libc/machine/moxie/setjmp.S71
2 files changed, 48 insertions, 25 deletions
diff --git a/newlib/libc/include/machine/setjmp.h b/newlib/libc/include/machine/setjmp.h
index 25fdea28c..78a81b5d9 100644
--- a/newlib/libc/include/machine/setjmp.h
+++ b/newlib/libc/include/machine/setjmp.h
@@ -238,7 +238,7 @@ _BEGIN_STD_C
#endif
#ifdef __moxie__
-#define _JBLEN 16
+#define _JBLEN 19
#endif
#ifdef __CRX__
diff --git a/newlib/libc/machine/moxie/setjmp.S b/newlib/libc/machine/moxie/setjmp.S
index 6c2c015e3..ed261d54d 100644
--- a/newlib/libc/machine/moxie/setjmp.S
+++ b/newlib/libc/machine/moxie/setjmp.S
@@ -1,5 +1,5 @@
/* A setjmp.c for Moxie
- Copyright (C) 2009 Anthony Green
+ Copyright (C) 2009, 2019 Anthony Green
The authors hereby grant permission to use, copy, modify, distribute,
and license this software and its documentation for any purpose, provided
@@ -12,28 +12,31 @@
they apply. */
# setjmp/longjmp for moxie. The jmpbuf looks like this:
-#
-# Register jmpbuf offset
-# $r0 0x00
-# $r1 0x04
-# $r2 0x08
-# $r3 0x0c
-# $r4 0x10
-# $r5 0x14
-# $r6 0x18
-# $r7 0x1c
-# $r8 0x20
-# $r9 0x24
-# $r10 0x28
-# $r11 0x2c
-# $r12 0x30
-# $r13 0x34
-# $fp 0x38
-# $sp 0x3c
-
- .text
- .global setjmp
- .type setjmp,@function
+#
+# Register jmpbuf offset
+# $r0 0x00
+# $r1 0x04
+# $r2 0x08
+# $r3 0x0c
+# $r4 0x10
+# $r5 0x14
+# $r6 0x18
+# $r7 0x1c
+# $r8 0x20
+# $r9 0x24
+# $r10 0x28
+# $r11 0x2c
+# $r12 0x30
+# $r13 0x34
+# $fp 0x38
+# $sp 0x3c
+# stack frame fp 0x40
+# stack frame ra 0x44
+# stack frame sc 0x48
+
+ .text
+ .global setjmp
+ .type setjmp,@function
setjmp:
st.l ($r0), $r0
sto.l 0x04($r0), $r1
@@ -51,6 +54,13 @@ setjmp:
sto.l 0x34($r0), $r13
sto.l 0x38($r0), $sp
sto.l 0x3c($r0), $fp
+ ldo.l $r1, 0x0($fp)
+ sto.l 0x40($r0), $r1
+ ldo.l $r1, 0x04($fp)
+ sto.l 0x44($r0), $r1
+ ldo.l $r1, 0x08($fp)
+ sto.l 0x48($r0), $r1
+ ldo.l $r1, 0x04($r0)
xor $r0, $r0
ret
.Lend1:
@@ -62,7 +72,6 @@ longjmp:
ldi.l $r2, 0x00
cmp $r1, $r2
beq .Lreturn1
- ldo.l $r1, 0x04($r0)
ldo.l $r2, 0x08($r0)
ldo.l $r3, 0x0c($r0)
ldo.l $r4, 0x10($r0)
@@ -77,6 +86,13 @@ longjmp:
ldo.l $r13, 0x34($r0)
ldo.l $sp, 0x38($r0)
ldo.l $fp, 0x3c($r0)
+ ldo.l $r1, 0x40($r0)
+ sto.l 0x0($fp), $r1
+ ldo.l $r1, 0x44($r0)
+ sto.l 0x4($fp), $r1
+ ldo.l $r1, 0x48($r0)
+ sto.l 0x8($fp), $r1
+ ldo.l $r1, 0x04($r0)
mov $r0, $r1
ret
.Lreturn1:
@@ -95,6 +111,13 @@ longjmp:
ldo.l $r13, 0x34($r0)
ldo.l $sp, 0x38($r0)
ldo.l $fp, 0x3c($r0)
+ ldo.l $r1, 0x40($r0)
+ sto.l 0x0($fp), $r1
+ ldo.l $r1, 0x44($r0)
+ sto.l 0x4($fp), $r1
+ ldo.l $r1, 0x48($r0)
+ sto.l 0x8($fp), $r1
+ ldo.l $r1, 0x04($r0)
ldi.l $r0, 0x01
ret
.Lend2: