From 50f7ec339a85ebe60390edc3c8cfb87bd2f57bc4 Mon Sep 17 00:00:00 2001 From: rsc Date: Fri, 7 Jan 2005 21:47:30 +0000 Subject: initial darwin --- src/libthread/Darwin-power-asm.s | 83 ++++++++++++++++++++++++++++++++++++++++ src/libthread/Darwin-power.c | 37 ++++++++++++++++++ src/libthread/Darwin-ucontext.h | 24 ++++++++++++ src/libthread/sysofiles.sh | 11 ++++-- src/libthread/threadimpl.h | 4 ++ 5 files changed, 156 insertions(+), 3 deletions(-) create mode 100644 src/libthread/Darwin-power-asm.s create mode 100644 src/libthread/Darwin-power.c create mode 100644 src/libthread/Darwin-ucontext.h (limited to 'src/libthread') 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; -- cgit v1.2.3