From 110c707dda7d14af657a0cc184e60eb42af30c88 Mon Sep 17 00:00:00 2001 From: rsc Date: Fri, 21 Apr 2006 03:34:44 +0000 Subject: darwin 386 start --- src/libthread/Darwin-386-asm.s | 52 ++++++++++++++++++++++++++++++++++++++++++ src/libthread/Darwin-386.c | 23 +++++++++++++++++++ src/libthread/test/tcontext.c | 27 ++++++++++++++++++++++ src/libthread/test/thello.c | 10 ++++++++ src/libthread/thread.c | 3 ++- src/libthread/threadimpl.h | 6 ++++- 6 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 src/libthread/Darwin-386-asm.s create mode 100644 src/libthread/Darwin-386.c create mode 100644 src/libthread/test/tcontext.c create mode 100644 src/libthread/test/thello.c (limited to 'src') diff --git a/src/libthread/Darwin-386-asm.s b/src/libthread/Darwin-386-asm.s new file mode 100644 index 00000000..46c96e94 --- /dev/null +++ b/src/libthread/Darwin-386-asm.s @@ -0,0 +1,52 @@ +.globl _tas +_tas: + movl $0xCAFEBABE, %eax + movl 4(%esp), %ecx + xchgl %eax, 0(%ecx) + ret + +.globl _getmcontext +_getmcontext: + movl 4(%esp), %eax + + movl %fs, 8(%eax) + movl %es, 12(%eax) + movl %ds, 16(%eax) + movl %ss, 76(%eax) + movl %edi, 20(%eax) + movl %esi, 24(%eax) + movl %ebp, 28(%eax) + movl %ebx, 36(%eax) + movl %edx, 40(%eax) + movl %ecx, 44(%eax) + + movl $1, 48(%eax) /* %eax */ + movl (%esp), %ecx /* %eip */ + movl %ecx, 60(%eax) + leal 4(%esp), %ecx /* %esp */ + movl %ecx, 72(%eax) + + movl 44(%eax), %ecx /* restore %ecx */ + movl $0, %eax + ret + +.globl _setmcontext +_setmcontext: + movl 4(%esp), %eax + + movl 8(%eax), %fs + movl 12(%eax), %es + movl 16(%eax), %ds + movl 76(%eax), %ss + movl 20(%eax), %edi + movl 24(%eax), %esi + movl 28(%eax), %ebp + movl 36(%eax), %ebx + movl 40(%eax), %edx + movl 44(%eax), %ecx + + movl 72(%eax), %esp + pushl 60(%eax) /* new %eip */ + movl 48(%eax), %eax + ret + diff --git a/src/libthread/Darwin-386.c b/src/libthread/Darwin-386.c new file mode 100644 index 00000000..3725f264 --- /dev/null +++ b/src/libthread/Darwin-386.c @@ -0,0 +1,23 @@ +#include "threadimpl.h" + +void +makecontext(ucontext_t *ucp, void (*func)(void), int argc, ...) +{ + int *sp; + + sp = (int*)ucp->uc_stack.ss_sp+ucp->uc_stack.ss_size/4; + sp -= argc; + memmove(sp, &argc+1, argc*sizeof(int)); + *--sp = 0; /* return address */ + ucp->uc_mcontext.mc_eip = (long)func; + ucp->uc_mcontext.mc_esp = (int)sp; +} + +int +swapcontext(ucontext_t *oucp, ucontext_t *ucp) +{ + if(getcontext(oucp) == 0) + setcontext(ucp); + return 0; +} + diff --git a/src/libthread/test/tcontext.c b/src/libthread/test/tcontext.c new file mode 100644 index 00000000..fa58e063 --- /dev/null +++ b/src/libthread/test/tcontext.c @@ -0,0 +1,27 @@ +#include "../threadimpl.h" +#undef exits + + +ucontext_t c0, c1; +char stack[65536]; + +void +go(void *v) +{ + print("hello, world\n"); + setcontext(&c0); +} + +void +main(void) +{ +// print("in main\n"); + getcontext(&c1); + c1.uc_stack.ss_sp = stack; + c1.uc_stack.ss_size = sizeof stack; + makecontext(&c1, go, 1, 0); + if(getcontext(&c0) == 0) + setcontext(&c1); + print("back in main\n"); + exits(0); +} diff --git a/src/libthread/test/thello.c b/src/libthread/test/thello.c new file mode 100644 index 00000000..c5732165 --- /dev/null +++ b/src/libthread/test/thello.c @@ -0,0 +1,10 @@ +#include +#include +#include + +void +threadmain(int argc, char **argv) +{ + print("hello, world\n"); +} + diff --git a/src/libthread/thread.c b/src/libthread/thread.c index d89a30b9..93f5ac17 100644 --- a/src/libthread/thread.c +++ b/src/libthread/thread.c @@ -624,6 +624,7 @@ main(int argc, char **argv) argv0 = argv[0]; + write(1, "", 0); if(getenv("NOLIBTHREADDAEMONIZE") == nil) _threadsetupdaemonize(); @@ -651,7 +652,7 @@ main(int argc, char **argv) _threadsetproc(p); if(mainstacksize == 0) mainstacksize = 256*1024; - atnotify(threadinfo, 1); +// atnotify(threadinfo, 1); _threadcreate(p, threadmainstart, nil, mainstacksize); procscheduler(p); sysfatal("procscheduler returned in threadmain!"); diff --git a/src/libthread/threadimpl.h b/src/libthread/threadimpl.h index d1f3e938..12b8a998 100644 --- a/src/libthread/threadimpl.h +++ b/src/libthread/threadimpl.h @@ -26,7 +26,11 @@ extern void makecontext(ucontext_t*, void(*)(), int, ...); # define mcontext_t libthread_mcontext_t # define ucontext libthread_ucontext # define ucontext_t libthread_ucontext_t -# include "power-ucontext.h" +# if defined(__i386__) +# include "386-ucontext.h" +# else +# include "power-ucontext.h" +# endif #endif #if defined(__OpenBSD__) -- cgit v1.2.3