aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2006-04-21 03:34:44 +0000
committerrsc <devnull@localhost>2006-04-21 03:34:44 +0000
commit110c707dda7d14af657a0cc184e60eb42af30c88 (patch)
treec7e2cb832189c183e7af67ec01cecb9d4a1bc4c6
parent6b11fe88cb3dd3a8181f56c24a33e065067d2170 (diff)
downloadplan9port-110c707dda7d14af657a0cc184e60eb42af30c88.tar.gz
plan9port-110c707dda7d14af657a0cc184e60eb42af30c88.tar.bz2
plan9port-110c707dda7d14af657a0cc184e60eb42af30c88.zip
darwin 386 start
-rw-r--r--src/libthread/Darwin-386-asm.s52
-rw-r--r--src/libthread/Darwin-386.c23
-rw-r--r--src/libthread/test/tcontext.c27
-rw-r--r--src/libthread/test/thello.c10
-rw-r--r--src/libthread/thread.c3
-rw-r--r--src/libthread/threadimpl.h6
6 files changed, 119 insertions, 2 deletions
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 <u.h>
+#include <libc.h>
+#include <thread.h>
+
+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__)