commit 110c707dda7d14af657a0cc184e60eb42af30c88 from: rsc date: Fri Apr 21 03:34:44 2006 UTC darwin 386 start commit - 6b11fe88cb3dd3a8181f56c24a33e065067d2170 commit + 110c707dda7d14af657a0cc184e60eb42af30c88 blob - /dev/null blob + 46c96e94c5e55b7e16379bb25a0f1f476cf42586 (mode 644) --- /dev/null +++ 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 + blob - /dev/null blob + 3725f264a4ef4f7b132095d58194cc55820437c3 (mode 644) --- /dev/null +++ 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; +} + blob - /dev/null blob + fa58e0639da561433251899d5ebc70ebe7c2af0c (mode 644) --- /dev/null +++ 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); +} blob - /dev/null blob + c5732165cd9ed7d1e8bd4d491d9b0327e877029d (mode 644) --- /dev/null +++ src/libthread/test/thello.c @@ -0,0 +1,10 @@ +#include +#include +#include + +void +threadmain(int argc, char **argv) +{ + print("hello, world\n"); +} + blob - d89a30b9497abae789bcd8e5e32d189b0c456ace blob + 93f5ac1729259554e878588cc012a91d4e475486 --- src/libthread/thread.c +++ 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!"); blob - d1f3e9383dc3091aeed3b2ba3c792a1b1ad45ee9 blob + 12b8a9988078af36ad1c9080784f51c1eda9be2a --- src/libthread/threadimpl.h +++ 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__)