| #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*); |
| |