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:
parent
69772c4332
commit
31227ba53d
@ -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__
|
||||||
|
@ -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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user