[PATCH] moxie: Save $r11 in setjmp() and longjmp()

Jeff Johnston jjohnstn@redhat.com
Tue Aug 25 00:38:19 GMT 2026


Patch applied.

Regards,

-- Jeff J.

On Fri, Aug 21, 2026 at 4:13 AM Sebastian Huber <
sebastian.huber@embedded-brains.de> wrote:

> 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 <sebastian.huber@embedded-brains.de>
> ---
>  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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://sourceware.org/pipermail/newlib/attachments/20260824/27550fb5/attachment-0001.htm>


More information about the Newlib mailing list