From 1e05fdf92cf4c3ae32c52d6928f3e74000b76f6a Mon Sep 17 00:00:00 2001 From: rsc Date: Fri, 4 Nov 2005 16:34:19 +0000 Subject: use macro for getcontext (setjmp) --- src/libthread/386-ucontext.h | 4 ++-- src/libthread/FreeBSD-386-asm.s | 25 +++++++++++-------------- src/libthread/Linux-arm-asm.s | 10 ++++------ src/libthread/Linux.c | 4 ++-- src/libthread/OpenBSD-386.c | 15 --------------- src/libthread/OpenBSD-power.c | 13 ------------- src/libthread/power-ucontext.h | 4 ++-- src/libthread/threadimpl.h | 6 ++++-- 8 files changed, 25 insertions(+), 56 deletions(-) diff --git a/src/libthread/386-ucontext.h b/src/libthread/386-ucontext.h index 35e99ca5..57fd1bd8 100644 --- a/src/libthread/386-ucontext.h +++ b/src/libthread/386-ucontext.h @@ -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, ...); diff --git a/src/libthread/FreeBSD-386-asm.s b/src/libthread/FreeBSD-386-asm.s index e1f266da..42169853 100644 --- a/src/libthread/FreeBSD-386-asm.s +++ b/src/libthread/FreeBSD-386-asm.s @@ -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) @@ -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 @@ -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 + diff --git a/src/libthread/Linux-arm-asm.s b/src/libthread/Linux-arm-asm.s index 8515e4de..5a285bf2 100644 --- a/src/libthread/Linux-arm-asm.s +++ b/src/libthread/Linux-arm-asm.s @@ -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] @@ -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] diff --git a/src/libthread/Linux.c b/src/libthread/Linux.c index 5f7f862e..969c19f2 100644 --- a/src/libthread/Linux.c +++ b/src/libthread/Linux.c @@ -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, ...) diff --git a/src/libthread/OpenBSD-386.c b/src/libthread/OpenBSD-386.c index 74179743..3725f264 100644 --- a/src/libthread/OpenBSD-386.c +++ b/src/libthread/OpenBSD-386.c @@ -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) { diff --git a/src/libthread/OpenBSD-power.c b/src/libthread/OpenBSD-power.c index c3c7e72b..b83522f0 100644 --- a/src/libthread/OpenBSD-power.c +++ b/src/libthread/OpenBSD-power.c @@ -15,19 +15,6 @@ makecontext(ucontext_t *ucp, void (*func)(void), int argc, ...) va_end(arg); } -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) { diff --git a/src/libthread/power-ucontext.h b/src/libthread/power-ucontext.h index a39be28a..a25d480a 100644 --- a/src/libthread/power-ucontext.h +++ b/src/libthread/power-ucontext.h @@ -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 @@ -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*); diff --git a/src/libthread/threadimpl.h b/src/libthread/threadimpl.h index 09276bb3..9757526e 100644 --- a/src/libthread/threadimpl.h +++ b/src/libthread/threadimpl.h @@ -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 -- cgit v1.2.3