use macro for getcontext (setjmp)

This commit is contained in:
rsc 2005-11-04 16:34:19 +00:00
parent b4d5d19438
commit 1e05fdf92c
8 changed files with 25 additions and 56 deletions

View file

@ -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, ...);

View file

@ -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

View file

@ -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]

View file

@ -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, ...)

View file

@ -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)
{

View file

@ -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)
{

View file

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

View file

@ -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