.text .global _longjmp .type _longjmp, @function .align 2 /* ** void longjmp(jmp_buf env, int val) ** Store the calling environment in ENV, not saving the signal mask. ** Return 0. */ _longjmp: ! save the context into unbankable register mov r4, r8 ! check the returned value validity tst r5, r5 movt r9 add r5, r9 context_switch: ! load the old SR register first to force register bank switch ! (if needed) then move the context and the returned value into ! non-saved (by the setjmp context) registers. ldc.l @r8+, sr mov r8, r4 mov r9, r0 ! restore all old registers mov.l @r4+, r8 mov.l @r4+, r9 mov.l @r4+, r10 mov.l @r4+, r11 mov.l @r4+, r12 mov.l @r4+, r13 mov.l @r4+, r14 mov.l @r4+, r15 ldc.l @r4+, gbr lds.l @r4+, macl lds.l @r4+, mach lds.l @r4+, pr ! return to the old place rts nop