aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2005-01-07 21:47:30 +0000
committerrsc <devnull@localhost>2005-01-07 21:47:30 +0000
commit50f7ec339a85ebe60390edc3c8cfb87bd2f57bc4 (patch)
treeaab8a650bbb8d14a85f0de151974fedcf77d28b3 /src
parent1aa9c533e0778d9917cdb19f71e3bc7416e8d528 (diff)
downloadplan9port-50f7ec339a85ebe60390edc3c8cfb87bd2f57bc4.tar.gz
plan9port-50f7ec339a85ebe60390edc3c8cfb87bd2f57bc4.tar.bz2
plan9port-50f7ec339a85ebe60390edc3c8cfb87bd2f57bc4.zip
initial darwin
Diffstat (limited to 'src')
-rw-r--r--src/libthread/Darwin-power-asm.s83
-rw-r--r--src/libthread/Darwin-power.c37
-rw-r--r--src/libthread/Darwin-ucontext.h24
-rw-r--r--src/libthread/sysofiles.sh11
-rw-r--r--src/libthread/threadimpl.h4
5 files changed, 156 insertions, 3 deletions
diff --git a/src/libthread/Darwin-power-asm.s b/src/libthread/Darwin-power-asm.s
new file mode 100644
index 00000000..0776b1e3
--- /dev/null
+++ b/src/libthread/Darwin-power-asm.s
@@ -0,0 +1,83 @@
+/* get FPR and VR use flags with sc 0x7FF3 */
+/* get vsave with mfspr reg, 256 */
+
+.text
+.align 2
+
+.globl __setlabel
+
+__setlabel: /* xxx: instruction scheduling */
+ mflr r0
+ mfcr r5
+ mfctr r6
+ mfxer r7
+ stw r0, 0*4(r3)
+ stw r5, 1*4(r3)
+ stw r6, 2*4(r3)
+ stw r7, 3*4(r3)
+
+ stw r1, 4*4(r3)
+ stw r2, 5*4(r3)
+ li r5, 1 /* return value for gotolabel */
+ stw r5, 6*4(r3)
+
+ stw r13, (0+6)*4(r3) /* callee-save GPRs */
+ stw r14, (1+6)*4(r3) /* xxx: block move */
+ stw r15, (2+6)*4(r3)
+ stw r16, (3+6)*4(r3)
+ stw r17, (4+6)*4(r3)
+ stw r18, (5+6)*4(r3)
+ stw r19, (6+6)*4(r3)
+ stw r20, (7+6)*4(r3)
+ stw r21, (8+6)*4(r3)
+ stw r22, (9+6)*4(r3)
+ stw r23, (10+6)*4(r3)
+ stw r24, (11+6)*4(r3)
+ stw r25, (12+6)*4(r3)
+ stw r26, (13+6)*4(r3)
+ stw r27, (14+6)*4(r3)
+ stw r28, (15+6)*4(r3)
+ stw r29, (16+6)*4(r3)
+ stw r30, (17+6)*4(r3)
+ stw r31, (18+6)*4(r3)
+
+ li r3, 0 /* return */
+ blr
+
+.globl __gotolabel
+
+__gotolabel:
+ lwz r13, (0+7)*4(r3) /* callee-save GPRs */
+ lwz r14, (1+7)*4(r3) /* xxx: block move */
+ lwz r15, (2+7)*4(r3)
+ lwz r16, (3+7)*4(r3)
+ lwz r17, (4+7)*4(r3)
+ lwz r18, (5+7)*4(r3)
+ lwz r19, (6+7)*4(r3)
+ lwz r20, (7+7)*4(r3)
+ lwz r21, (8+7)*4(r3)
+ lwz r22, (9+7)*4(r3)
+ lwz r23, (10+7)*4(r3)
+ lwz r24, (11+7)*4(r3)
+ lwz r25, (12+7)*4(r3)
+ lwz r26, (13+7)*4(r3)
+ lwz r27, (14+7)*4(r3)
+ lwz r28, (15+7)*4(r3)
+ lwz r29, (16+7)*4(r3)
+ lwz r30, (17+7)*4(r3)
+ lwz r31, (18+7)*4(r3)
+
+ lwz r1, 4*4(r3)
+ lwz r2, 5*4(r3)
+
+ lwz r0, 0*4(r3)
+ mtlr r0
+ lwz r0, 1*4(r3)
+ mtcr r0 /* mtcrf 0xFF, r0 */
+ lwz r0, 2*4(r3)
+ mtctr r0
+ lwz r0, 3*4(r3)
+ mtxer r0
+
+ lwz r3, 6*4(r4)
+ blr
diff --git a/src/libthread/Darwin-power.c b/src/libthread/Darwin-power.c
new file mode 100644
index 00000000..373cc623
--- /dev/null
+++ b/src/libthread/Darwin-power.c
@@ -0,0 +1,37 @@
+#include "threadimpl.h"
+
+void
+makecontext(ucontext_t *ucp, void (*func)(void), int argc, ...)
+{
+ ulong *sp, *tos;
+ va_list arg;
+
+ tos = (ulong*)ucp->uc_stack.ss_sp+ucp->uc_stack.ss_size/sizeof(ulong);
+ sp = tos - 16;
+ ucp->label.pc = (long)func;
+ ucp->label.sp = (long)sp;
+ va_start(arg, argc);
+ ucp->label.r3 = va_arg(arg, long);
+ va_end(arg);
+}
+
+void
+getcontext(ucontext_t *uc)
+{
+ return __setlabel(uc);
+}
+
+int
+setcontext(ucontext_t *uc)
+{
+ return __gotolabel(uc);
+}
+
+int
+swapcontext(ucontext_t *oucp, ucontext_t *ucp)
+{
+ if(getcontext(oucp) == 0)
+ setcontext(ucp);
+ return 0;
+}
+
diff --git a/src/libthread/Darwin-ucontext.h b/src/libthread/Darwin-ucontext.h
new file mode 100644
index 00000000..c7915ff8
--- /dev/null
+++ b/src/libthread/Darwin-ucontext.h
@@ -0,0 +1,24 @@
+typedef struct ucontext ucontext_t;
+struct ucontext
+{
+ ulong pc; /* lr */
+ ulong cr; /* mfcr */
+ ulong ctr; /* mfcr */
+ ulong xer; /* mfcr */
+ ulong sp; /* callee saved: r1 */
+ ulong toc; /* callee saved: r2 */
+ ulong r3; /* first arg to function, return register: r3 */
+ ulong gpr[19]; /* callee saved: r13-r31 */
+// XXX: currently do not save vector registers or floating-point state
+// ulong pad;
+// uvlong fpr[18]; /* callee saved: f14-f31 */
+// ulong vr[4*12]; /* callee saved: v20-v31, 256-bits each */
+};
+
+void makecontext(ucontext_t*, void(*)(void), int, ...);
+void getcontext(ucontext_t*);
+int setcontext(ucontext_t*);
+int swapcontext(ucontext_t*, ucontext_t*);
+int __setlabel(ucontext_t*);
+void __gotolabel(ucontext_t*);
+
diff --git a/src/libthread/sysofiles.sh b/src/libthread/sysofiles.sh
index 83b83556..fd22228e 100644
--- a/src/libthread/sysofiles.sh
+++ b/src/libthread/sysofiles.sh
@@ -1,6 +1,8 @@
#!/bin/sh
-tag="${OBJTYPE:-`uname -m`}-${SYSNAME:-`uname`}-`uname -r`-${CC9:-cc}"
+OBJTYPE=${OBJTYPE:-`uname -m | sed 's/Power Macintosh/power/;s/i.86/386/'`}
+SYSNAME=${SYSNAME:-`uname`}
+tag="$OBJTYPE-$SYSNAME-`uname -r`-${CC9:-cc}"
case "$tag" in
*-Linux-2.6.*)
echo pthread.o
@@ -9,11 +11,14 @@ case "$tag" in
echo pthread.o
;;
*-Linux-*)
- echo `uname`.o `uname`asm.o
+ # will have to fix this for linux power pc
+ echo $SYSNAME.o ${SYSNAME}asm.o
;;
*-FreeBSD-*)
- echo `uname`.o `uname`asm.o
+ echo $SYSNAME.o ${SYSNAME}asm.o
;;
+*-Darwin-*)
+ echo ${SYSNAME}-${OBJTYPE}-asm.o ${SYSNAME}-${OBJTYPE}.o pthread.o
*)
echo pthread.o
esac
diff --git a/src/libthread/threadimpl.h b/src/libthread/threadimpl.h
index bbf84736..0334fe30 100644
--- a/src/libthread/threadimpl.h
+++ b/src/libthread/threadimpl.h
@@ -16,6 +16,10 @@ extern int swapcontext(ucontext_t*, ucontext_t*);
extern void makecontext(ucontext_t*, void(*)(), int, ...);
#endif
+#if defined(__APPLE__)
+# include "Darwin-ucontext.h"
+#endif
+
typedef struct Context Context;
typedef struct Execjob Execjob;
typedef struct Proc Proc;