strace: Qstrace controls whether tracing is on
[akaros.git] / kern / arch / x86 / setjmp.h
index 187eaa0..64397e0 100644 (file)
@@ -1,7 +1,6 @@
 // Arch specific struct definitions for setjmp/longjmp.
 
-#ifndef ROS_ARCH_SETJMP_H
-#define ROS_ARCH_SETJMP_H
+#pragma once
 
 #include <common.h>
 
@@ -9,22 +8,45 @@
 struct jmpbuf {
        uintptr_t retaddr; // return address
        uintreg_t rsp;     // post-return rsp
-       uintreg_t rbx;     // callee saved registers
        uintreg_t rbp;
-       uintreg_t r12;
-       uintreg_t r13;
-       uintreg_t r14;
-       uintreg_t r15;
 };
+
+static inline void __ros_clobber_callee_regs(void)
+{
+       asm volatile ("" : : : "rbx", "r12", "r13", "r14", "r15");
+}
+
+static inline uintptr_t jmpbuf_get_pc(struct jmpbuf *jb)
+{
+       return jb->retaddr;
+}
+
+static inline uintptr_t jmpbuf_get_fp(struct jmpbuf *jb)
+{
+       return jb->rbp;
+}
+
 #else
+
 struct jmpbuf {
        uintptr_t retaddr; // return address
        uintreg_t esp;     // post-return esp
-       uintreg_t ebx;     // callee saved registers
        uintreg_t ebp;
-       uintreg_t esi;
-       uintreg_t edi;
 };
-#endif
 
-#endif /* !ROS_ARCH_SETJMP_H */
+static inline __ros_clobber_callee_regs(void)
+{
+       asm volatile ("" : : : "ebx", "esi", "edi");
+}
+
+static inline uintptr_t jmpbuf_get_pc(struct jmpbuf *jb)
+{
+       return jb->retaddr;
+}
+
+static inline uintptr_t jmpbuf_get_fp(struct jmpbuf *jb)
+{
+       return jb->ebp;
+}
+
+#endif