tuse macro for getcontext (setjmp) - plan9port - [fork] Plan 9 from user space (HTM) git clone git://src.adamsgaard.dk/plan9port (DIR) Log (DIR) Files (DIR) Refs (DIR) README (DIR) LICENSE --- (DIR) commit 1e05fdf92cf4c3ae32c52d6928f3e74000b76f6a (DIR) parent b4d5d19438106b3904185eb9ba7d6e1b8b0cfdf7 (HTM) Author: rsc <devnull@localhost> Date: Fri, 4 Nov 2005 16:34:19 +0000 use macro for getcontext (setjmp) Diffstat: M src/libthread/386-ucontext.h | 4 ++-- M src/libthread/FreeBSD-386-asm.s | 25 +++++++++++-------------- M src/libthread/Linux-arm-asm.s | 10 ++++------ M src/libthread/Linux.c | 4 ++-- M src/libthread/OpenBSD-386.c | 15 --------------- M src/libthread/OpenBSD-power.c | 13 ------------- M src/libthread/power-ucontext.h | 4 ++-- M src/libthread/threadimpl.h | 6 ++++-- 8 files changed, 25 insertions(+), 56 deletions(-) --- (DIR) diff --git a/src/libthread/386-ucontext.h b/src/libthread/386-ucontext.h t@@ -1,8 +1,8 @@ +#define setcontext(u) setmcontext(&(u)->uc_mcontext) +#define getcontext(u) getmcontext(&(u)->uc_mcontext) typedef struct mcontext mcontext_t; typedef struct ucontext ucontext_t; -extern int getcontext(ucontext_t*); -extern void setcontext(ucontext_t*); extern int swapcontext(ucontext_t*, ucontext_t*); extern void makecontext(ucontext_t*, void(*)(), int, ...); (DIR) diff --git a/src/libthread/FreeBSD-386-asm.s b/src/libthread/FreeBSD-386-asm.s t@@ -5,11 +5,10 @@ _tas: xchgl %eax, 0(%ecx) ret -.globl getcontext -getcontext: +.globl getmcontext +getmcontext: movl 4(%esp), %eax - addl $16, %eax /* point to mcontext */ - + movl %fs, 8(%eax) movl %es, 12(%eax) movl %ds, 16(%eax) t@@ -26,16 +25,15 @@ getcontext: movl %ecx, 60(%eax) leal 4(%esp), %ecx /* %esp */ movl %ecx, 72(%eax) - + movl 44(%eax), %ecx /* restore %ecx */ movl $0, %eax ret -.globl setcontext -setcontext: +.globl setmcontext +setmcontext: movl 4(%esp), %eax - addl $16, %eax /* point to mcontext */ - + movl 8(%eax), %fs movl 12(%eax), %es movl 16(%eax), %ds t@@ -45,11 +43,10 @@ setcontext: movl 28(%eax), %ebp movl 36(%eax), %ebx movl 40(%eax), %edx - movl 72(%eax), %esp - - movl 60(%eax), %ecx /* push new %eip */ - pushl %ecx - movl 44(%eax), %ecx + + movl 72(%eax), %esp + pushl 60(%eax) /* new %eip */ movl 48(%eax), %eax ret + (DIR) diff --git a/src/libthread/Linux-arm-asm.s b/src/libthread/Linux-arm-asm.s t@@ -9,9 +9,8 @@ _tas: mov r0, r3 mov pc, lr -.globl getcontext -getcontext: - add r0, r0, #148 /* walk to mcontext */ +.globl getmcontext +getmcontext: str r1, [r0,#4] str r2, [r0,#8] str r3, [r0,#12] t@@ -33,9 +32,8 @@ getcontext: mov r0, #0 mov pc, lr -.globl setcontext -setcontext: - add r0, r0, #148 /* walk to mcontext */ +.globl setmcontext +setmcontext: ldr r1, [r0,#4] ldr r2, [r0,#8] ldr r3, [r0,#12] (DIR) diff --git a/src/libthread/Linux.c b/src/libthread/Linux.c t@@ -437,8 +437,8 @@ _threadpexit(void) } #ifdef __arm__ -extern int getmcontext(mcontext_t*); -extern int setmcontext(const mcontext_t*); +#define setcontext(u) setmcontext(&(u)->uc_mcontext) +#define getcontext(u) getmcontext(&(u)->uc_mcontext) void makecontext(ucontext_t *uc, void (*fn)(void), int argc, ...) (DIR) diff --git a/src/libthread/OpenBSD-386.c b/src/libthread/OpenBSD-386.c t@@ -13,21 +13,6 @@ makecontext(ucontext_t *ucp, void (*func)(void), int argc, ...) ucp->uc_mcontext.mc_esp = (int)sp; } -extern int getmcontext(mcontext_t*); -extern int setmcontext(mcontext_t*); - -int -getcontext(ucontext_t *uc) -{ - return getmcontext(&uc->uc_mcontext); -} - -void -setcontext(ucontext_t *uc) -{ - setmcontext(&uc->uc_mcontext); -} - int swapcontext(ucontext_t *oucp, ucontext_t *ucp) { (DIR) diff --git a/src/libthread/OpenBSD-power.c b/src/libthread/OpenBSD-power.c t@@ -16,19 +16,6 @@ makecontext(ucontext_t *ucp, void (*func)(void), int argc, ...) } int -getcontext(ucontext_t *uc) -{ - return _getmcontext(&uc->mc); -} - -int -setcontext(ucontext_t *uc) -{ - _setmcontext(&uc->mc); - return 0; -} - -int swapcontext(ucontext_t *oucp, ucontext_t *ucp) { if(getcontext(oucp) == 0) (DIR) diff --git a/src/libthread/power-ucontext.h b/src/libthread/power-ucontext.h t@@ -1,3 +1,5 @@ +#define setcontext(u) _setmcontext(&(u)->uc_mcontext) +#define getcontext(u) _getmcontext(&(u)->uc_mcontext) typedef struct mcontext mcontext_t; typedef struct ucontext ucontext_t; struct mcontext t@@ -27,8 +29,6 @@ struct ucontext }; void makecontext(ucontext_t*, void(*)(void), int, ...); -int getcontext(ucontext_t*); -int setcontext(ucontext_t*); int swapcontext(ucontext_t*, ucontext_t*); int _getmcontext(mcontext_t*); void _setmcontext(mcontext_t*); (DIR) diff --git a/src/libthread/threadimpl.h b/src/libthread/threadimpl.h t@@ -13,8 +13,10 @@ #include "thread.h" #if defined(__FreeBSD__) && __FreeBSD__ < 5 -extern int getcontext(ucontext_t*); -extern void setcontext(ucontext_t*); +extern int getmcontext(mcontext_t*); +extern void setmcontext(mcontext_t*); +#define setcontext(u) setmcontext(&(u)->uc_mcontext) +#define getcontext(u) getmcontext(&(u)->uc_mcontext) extern int swapcontext(ucontext_t*, ucontext_t*); extern void makecontext(ucontext_t*, void(*)(), int, ...); #endif