diff options
Diffstat (limited to 'libc/syscall/setjmp.c')
-rw-r--r-- | libc/syscall/setjmp.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/libc/syscall/setjmp.c b/libc/syscall/setjmp.c new file mode 100644 index 0000000..52c3ff1 --- /dev/null +++ b/libc/syscall/setjmp.c @@ -0,0 +1,50 @@ + +#include <setjmp.h> + +#if __AS386_16__ + +int +setjmp(env) +jmp_buf env; +{ +#asm + pop cx ! PC +#if __FIRST_ARG_IN_AX__ + mov bx,ax +#else + mov bx,sp + mov bx,[bx] ! TOS is prt -> env +#endif + mov [bx+0],cx ! PC + mov [bx+2],sp ! This registers are all that may be constant. + mov [bx+4],bp + mov [bx+6],si ! Is saving these the "right thing" ? + mov [bx+8],di + xor ax,ax + jmp cx +#endasm +} + +void +longjmp(env, rv) +jmp_buf env; +int rv; +{ +#asm + pop cx ! pc +#if __FIRST_ARG_IN_AX__ + mov bx,ax ! env-> +#else + pop bx ! env-> +#endif + pop ax ! rv + mov cx,[bx+0] ! PC + mov sp,[bx+2] + mov bp,[bx+4] + mov si,[bx+6] + mov di,[bx+8] + jmp cx +#endasm +} + +#endif |