Commit Diff


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