diff options
Diffstat (limited to 'libc/sysdeps/linux/e1/setjmp.c')
-rw-r--r-- | libc/sysdeps/linux/e1/setjmp.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/e1/setjmp.c b/libc/sysdeps/linux/e1/setjmp.c new file mode 100644 index 000000000..2942cb193 --- /dev/null +++ b/libc/sysdeps/linux/e1/setjmp.c @@ -0,0 +1,54 @@ +/* This file is lisenced under LGPL + * Copyright (C) 2002-2003, George Thanos <george.thanos@gdt.gr> + * Yannis Mitsos <yannis.mitsos@gdt.gr> + */ + +#include <setjmp.h> +#include <stdio.h> +#include <signal.h> + +int setjmp( jmp_buf state) +{ + asm volatile( "mov %0, G3\n\t" + "mov %1, G4\n\t" + :"=l"(state->__jmpbuf->G3), + "=l"(state->__jmpbuf->G4) + :/*no input*/ + :"%G3", "%G4" ); + + asm volatile( "setadr %0\n\t" + "mov %1, L1\n\t" + "mov %2, L2\n\t" + :"=l"(state->__jmpbuf->SavedSP), + "=l"(state->__jmpbuf->SavedPC), + "=l"(state->__jmpbuf->SavedSR) + :/*no input*/); + return 0; +} + +int sigsetjmp( sigjmp_buf state , int savesigs) +{ + + if(savesigs) { + state->__mask_was_saved = 1; + /* how arg in <sigprocmask> is not significant */ + sigprocmask(SIG_SETMASK, NULL, &state->__saved_mask); + } else + state->__mask_was_saved = 0; + + asm volatile( "mov %0, G3\n\t" + "mov %1, G4\n\t" + :"=l"(state->__jmpbuf->G3), + "=l"(state->__jmpbuf->G4) + :/*no input*/ + :"%G3", "%G4" ); + + asm volatile( "setadr %0\n\t" + "mov %1, L2\n\t" + "mov %2, L3\n\t" + :"=l"(state->__jmpbuf->SavedSP), + "=l"(state->__jmpbuf->SavedPC), + "=l"(state->__jmpbuf->SavedSR) + :/*no input*/); + return 0; +} |