summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/vax/__longjmp.S
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux/vax/__longjmp.S')
-rw-r--r--libc/sysdeps/linux/vax/__longjmp.S43
1 files changed, 43 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/vax/__longjmp.S b/libc/sysdeps/linux/vax/__longjmp.S
new file mode 100644
index 000000000..a48581fa9
--- /dev/null
+++ b/libc/sysdeps/linux/vax/__longjmp.S
@@ -0,0 +1,43 @@
+#include <features.h>
+
+# longjmp.S atp sept 2001
+# restore regs and info and jmp back to a previous setjmp
+
+.globl __longjmp
+.align 4
+__longjmp:
+ .word 0x0040 # this matches setjmp and PLT
+ movl 0x4(%ap), %r0 # our scratch reg
+# movl $0, %r0
+# movl (%r0), %r0
+ # we are going to modify our stack frame
+ # to the same as that of the setjmp we called earlier
+ movl (%r0), (%fp) # cond handler
+ movl 0x4(%r0), 0x4(%fp) # psw
+ movl 0x8(%r0), 0x8(%fp) # ap
+ movl 0xc(%r0), 0xc(%fp) # fp
+ movl 0x10(%r0), 0x10(%fp) # pc
+
+ # restore the regs
+ movl 0x14(%r0), %r1
+ movl 0x18(%r0), %r2
+ movl 0x1c(%r0), %r3
+ movl 0x20(%r0), %r4
+ movl 0x24(%r0), %r5
+ movl 0x28(%r0), %r6
+ movl 0x2c(%r0), %r7
+ movl 0x30(%r0), %r8
+ movl 0x34(%r0), %r9
+ movl 0x38(%r0), %r10
+ movl 0x3c(%r0), %r11
+
+ # check val and set to 1 if set to zero
+ movl 0x8(%ap), %r0
+ tstl %r0
+ bneq exit_ok
+ movl $0x1, %r0
+exit_ok:
+ ret
+.size __longjmp,.-__longjmp
+libc_hidden_def(__longjmp)
+