[PATCH] Fix setjmp/longjmp for moxie

Anthony Green <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <CACxje5-bDQ6-x35RkWTNzEr+=gj=jZdykSwy=_se8EDX43QfXA@mail.gmail.com>
The moxie port has a very old setjmp/longjmp bug that this patch
remedies.   I plan on checking in this fix, which saves and restores
the stack frame as part of setjmp/longjmp.

Thanks,

AG

---
 newlib/libc/include/machine/setjmp.h |  2 +-
 newlib/libc/machine/moxie/setjmp.S   | 71 ++++++++++++++++++----------
 2 files changed, 48 insertions(+), 25 deletions(-)

diff --git a/newlib/libc/include/machine/setjmp.h
b/newlib/libc/include/machine/setjmp.h
index 25fdea2..78a81b5 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 6c2c015..ed261d5 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:
--
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.