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.
This commit is contained in:
Anthony Green 2019-12-13 13:08:06 -05:00
parent 69772c4332
commit 31227ba53d
2 changed files with 48 additions and 25 deletions

View File

@ -238,7 +238,7 @@ _BEGIN_STD_C
#endif #endif
#ifdef __moxie__ #ifdef __moxie__
#define _JBLEN 16 #define _JBLEN 19
#endif #endif
#ifdef __CRX__ #ifdef __CRX__

View File

@ -1,5 +1,5 @@
/* A setjmp.c for Moxie /* 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, The authors hereby grant permission to use, copy, modify, distribute,
and license this software and its documentation for any purpose, provided and license this software and its documentation for any purpose, provided
@ -13,27 +13,30 @@
# setjmp/longjmp for moxie. The jmpbuf looks like this: # setjmp/longjmp for moxie. The jmpbuf looks like this:
# #
# Register jmpbuf offset # Register jmpbuf offset
# $r0 0x00 # $r0 0x00
# $r1 0x04 # $r1 0x04
# $r2 0x08 # $r2 0x08
# $r3 0x0c # $r3 0x0c
# $r4 0x10 # $r4 0x10
# $r5 0x14 # $r5 0x14
# $r6 0x18 # $r6 0x18
# $r7 0x1c # $r7 0x1c
# $r8 0x20 # $r8 0x20
# $r9 0x24 # $r9 0x24
# $r10 0x28 # $r10 0x28
# $r11 0x2c # $r11 0x2c
# $r12 0x30 # $r12 0x30
# $r13 0x34 # $r13 0x34
# $fp 0x38 # $fp 0x38
# $sp 0x3c # $sp 0x3c
# stack frame fp 0x40
# stack frame ra 0x44
# stack frame sc 0x48
.text .text
.global setjmp .global setjmp
.type setjmp,@function .type setjmp,@function
setjmp: setjmp:
st.l ($r0), $r0 st.l ($r0), $r0
sto.l 0x04($r0), $r1 sto.l 0x04($r0), $r1
@ -51,6 +54,13 @@ setjmp:
sto.l 0x34($r0), $r13 sto.l 0x34($r0), $r13
sto.l 0x38($r0), $sp sto.l 0x38($r0), $sp
sto.l 0x3c($r0), $fp 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 xor $r0, $r0
ret ret
.Lend1: .Lend1:
@ -62,7 +72,6 @@ longjmp:
ldi.l $r2, 0x00 ldi.l $r2, 0x00
cmp $r1, $r2 cmp $r1, $r2
beq .Lreturn1 beq .Lreturn1
ldo.l $r1, 0x04($r0)
ldo.l $r2, 0x08($r0) ldo.l $r2, 0x08($r0)
ldo.l $r3, 0x0c($r0) ldo.l $r3, 0x0c($r0)
ldo.l $r4, 0x10($r0) ldo.l $r4, 0x10($r0)
@ -77,6 +86,13 @@ longjmp:
ldo.l $r13, 0x34($r0) ldo.l $r13, 0x34($r0)
ldo.l $sp, 0x38($r0) ldo.l $sp, 0x38($r0)
ldo.l $fp, 0x3c($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 mov $r0, $r1
ret ret
.Lreturn1: .Lreturn1:
@ -95,6 +111,13 @@ longjmp:
ldo.l $r13, 0x34($r0) ldo.l $r13, 0x34($r0)
ldo.l $sp, 0x38($r0) ldo.l $sp, 0x38($r0)
ldo.l $fp, 0x3c($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 ldi.l $r0, 0x01
ret ret
.Lend2: .Lend2: