aboutsummaryrefslogtreecommitdiff
path: root/src/libthread/x86_64-ucontext.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libthread/x86_64-ucontext.h')
-rw-r--r--src/libthread/x86_64-ucontext.h43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/libthread/x86_64-ucontext.h b/src/libthread/x86_64-ucontext.h
new file mode 100644
index 00000000..08c6d9a8
--- /dev/null
+++ b/src/libthread/x86_64-ucontext.h
@@ -0,0 +1,43 @@
+#define setcontext(u) libthread_setmcontext(&(u)->mc)
+#define getcontext(u) libthread_getmcontext(&(u)->mc)
+typedef struct mcontext mcontext_t;
+typedef struct ucontext ucontext_t;
+
+struct mcontext
+{
+ uintptr ax;
+ uintptr bx;
+ uintptr cx;
+ uintptr dx;
+ uintptr si;
+ uintptr di;
+ uintptr bp;
+ uintptr sp;
+ uintptr r8;
+ uintptr r9;
+ uintptr r10;
+ uintptr r11;
+ uintptr r12;
+ uintptr r13;
+ uintptr r14;
+ uintptr r15;
+/*
+// XXX: currently do not save vector registers or floating-point state
+*/
+};
+
+struct ucontext
+{
+ struct {
+ void *ss_sp;
+ uint ss_size;
+ } uc_stack;
+ sigset_t uc_sigmask;
+ mcontext_t mc;
+};
+
+void makecontext(ucontext_t*, void(*)(void), int, ...);
+int swapcontext(ucontext_t*, ucontext_t*);
+int libthread_getmcontext(mcontext_t*);
+void libthread_setmcontext(mcontext_t*);
+