summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bindings/linux/Makefile1
-rw-r--r--bindings/linux/setjmp.S58
-rw-r--r--bindings/linux/setjmp.h37
3 files changed, 62 insertions, 34 deletions
diff --git a/bindings/linux/Makefile b/bindings/linux/Makefile
index cf0cc7a..e98aa3c 100644
--- a/bindings/linux/Makefile
+++ b/bindings/linux/Makefile
@@ -1,6 +1,7 @@
obj-m = upb.o
upb-objs = \
+ setjmp.o \
../../upb/upb.o \
../../upb/bytestream.o \
../../upb/def.o \
diff --git a/bindings/linux/setjmp.S b/bindings/linux/setjmp.S
new file mode 100644
index 0000000..8ef5831
--- /dev/null
+++ b/bindings/linux/setjmp.S
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2003 Peter Wemm.
+ * Copyright (c) 1993 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+_setjmp:
+ movq %rbx,0(%rdi) /* save rbx */
+ movq %rsp,8(%rdi) /* save rsp */
+ movq %rbp,16(%rdi) /* save rbp */
+ movq %r12,24(%rdi) /* save r12 */
+ movq %r13,32(%rdi) /* save r13 */
+ movq %r14,40(%rdi) /* save r14 */
+ movq %r15,48(%rdi) /* save r15 */
+ movq 0(%rsp),%rdx /* get rta */
+ movq %rdx,56(%rdi) /* save rip */
+ xorl %eax,%eax /* return(0); */
+ ret
+
+_longjmp:
+ movq 0(%rdi),%rbx /* restore rbx */
+ movq 8(%rdi),%rsp /* restore rsp */
+ movq 16(%rdi),%rbp /* restore rbp */
+ movq 24(%rdi),%r12 /* restore r12 */
+ movq 32(%rdi),%r13 /* restore r13 */
+ movq 40(%rdi),%r14 /* restore r14 */
+ movq 48(%rdi),%r15 /* restore r15 */
+ movq 56(%rdi),%rdx /* get rta */
+ movq %rdx,0(%rsp) /* put in return frame */
+ xorl %eax,%eax /* return(1); */
+ incl %eax
+ ret
diff --git a/bindings/linux/setjmp.h b/bindings/linux/setjmp.h
index 6da4313..c4716e6 100644
--- a/bindings/linux/setjmp.h
+++ b/bindings/linux/setjmp.h
@@ -7,38 +7,7 @@
// Linux doesn't provide setjmp/longjmp, boo.
-typedef void *jmp_buf[3]; // rsp, rbp, rip
+typedef void *jmp_buf[8];
-static inline int _setjmp(jmp_buf env) {
- register int ret asm ("%eax");
- __asm__ __volatile__ goto (
- " movq %%rsp, 0(%0)\n" // Save rsp
- " movq %%rbp, 8(%0)\n" // Save rbp
- " movq $1f, 16(%0)\n" // Save rip
- " jmp %l[setup]\n"
- "1:"
- : // No outputs allowed (GCC limitation).
- : "b" (env) // Input
- : // All registers clobbered except rsp, which save in env.
- "%rcx", "%rdx", "%rdi", "%rsi", "memory", "cc",
- "%r8" , "%r9" , "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
- : setup // Target labels.
- );
- return ret;
-
-setup:
- return 0;
-}
-
-__attribute__((__noreturn__))
-static inline void _longjmp(jmp_buf env, int val) {
- __asm__ __volatile__ (
- " movq 0(%0), %%rsp\n" // Restore rsp
- " movq 8(%0), %%rbp\n" // Restore rbp
- " movq %0, %%rbx\n" // Restore rbx
- " jmpq *16(%0)\n" // Jump to saved rip
- : // No output.
- : "r" (env), "a" (val) // Move val to %eax
- );
- __builtin_unreachable();
-}
+extern int _setjmp(jmp_buf env);
+__attribute__((__noreturn__)) extern void _longjmp(jmp_buf env, int val);
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback