tdarwin 386 start - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 110c707dda7d14af657a0cc184e60eb42af30c88
 (DIR) parent 6b11fe88cb3dd3a8181f56c24a33e065067d2170
 (HTM) Author: rsc <devnull@localhost>
       Date:   Fri, 21 Apr 2006 03:34:44 +0000
       
       darwin 386 start
       
       Diffstat:
         A src/libthread/Darwin-386-asm.s      |      52 +++++++++++++++++++++++++++++++
         A src/libthread/Darwin-386.c          |      23 +++++++++++++++++++++++
         A src/libthread/test/tcontext.c       |      27 +++++++++++++++++++++++++++
         A src/libthread/test/thello.c         |      10 ++++++++++
         M src/libthread/thread.c              |       3 ++-
         M src/libthread/threadimpl.h          |       6 +++++-
       
       6 files changed, 119 insertions(+), 2 deletions(-)
       ---
 (DIR) diff --git a/src/libthread/Darwin-386-asm.s b/src/libthread/Darwin-386-asm.s
       t@@ -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
       +
 (DIR) diff --git a/src/libthread/Darwin-386.c b/src/libthread/Darwin-386.c
       t@@ -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;
       +}
       +
 (DIR) diff --git a/src/libthread/test/tcontext.c b/src/libthread/test/tcontext.c
       t@@ -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);
       +}
 (DIR) diff --git a/src/libthread/test/thello.c b/src/libthread/test/thello.c
       t@@ -0,0 +1,10 @@
       +#include <u.h>
       +#include <libc.h>
       +#include <thread.h>
       +
       +void
       +threadmain(int argc, char **argv)
       +{
       +        print("hello, world\n");
       +}
       +
 (DIR) diff --git a/src/libthread/thread.c b/src/libthread/thread.c
       t@@ -624,6 +624,7 @@ main(int argc, char **argv)
        
                argv0 = argv[0];
        
       +        write(1, "", 0);
                if(getenv("NOLIBTHREADDAEMONIZE") == nil)
                        _threadsetupdaemonize();
        
       t@@ -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!");
 (DIR) diff --git a/src/libthread/threadimpl.h b/src/libthread/threadimpl.h
       t@@ -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__)