aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2005-11-04 16:34:19 +0000
committerrsc <devnull@localhost>2005-11-04 16:34:19 +0000
commit1e05fdf92cf4c3ae32c52d6928f3e74000b76f6a (patch)
tree2df6702fe73590dbf26e59a854d903481362574a
parentb4d5d19438106b3904185eb9ba7d6e1b8b0cfdf7 (diff)
downloadplan9port-1e05fdf92cf4c3ae32c52d6928f3e74000b76f6a.tar.gz
plan9port-1e05fdf92cf4c3ae32c52d6928f3e74000b76f6a.tar.bz2
plan9port-1e05fdf92cf4c3ae32c52d6928f3e74000b76f6a.zip
use macro for getcontext (setjmp)
-rw-r--r--src/libthread/386-ucontext.h4
-rw-r--r--src/libthread/FreeBSD-386-asm.s25
-rw-r--r--src/libthread/Linux-arm-asm.s10
-rw-r--r--src/libthread/Linux.c4
-rw-r--r--src/libthread/OpenBSD-386.c15
-rw-r--r--src/libthread/OpenBSD-power.c13
-rw-r--r--src/libthread/power-ucontext.h4
-rw-r--r--src/libthread/threadimpl.h6
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
@@ -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)
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