libbase: setjmp/longjmp
authorSebastien Bourdeauducq <sebastien@milkymist.org>
Fri, 25 May 2012 20:28:38 +0000 (22:28 +0200)
committerSebastien Bourdeauducq <sebastien@milkymist.org>
Fri, 25 May 2012 20:28:38 +0000 (22:28 +0200)
software/include/base/setjmp.h [new file with mode: 0644]
software/libbase/Makefile
software/libbase/setjmp.S [new file with mode: 0644]

diff --git a/software/include/base/setjmp.h b/software/include/base/setjmp.h
new file mode 100644 (file)
index 0000000..c4246c1
--- /dev/null
@@ -0,0 +1,12 @@
+#ifndef __SETJMP_H
+#define __SETJMP_H
+
+#define _JBLEN 19
+
+typedef        int jmp_buf[_JBLEN];
+
+int setjmp(jmp_buf env);
+void longjmp(jmp_buf env, int val);
+
+#endif /* __SETJMP_H */
+
index 027af87fdd985484cedabd056c6c4b76d29b6864..ddb3f5cffb63effb7e7bada1e49af62d2f3f5767 100644 (file)
@@ -1,7 +1,7 @@
 M2DIR=../..
 include $(M2DIR)/software/common.mak
 
-OBJECTS=divsi3.o libc.o crc16.o crc32.o console.o timer.o system.o board.o uart.o softfloat.o softfloat-glue.o vsnprintf.o atof.o
+OBJECTS=divsi3.o setjmp.o libc.o crc16.o crc32.o console.o timer.o system.o board.o uart.o softfloat.o softfloat-glue.o vsnprintf.o atof.o
 
 all: libbase.a
 
diff --git a/software/libbase/setjmp.S b/software/libbase/setjmp.S
new file mode 100644 (file)
index 0000000..666df5e
--- /dev/null
@@ -0,0 +1,94 @@
+/* 
+ * setjmp/longjmp for LatticeMico32.
+ * Contributed by Jon Beniston <jon@beniston.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+       .section        .text
+       .align  4
+
+       .globl  setjmp
+       .type   setjmp,@function
+       .globl  longjmp
+       .type   longjmp,@function
+
+/* setjmp: save all callee saves into jmp_buf
+   r1 - Address of jmp_buf
+*/
+
+setjmp:
+        sw      (r1+0), r11
+        sw      (r1+4), r12
+        sw      (r1+8), r13
+        sw      (r1+12), r14
+        sw      (r1+16), r15
+        sw      (r1+20), r16
+        sw      (r1+24), r17
+        sw      (r1+28), r18
+        sw      (r1+32), r19
+        sw      (r1+36), r20
+        sw      (r1+40), r21
+        sw      (r1+44), r22
+        sw      (r1+48), r23
+        sw      (r1+52), r24
+        sw      (r1+56), r25
+        sw      (r1+60), gp
+        sw      (r1+64), fp
+        sw      (r1+68), sp
+        sw      (r1+72), ra
+        mvi     r1, 0
+        ret
+
+/* longjmp: restore all callee saves from jmp_buf
+   r1 - Address of jmb_buf
+   r2 - Value to return with
+*/
+
+        .global     longjmp
+        .type       longjmp,@function
+        .align      4
+
+longjmp:
+        lw      r11, (r1+0)
+        lw      r12, (r1+4)
+        lw      r13, (r1+8)
+        lw      r14, (r1+12)
+        lw      r15, (r1+16)
+        lw      r16, (r1+20)
+        lw      r17, (r1+24)
+        lw      r18, (r1+28)
+        lw      r19, (r1+32)
+        lw      r20, (r1+36)
+        lw      r21, (r1+40)
+        lw      r22, (r1+44)
+        lw      r23, (r1+48)
+        lw      r24, (r1+52)
+        lw      r25, (r1+56)
+        lw      gp, (r1+60)
+        lw      fp, (r1+64)
+        lw      sp, (r1+68)
+        lw      ra, (r1+72)
+        mv      r1, r2
+        ret
+
+