[PATCH] moxie: Save $r11 in setjmp() and longjmp()
Sebastian Huber <[email protected]>
| Newsgroups | gmane.comp.lib.newlib |
|---|---|
| Message-ID | <[email protected]> |
The ABI of the architecture makes $r6 to $r11 call-saved. The routines saved and restored $r6 to $r10 only, and _JBLEN left no room for another register. A value which the compiler holds in $r11 across a setjmp() and longjmp() pair was lost. A caller which returns through longjmp() and then makes an indirect call through $r11 jumps to whatever the intervening code left there. Add $r11 to the jump buffer and raise _JBLEN to 11. Correct the layout comment, which swapped $sp and $fp and gave the last stack frame slot as 0x25. The size of jmp_buf changes, so the C library and every application must be built together. Found with the RTEMS test suite on the moxie GDB simulator. The test spmutex01 calls longjmp() from a fatal error extension and returns into an indirect call through $r11. Assisted-by: Claude:claude-opus-5 claude-code Signed-off-by: Sebastian Huber <[email protected]> --- newlib/libc/include/machine/setjmp.h | 2 +- newlib/libc/machine/moxie/setjmp.S | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/newlib/libc/include/machine/setjmp.h b/newlib/libc/include/machine/setjmp.h index 4e74bdb0f..568adef91 100644 --- a/newlib/libc/include/machine/setjmp.h +++ b/newlib/libc/include/machine/setjmp.h @@ -259,7 +259,7 @@ _BEGIN_STD_C #endif #ifdef __moxie__ -#define _JBLEN 10 +#define _JBLEN 11 #endif #ifdef __CRX__ diff --git a/newlib/libc/machine/moxie/setjmp.S b/newlib/libc/machine/moxie/setjmp.S index 014368d64..0bf36afc2 100644 --- a/newlib/libc/machine/moxie/setjmp.S +++ b/newlib/libc/machine/moxie/setjmp.S @@ -19,11 +19,12 @@ # $r8 0x08 # $r9 0x0c # $r10 0x10 -# $fp 0x14 -# $sp 0x18 +# $sp 0x14 +# $fp 0x18 # stack frame fp 0x1c # stack frame ra 0x20 -# stack frame sc 0x25 +# stack frame sc 0x24 +# $r11 0x28 .text .global setjmp @@ -36,6 +37,7 @@ setjmp: sto.l 0x10($r0), $r10 sto.l 0x14($r0), $sp sto.l 0x18($r0), $fp + sto.l 0x28($r0), $r11 ldo.l $r1, 0x00($fp) sto.l 0x1c($r0), $r1 ldo.l $r1, 0x04($fp) @@ -57,6 +59,7 @@ longjmp: ldo.l $r10, 0x10($r0) ldo.l $sp, 0x14($r0) ldo.l $fp, 0x18($r0) + ldo.l $r11, 0x28($r0) ldo.l $r2, 0x1c($r0) sto.l 0x0($fp), $r2 ldo.l $r2, 0x20($r0) -- 2.51.0