diff --git a/software/include/base/setjmp.h b/software/include/base/setjmp.h new file mode 100644 index 000000000..c4246c14d --- /dev/null +++ b/software/include/base/setjmp.h @@ -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 */ + diff --git a/software/libbase/Makefile b/software/libbase/Makefile index 027af87fd..ddb3f5cff 100644 --- a/software/libbase/Makefile +++ b/software/libbase/Makefile @@ -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 index 000000000..666df5e3e --- /dev/null +++ b/software/libbase/setjmp.S @@ -0,0 +1,94 @@ +/* + * setjmp/longjmp for LatticeMico32. + * Contributed by Jon Beniston + * + * 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 + +