! ! setjmp.S ! ! Basic setjmp/longjmp ! ! This code was based on the equivalent code in NetBSD ! #include #include ! ! The jmp_buf contains the following entries: ! sp ! fp ! pc ! ENTRY(setjmp) st %sp,[%o0+0] ! Callers stack pointer st %o7,[%o0+4] ! Return pc st %fp,[%o0+8] ! Frame pointer retl ! Return clr %o0 ! ...0 ENTRY(longjmp) sub %sp, 64, %sp ! set up a local stack frame 0: t ST_FLUSHWIN ! flush register windows out to memory ! ! We restore the saved stack pointer to %fp, then issue ! a restore instruction which will reload the register ! window from the stack. ! ld [%o0+4], %o7 /* restore return pc */ ld [%o0+0], %fp /* and stack pointer */ retl ! success, return %g6 restore %o1, 0, %o0