commit fc567f476a9cb381a50a94a355c4e0dd990b2539 from: Russ Cox date: Tue Aug 02 18:28:04 2011 UTC build: OS X 64-bit build R=rsc http://codereview.appspot.com/4838047 commit - babe3439cc2bb8baa027be65da67d02d980ebb05 commit + fc567f476a9cb381a50a94a355c4e0dd990b2539 blob - 5f18e28fd077f6d9bb7c5d33ee9fb53d421372b2 blob + e9928ca9783670bbcb64f8f07522e4dec1adb186 --- INSTALL +++ INSTALL @@ -54,14 +54,32 @@ if [ `uname` = Linux ]; then if ./a.out >/dev/null then echo " NPTL found." - echo "SYSVERSION=2.6.x" >$PLAN9/config + echo "SYSVERSION=2.6.x" >>$PLAN9/config else echo " NPTL not found." - echo "SYSVERSION=2.4.x" >$PLAN9/config + echo "SYSVERSION=2.4.x" >>$PLAN9/config fi rm -f ./a.out fi +if [ `uname` = Darwin ]; then + # On Darwin, uname -m -p cannot be trusted. + echo "* Running on Darwin: checking architecture..." + rm -f ./a.out + gcc lib/darwin-main.c >/dev/null 2>&1 + case "$(file ./a.out 2>/dev/null)" in + *x86_64*) + echo " x86-64 found." + echo "OBJTYPE=x86_64" >>$PLAN9/config + ;; + *i386*) + echo " i386 found." + echo "OBJTYPE=386" >>$PLAN9/config + ;; + esac + rm -f ./a.out +fi + if [ -f LOCAL.config ]; then echo Using LOCAL.config options: sed 's/^/ /' LOCAL.config blob - 7ee8beb46a9103eef9df9c6fc077a47942ba602d blob + 753797c8f644a115c84ae225b68887732a355491 --- bin/9a +++ bin/9a @@ -5,10 +5,16 @@ if [ $# != 1 ]; then exit 1 fi +test -f $PLAN9/config && . $PLAN9/config + aflags="" -case "`uname`" in -Darwin) - aflags="-arch `arch`" +case "`uname`-${OBJTYPE:-`uname -m`}" in +Darwin-*386*) + aflags="-arch i386" + ;; +Darwin-*x86_64*) + aflags="-arch x86_64" + ;; esac out=`echo $1 | sed 's/\.s$//;s/$/.o/'` blob - bfdac4caad400244c61ff54fb5881bcca6515611 blob + 34238e9337ffdfae00a15152a873de903efb9d71 --- bin/9c +++ bin/9c @@ -70,6 +70,8 @@ case "$tag" in *FreeBSD*gcc*) usegcc ;; *FreeBSD*clang*) useclang ;; *BSD*) usegcc ;; +*Darwin-x86_64*) usegcc + cflags="$ngflags -g3 -no-cpp-precomp -m64" ;; *Darwin*) usegcc cflags="$ngflags -g3 -no-cpp-precomp -m32" ;; *HP-UX*) cc=${CC9:-cc}; cflags="-g -O -c -Ae" ;; blob - e3fa3091d4d11cda11e5864e7c5d6200723d41f5 blob + 68d099e39982b0162a7a288c20fb227a4a5c5c38 --- bin/9l +++ bin/9l @@ -45,6 +45,9 @@ case "$tag" in ;; esac ;; +*Darwin*x86_64*) + ld="${CC9:-gcc} -m64" + ;; *Darwin*) ld="${CC9:-gcc} -m32" ;; blob - c5e115690a1855c9e2530eb95074c96739aade14 blob + a9ce7b7a7181bc5de84e579aac083cf66607456f --- src/lib9/ctime.c +++ src/lib9/ctime.c @@ -130,7 +130,7 @@ gmtime(long tim) char* asctime(Tm *t) { - char *ncp; + const char *ncp; static char cbuf[30]; strcpy(cbuf, "Thu Jan 01 00:00:00 GMT 1970\n"); blob - 99f899cc154023afd44fb17d84107379ed2c1dd1 blob + 9c06f331255a80a702d5f8b95baec5178d2066a9 --- src/libthread/mkfile +++ src/libthread/mkfile @@ -52,6 +52,4 @@ test:V: tprimes tspawn echo tspawn should take 3 seconds, not 6 $PLAN9/bin/time ./tspawn sleep 3 >/dev/null -CLEANFILES=p1.txt p2.txt tp1.txt tp2.txt - - +CLEANFILES=p1.txt p2.txt tp1.txt tp2.txt test/*.$O blob - 32600a7147f767f2bff6080218f39b0b4d1ea209 blob + b136bcf99f189f40be22ff71ed3f443d62073d36 --- src/libthread/sysofiles.sh +++ src/libthread/sysofiles.sh @@ -4,24 +4,18 @@ test -f $PLAN9/config && . $PLAN9/config tag="$OBJTYPE-$SYSNAME-${SYSVERSION:-`uname -r`}-${CC9:-cc}" case "$tag" in -*-Linux-2.6.*) - echo pthread.o - ;; -*-FreeBSD-[5-9].*) - echo pthread.o - ;; -*-Linux-*) +*-Linux-2.[0-5]*) # will have to fix this for linux power pc echo ${SYSNAME}-${OBJTYPE}-asm.o $SYSNAME.o ;; -*-FreeBSD-*) +*-FreeBSD-[0-4].*) echo ${SYSNAME}-${OBJTYPE}-asm.o $SYSNAME.o ;; *-NetBSD-*) echo ${SYSNAME}-${OBJTYPE}-asm.o $SYSNAME.o ;; -*-Darwin-*) - echo ${SYSNAME}-${OBJTYPE}-asm.o ${SYSNAME}-${OBJTYPE}.o pthread.o +*-Darwin-10.[5-6].*) + echo ${SYSNAME}-${OBJTYPE}-asm.o $SYSNAME-${OBJTYPE}.o pthread.o ;; *-OpenBSD-*) echo ${SYSNAME}-${OBJTYPE}-asm.o ${SYSNAME}-${OBJTYPE}.o $SYSNAME.o blob - 56744984bddc4bc5f1ffd7822803e14cf5d8ceed blob + 77626b6df82a0f5af08dd85ab317743288fda9f6 --- src/libthread/test/tprimes.c +++ src/libthread/test/tprimes.c @@ -80,6 +80,7 @@ threadmain(int argc, char **argv) mk(countthread, c, STACK); mk(filterthread, c, STACK); recvp(chancreate(sizeof(void*), 0)); + threadexitsall(0); } void blob - 06230f53fd82f6e09be4c68f59c11fb84c18c2d9 blob + 731a68cbe05f861cd66b5d4e019f8b156e8d6855 --- src/libthread/thread.c +++ src/libthread/thread.c @@ -91,7 +91,7 @@ threadstart(uint y, uint x) z |= y; t = (_Thread*)z; -/*print("threadstart %p\n", v); */ +//print("threadstart sp=%p arg=%p startfn=%p t=%p\n", &t, t, t->startfn, t->startarg); t->startfn(t->startarg); /*print("threadexits %p\n", v); */ threadexits(nil); @@ -114,17 +114,21 @@ threadalloc(void (*fn)(void*), void *arg, uint stack) t->stk = (uchar*)(t+1); t->stksize = stack; t->id = incref(&threadidref); +//print("fn=%p arg=%p\n", fn, arg); t->startfn = fn; t->startarg = arg; +//print("makecontext sp=%p t=%p startfn=%p\n", (char*)t->stk+t->stksize, t, t->startfn); /* do a reasonable initialization */ memset(&t->context.uc, 0, sizeof t->context.uc); sigemptyset(&zero); sigprocmask(SIG_BLOCK, &zero, &t->context.uc.uc_sigmask); +//print("makecontext sp=%p t=%p startfn=%p\n", (char*)t->stk+t->stksize, t, t->startfn); /* must initialize with current context */ if(getcontext(&t->context.uc) < 0) sysfatal("threadalloc getcontext: %r"); +//print("makecontext sp=%p t=%p startfn=%p\n", (char*)t->stk+t->stksize, t, t->startfn); /* call makecontext to do the real work. */ /* leave a few words open on both ends */ @@ -141,6 +145,7 @@ threadalloc(void (*fn)(void*), void *arg, uint stack) * function that takes some number of word-sized variables, * and on 64-bit machines pointers are bigger than words. */ +//print("makecontext sp=%p t=%p startfn=%p\n", (char*)t->stk+t->stksize, t, t->startfn); z = (ulong)t; y = z; z >>= 16; /* hide undefined 32-bit shift from 32-bit compilers */ blob - 8b931ae7597a396888c95c67ef632ce24f0bf5af blob + 0352d755490329cbcbccf4eb94c90e407e743e68 --- src/libthread/threadimpl.h +++ src/libthread/threadimpl.h @@ -24,7 +24,7 @@ extern int swapcontext(ucontext_t*, ucontext_t*); extern void makecontext(ucontext_t*, void(*)(), int, ...); #endif -#if defined(__APPLE__) +#if defined(__APPLE__) && !defined(__x86_64__) /* * OS X before 10.5 (Leopard) does not provide * swapcontext nor makecontext, so we have to use our own. @@ -40,8 +40,10 @@ extern void makecontext(ucontext_t*, void(*)(), int, # define makecontext libthread_makecontext # if defined(__i386__) # include "386-ucontext.h" -# else +# elif defined(__power__) # include "power-ucontext.h" +# else +# error "unknown architecture" # endif #endif @@ -99,6 +101,15 @@ enum struct Context { ucontext_t uc; +#ifdef __APPLE__ + /* + * On Snow Leopard, etc., the context routines exist, + * so we use them, but apparently they write past the + * end of the ucontext_t. Sigh. We put some extra + * scratch space here for them. + */ + uchar buf[512]; +#endif }; struct Execjob @@ -116,12 +127,12 @@ struct _Thread _Thread *allnext; _Thread *allprev; Context context; + void (*startfn)(void*); + void *startarg; uint id; uchar *stk; uint stksize; int exiting; - void (*startfn)(void*); - void *startarg; Proc *proc; char name[256]; char state[256]; blob - 076f4e6b4ea40277da2d946dceaed64ae17098ed blob + c7e9dddec175f0a3ba5a81df066aad9a2a5da772 --- src/mkhdr +++ src/mkhdr @@ -38,5 +38,6 @@ YFLAGS=-d LIB= SHORTLIB=9 +<|cat $PLAN9/config 2>/dev/null || true <|cat $PLAN9/src/mk.$SYSNAME-$OBJTYPE 2>/dev/null || true