summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/e1/setjmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux/e1/setjmp.c')
-rw-r--r--libc/sysdeps/linux/e1/setjmp.c54
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;
+}