shithub: purgatorio

Download patch

ref: f8935b5778397074d41a48205e5c7f87d7b531fe
parent: 27ca2618d4bc7642370feb39a83a3cff92495ca2
author: henesy <devnull@localhost>
date: Mon Mar 11 12:01:08 EDT 2019

merge updates from december 2018 from official repo ;; add vga font

--- a/.hgignore
+++ b/.hgignore
@@ -63,3 +63,12 @@
 ^libinterp/cryptmod.h
 ^libinterp/ipintsmod.h
 ^libinterp/keyringif.h
+^libinterp/drawmod.h
+^libinterp/freetypemod.h
+^libinterp/keyring.h
+^libinterp/loadermod.h
+^libinterp/mathmod.h
+^libinterp/runt.h
+^libinterp/sysmod.h
+^libinterp/tkmod.h
+^limbo/runt.h
--- /dev/null
+++ b/AIX/power/include/ar.h
@@ -1,0 +1,30 @@
+#define	ARMAG	"<bigaf>\n"
+#define	SARMAG	8
+
+#define	ARFMAG	"`\n"
+
+struct fl_hdr /* archive fixed length header - printable ascii */
+{
+	char	magic[SARMAG];	/* Archive file magic string */
+	char	memoff[20];		/* Offset to member table */
+	char	gstoff[20];		/* Offset to 32-bit global sym table */
+	char	gst64off[20];	/* Offset to 64-bit global sym table */
+	char	fstmoff[20];		/* Offset to first archive member */
+	char	lstmoff[20];		/* Offset to last archive member */
+	char	freeoff[20];		/* Offset to first mem on free list */
+};
+#define	SAR_FLHDR	(SARMAG+120)
+
+struct ar_hdr /* archive file member header - printable ascii */
+{
+	char	size[20];	/* file member size - decimal */
+	char	nxtmem[20];	/* pointer to next member -  decimal */
+	char	prvmem[20];	/* pointer to previous member -  decimal */
+	char	date[12];	/* file member date - decimal */
+	char	uid[12];	/* file member user id - decimal */
+	char	gid[12];	/* file member group id - decimal */
+	char	mode[12];	/* file member mode - octal */
+	char	namlen[4];	/* file member name length - decimal */
+	/*      and variable length name follows*/
+};
+#define	SAR_HDR	112
--- /dev/null
+++ b/AIX/power/include/emu.h
@@ -1,0 +1,25 @@
+/*
+ * system- and machine-specific declarations for emu:
+ * floating-point save and restore, signal handling primitive, and
+ * implementation of the current-process variable `up'.
+ */
+
+/*
+ * This structure must agree with FPsave and FPrestore asm routines
+ */
+typedef struct FPU FPU;
+struct FPU
+{
+	uchar	env[18*8];
+};
+
+#define KSTACK (32 * 1024)
+
+extern	Proc*	getup(void);
+
+#define	up	(getup())
+
+typedef sigjmp_buf osjmpbuf;
+#define	ossetjmp(buf)	sigsetjmp(buf, 1)
+
+#define	pthread_yield	sched_yield
--- /dev/null
+++ b/AIX/power/include/lib9.h
@@ -1,0 +1,509 @@
+#define _DEFAULT_SOURCE
+#define _BSD_SOURCE
+#define _LINUX_SOURCE_COMPAT
+#define _XOPEN_SOURCE  500
+#define _LARGEFILE_SOURCE	1
+#define _LARGEFILE64_SOURCE	1
+#define _FILE_OFFSET_BITS 64
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#define sync __os_sync
+#include <unistd.h>
+#undef sync
+#include <errno.h>
+#define __NO_STRING_INLINES
+#include <string.h>
+#include "math.h"
+#include <fcntl.h>
+#include <setjmp.h>
+#include <float.h>
+
+#define	getwd	infgetwd
+
+#ifndef EMU
+typedef struct Proc Proc;
+#endif
+
+#undef __LITTLE_ENDIAN
+
+#define	nil		((void*)0)
+
+typedef unsigned char	uchar;
+typedef signed char	schar;
+typedef unsigned int Rune;
+typedef long long int	vlong;
+typedef unsigned long long int	uvlong;
+typedef unsigned int u32int;
+typedef uvlong u64int;
+typedef unsigned long ulong;
+typedef unsigned short ushort;
+typedef unsigned int uint;
+
+typedef unsigned int	mpdigit;	/* for /sys/include/mp.h */
+typedef unsigned short u16int;
+typedef unsigned char u8int;
+typedef unsigned long uintptr;
+
+#define	USED(x)		if(x){}else{}
+#define	SET(x)
+
+#undef nelem
+#define	nelem(x)	(sizeof(x)/sizeof((x)[0]))
+#undef offsetof
+#define	offsetof(s, m)	(ulong)(&(((s*)0)->m))
+#undef assert
+#define	assert(x)	if(x){}else _assert("x")
+
+/*
+ * most mem and string routines are declared by ANSI/POSIX files above
+ */
+
+extern	char*	strecpy(char*, char*, char*);
+extern	char*	strdup(const char*);
+extern	int	cistrncmp(char*, char*, int);
+extern	int	cistrcmp(char*, char*);
+extern	char*	cistrstr(char*, char*);
+extern	int	tokenize(char*, char**, int);
+
+enum
+{
+	UTFmax		= 4,		/* maximum bytes per rune */
+	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
+	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
+	Runeerror	= 0xFFFD,	/* decoding error in UTF */
+	Runemax		= 0x10FFFF,	/* 21-bit rune */
+	Runemask	= 0x1FFFFF,	/* bits used by runes (see grep) */
+};
+
+/*
+ * rune routines
+ */
+extern	int	runetochar(char*, Rune*);
+extern	int	chartorune(Rune*, char*);
+extern	int	runelen(long);
+extern	int	runenlen(Rune*, int);
+extern	int	fullrune(char*, int);
+extern	int	utflen(char*);
+extern	int	utfnlen(char*, long);
+extern	char*	utfrune(char*, long);
+extern	char*	utfrrune(char*, long);
+extern	char*	utfutf(char*, char*);
+extern	char*	utfecpy(char*, char*, char*);
+
+extern	Rune*	runestrcat(Rune*, Rune*);
+extern	Rune*	runestrchr(Rune*, Rune);
+extern	int	runestrcmp(Rune*, Rune*);
+extern	Rune*	runestrcpy(Rune*, Rune*);
+extern	Rune*	runestrncpy(Rune*, Rune*, long);
+extern	Rune*	runestrecpy(Rune*, Rune*, Rune*);
+extern	Rune*	runestrdup(Rune*);
+extern	Rune*	runestrncat(Rune*, Rune*, long);
+extern	int	runestrncmp(Rune*, Rune*, long);
+extern	Rune*	runestrrchr(Rune*, Rune);
+extern	long	runestrlen(Rune*);
+extern	Rune*	runestrstr(Rune*, Rune*);
+
+extern	Rune	tolowerrune(Rune);
+extern	Rune	totitlerune(Rune);
+extern	Rune	toupperrune(Rune);
+extern	int	isalpharune(Rune);
+extern	int	islowerrune(Rune);
+extern	int	isspacerune(Rune);
+extern	int	istitlerune(Rune);
+extern	int	isupperrune(Rune);
+
+/*
+ * malloc
+ */
+extern	void*	malloc(size_t);
+extern	void*	mallocz(ulong, int);
+extern	void	free(void*);
+extern	ulong	msize(void*);
+extern	void*	calloc(size_t, size_t);
+extern	void*	realloc(void*, size_t);
+extern	void		setmalloctag(void*, ulong);
+extern	void		setrealloctag(void*, ulong);
+extern	ulong	getmalloctag(void*);
+extern	ulong	getrealloctag(void*);
+extern	void*	malloctopoolblock(void*);
+
+/*
+ * print routines
+ */
+typedef struct Fmt	Fmt;
+struct Fmt{
+	uchar	runes;			/* output buffer is runes or chars? */
+	void	*start;			/* of buffer */
+	void	*to;			/* current place in the buffer */
+	void	*stop;			/* end of the buffer; overwritten if flush fails */
+	int	(*flush)(Fmt *);	/* called when to == stop */
+	void	*farg;			/* to make flush a closure */
+	int	nfmt;			/* num chars formatted so far */
+	va_list	args;			/* args passed to dofmt */
+	int	r;			/* % format Rune */
+	int	width;
+	int	prec;
+	ulong	flags;
+};
+
+enum{
+	FmtWidth	= 1,
+	FmtLeft		= FmtWidth << 1,
+	FmtPrec		= FmtLeft << 1,
+	FmtSharp	= FmtPrec << 1,
+	FmtSpace	= FmtSharp << 1,
+	FmtSign		= FmtSpace << 1,
+	FmtZero		= FmtSign << 1,
+	FmtUnsigned	= FmtZero << 1,
+	FmtShort	= FmtUnsigned << 1,
+	FmtLong		= FmtShort << 1,
+	FmtVLong	= FmtLong << 1,
+	FmtComma	= FmtVLong << 1,
+	FmtByte	= FmtComma << 1,
+
+	FmtFlag		= FmtByte << 1
+};
+
+extern	int	print(char*, ...);
+extern	char*	seprint(char*, char*, char*, ...);
+extern	char*	vseprint(char*, char*, char*, va_list);
+extern	int	snprint(char*, int, char*, ...);
+extern	int	vsnprint(char*, int, char*, va_list);
+extern	char*	smprint(char*, ...);
+extern	char*	vsmprint(char*, va_list);
+extern	int	sprint(char*, char*, ...);
+extern	int	fprint(int, char*, ...);
+extern	int	vfprint(int, char*, va_list);
+
+extern	int	runesprint(Rune*, char*, ...);
+extern	int	runesnprint(Rune*, int, char*, ...);
+extern	int	runevsnprint(Rune*, int, char*, va_list);
+extern	Rune*	runeseprint(Rune*, Rune*, char*, ...);
+extern	Rune*	runevseprint(Rune*, Rune*, char*, va_list);
+extern	Rune*	runesmprint(char*, ...);
+extern	Rune*	runevsmprint(char*, va_list);
+
+extern	int	fmtfdinit(Fmt*, int, char*, int);
+extern	int	fmtfdflush(Fmt*);
+extern	int	fmtstrinit(Fmt*);
+extern	char*	fmtstrflush(Fmt*);
+extern	int	runefmtstrinit(Fmt*);
+extern	Rune*	runefmtstrflush(Fmt*);
+
+extern	int	fmtinstall(int, int (*)(Fmt*));
+extern	int	dofmt(Fmt*, char*);
+extern	int	dorfmt(Fmt*, Rune*);
+extern	int	fmtprint(Fmt*, char*, ...);
+extern	int	fmtvprint(Fmt*, char*, va_list);
+extern	int	fmtrune(Fmt*, int);
+extern	int	fmtstrcpy(Fmt*, char*);
+extern	int	fmtrunestrcpy(Fmt*, Rune*);
+/*
+ * error string for %r
+ * supplied on per os basis, not part of fmt library
+ */
+extern	int	errfmt(Fmt *f);
+
+/*
+ * quoted strings
+ */
+extern	char	*unquotestrdup(char*);
+extern	Rune	*unquoterunestrdup(Rune*);
+extern	char	*quotestrdup(char*);
+extern	Rune	*quoterunestrdup(Rune*);
+extern	int	quotestrfmt(Fmt*);
+extern	int	quoterunestrfmt(Fmt*);
+extern	void	quotefmtinstall(void);
+extern	int	(*doquote)(int);
+
+/*
+ * random number
+ */
+extern	ulong	truerand(void);
+extern	ulong	ntruerand(ulong);
+
+/*
+ * math
+ */
+extern	int	isNaN(double);
+extern	double	NaN(void);
+extern	int	isInf(double, int);
+
+/*
+ * Time-of-day
+ */
+
+typedef struct Tm Tm;
+struct Tm {
+	int	sec;
+	int	min;
+	int	hour;
+	int	mday;
+	int	mon;
+	int	year;
+	int	wday;
+	int	yday;
+	char	zone[4];
+	int	tzoff;
+};
+extern	vlong	osnsec(void);
+#define	nsec	osnsec
+	
+/*
+ * one-of-a-kind
+ */
+extern	void	_assert(char*);
+extern	double	charstod(int(*)(void*), void*);
+extern	char*	cleanname(char*);
+extern	uintptr	getcallerpc(void*);
+extern	int	getfields(char*, char**, int, int, char*);
+extern	char*	getuser(void);
+extern	char*	getwd(char*, int);
+extern	double	ipow10(int);
+#define	pow10	infpow10
+extern	double	pow10(int);
+extern	vlong	strtoll(const char*, char**, int);
+#define	qsort	infqsort
+extern	void	qsort(void*, long, long, int (*)(void*, void*));
+extern	uvlong	strtoull(const char*, char**, int);
+extern	void	sysfatal(char*, ...);
+extern	int	dec64(uchar*, int, char*, int);
+extern	int	enc64(char*, int, uchar*, int);
+extern	int	dec32(uchar*, int, char*, int);
+extern	int	enc32(char*, int, uchar*, int);
+extern	int	dec16(uchar*, int, char*, int);
+extern	int	enc16(char*, int, uchar*, int);
+extern	int	encodefmt(Fmt*);
+
+/*
+ *  synchronization
+ */
+typedef
+struct Lock {
+	int	val;
+	int	pid;
+} Lock;
+
+extern int	_tas(int*);
+
+extern	void	lock(Lock*);
+extern	void	unlock(Lock*);
+extern	int	canlock(Lock*);
+
+typedef struct QLock QLock;
+struct QLock
+{
+	Lock	use;			/* to access Qlock structure */
+	Proc	*head;			/* next process waiting for object */
+	Proc	*tail;			/* last process waiting for object */
+	int	locked;			/* flag */
+};
+
+extern	void	qlock(QLock*);
+extern	void	qunlock(QLock*);
+extern	int	canqlock(QLock*);
+extern	void	_qlockinit(ulong (*)(ulong, ulong));	/* called only by the thread library */
+
+typedef
+struct RWLock
+{
+	Lock	l;			/* Lock modify lock */
+	QLock	x;			/* Mutual exclusion lock */
+	QLock	k;			/* Lock for waiting writers */
+	int	readers;		/* Count of readers in lock */
+} RWLock;
+
+extern	int	canrlock(RWLock*);
+extern	int	canwlock(RWLock*);
+extern	void	rlock(RWLock*);
+extern	void	runlock(RWLock*);
+extern	void	wlock(RWLock*);
+extern	void	wunlock(RWLock*);
+
+/*
+ * network dialing
+ */
+#define NETPATHLEN 40
+
+/*
+ * system calls
+ *
+ */
+#define	STATMAX	65535U	/* max length of machine-independent stat structure */
+#define	DIRMAX	(sizeof(Dir)+STATMAX)	/* max length of Dir structure */
+#define	ERRMAX	128	/* max length of error string */
+
+#define	MORDER	0x0003	/* mask for bits defining order of mounting */
+#define	MREPL	0x0000	/* mount replaces object */
+#define	MBEFORE	0x0001	/* mount goes before others in union directory */
+#define	MAFTER	0x0002	/* mount goes after others in union directory */
+#define	MCREATE	0x0004	/* permit creation in mounted directory */
+#define	MCACHE	0x0010	/* cache some data */
+#define	MMASK	0x0017	/* all bits on */
+
+#define	OREAD	0	/* open for read */
+#define	OWRITE	1	/* write */
+#define	ORDWR	2	/* read and write */
+#define	OEXEC	3	/* execute, == read but check execute permission */
+#define	OTRUNC	16	/* or'ed in (except for exec), truncate file first */
+#define	OCEXEC	32	/* or'ed in, close on exec */
+#define	ORCLOSE	64	/* or'ed in, remove on close */
+#define	OEXCL	0x1000	/* or'ed in, exclusive use (create only) */
+
+#define	AEXIST	0	/* accessible: exists */
+#define	AEXEC	1	/* execute access */
+#define	AWRITE	2	/* write access */
+#define	AREAD	4	/* read access */
+
+/* bits in Qid.type */
+#define QTDIR		0x80		/* type bit for directories */
+#define QTAPPEND	0x40		/* type bit for append only files */
+#define QTEXCL		0x20		/* type bit for exclusive use files */
+#define QTMOUNT		0x10		/* type bit for mounted channel */
+#define QTAUTH		0x08		/* type bit for authentication file */
+#define QTFILE		0x00		/* plain file */
+
+/* bits in Dir.mode */
+#define DMDIR		0x80000000	/* mode bit for directories */
+#define DMAPPEND	0x40000000	/* mode bit for append only files */
+#define DMEXCL		0x20000000	/* mode bit for exclusive use files */
+#define DMMOUNT		0x10000000	/* mode bit for mounted channel */
+#define DMAUTH		0x08000000	/* mode bit for authentication file */
+#define DMREAD		0x4		/* mode bit for read permission */
+#define DMWRITE		0x2		/* mode bit for write permission */
+#define DMEXEC		0x1		/* mode bit for execute permission */
+
+typedef
+struct Qid
+{
+	uvlong	path;
+	ulong	vers;
+	uchar	type;
+} Qid;
+
+typedef
+struct Dir {
+	/* system-modified data */
+	ushort	type;	/* server type */
+	uint	dev;	/* server subtype */
+	/* file data */
+	Qid	qid;	/* unique id from server */
+	ulong	mode;	/* permissions */
+	ulong	atime;	/* last read time */
+	ulong	mtime;	/* last write time */
+	vlong	length;	/* file length */
+	char	*name;	/* last element of path */
+	char	*uid;	/* owner name */
+	char	*gid;	/* group name */
+	char	*muid;	/* last modifier name */
+} Dir;
+
+extern	Dir*	dirstat(char*);
+extern	Dir*	dirfstat(int);
+extern	int	dirwstat(char*, Dir*);
+extern	int	dirfwstat(int, Dir*);
+extern	long	dirread(int, Dir**);
+extern	void	nulldir(Dir*);
+extern	long	dirreadall(int, Dir**);
+
+typedef
+struct Waitmsg
+{
+	int pid;	/* of loved one */
+	ulong time[3];	/* of loved one & descendants */
+	char	*msg;
+} Waitmsg;
+
+extern	void	_exits(char*);
+
+extern	void	exits(char*);
+extern	int	create(char*, int, int);
+extern	int	errstr(char*, uint);
+
+extern	void	perror(const char*);
+extern	long	readn(int, void*, long);
+extern	int	remove(const char*);
+extern	void	rerrstr(char*, uint);
+extern	vlong	seek(int, vlong, int);
+extern	int	segflush(void*, ulong);
+extern	void	werrstr(char*, ...);
+
+extern char *argv0;
+#define	ARGBEGIN	for((argv0||(argv0=*argv)),argv++,argc--;\
+			    argv[0] && argv[0][0]=='-' && argv[0][1];\
+			    argc--, argv++) {\
+				char *_args, *_argt;\
+				Rune _argc;\
+				_args = &argv[0][1];\
+				if(_args[0]=='-' && _args[1]==0){\
+					argc--; argv++; break;\
+				}\
+				_argc = 0;\
+				while(*_args && (_args += chartorune(&_argc, _args)))\
+				switch(_argc)
+#define	ARGEND		SET(_argt);USED(_argt);USED(_argc); USED(_args);}USED(argv); USED(argc);
+#define	ARGF()		(_argt=_args, _args="",\
+				(*_argt? _argt: argv[1]? (argc--, *++argv): 0))
+#define	EARGF(x)	(_argt=_args, _args="",\
+				(*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0)))
+
+#define	ARGC()		_argc
+
+/*
+ *	Extensions for Inferno to basic libc.h
+ */
+
+#define	setbinmode()
+
+extern	void	setfcr(ulong);
+extern	void	setfsr(ulong);
+extern	ulong	getfcr(void);
+extern	ulong	getfsr(void);
+
+
+/* FPSCR */
+#define	FPSFX	(1<<31)	/* exception summary (sticky) */
+#define	FPSEX	(1<<30)	/* enabled exception summary */
+#define	FPSVX	(1<<29)	/* invalid operation exception summary */
+#define	FPSOX	(1<<28)	/* overflow exception OX (sticky) */
+#define	FPSUX	(1<<27)	/* underflow exception UX (sticky) */
+#define	FPSZX	(1<<26)	/* zero divide exception ZX (sticky) */
+#define	FPSXX	(1<<25)	/* inexact exception XX (sticky) */
+#define	FPSVXSNAN (1<<24)	/* invalid operation exception for SNaN (sticky) */
+#define	FPSVXISI	(1<<23)	/* invalid operation exception for ∞-∞ (sticky) */
+#define	FPSVXIDI	(1<<22)	/* invalid operation exception for ∞/∞ (sticky) */
+#define	FPSVXZDZ (1<<21)	/* invalid operation exception for 0/0 (sticky) */
+#define	FPSVXIMZ	(1<<20)	/* invalid operation exception for ∞*0 (sticky) */
+#define	FPSVXVC	(1<<19)	/* invalid operation exception for invalid compare (sticky) */
+#define	FPSFR	(1<<18)	/* fraction rounded */
+#define	FPSFI	(1<<17)	/* fraction inexact */
+#define	FPSFPRF	(1<<16)	/* floating point result class */
+#define	FPSFPCC	(0xF<<12)	/* <, >, =, unordered */
+#define	FPVXCVI	(1<<8)	/* enable exception for invalid integer convert (sticky) */
+
+/* FCR */
+#define	FPVE	(1<<7)	/* invalid operation exception enable */
+#define	FPOVFL	(1<<6)	/* enable overflow exceptions */
+#define	FPUNFL	(1<<5)	/* enable underflow */
+#define	FPZDIV	(1<<4)	/* enable zero divide */
+#define	FPINEX	(1<<3)	/* enable inexact exceptions */
+#define	FPRMASK	(3<<0)	/* rounding mode */
+#define	FPRNR	(0<<0)
+#define	FPRZ	(1<<0)
+#define	FPRPINF	(2<<0)
+#define	FPRNINF	(3<<0)
+#define	FPPEXT	0
+#define	FPPSGL	0
+#define	FPPDBL	0
+#define	FPPMASK	0
+#define	FPINVAL	FPVE
+/* FSR */
+#define	FPAOVFL	FPSOX
+#define	FPAINEX	FPSXX
+#define	FPAUNFL	FPSUX
+#define	FPAZDIV	FPSZX
+#define	FPAINVAL	FPSVX
+
--- a/FreeBSD/386/include/lib9.h
+++ b/FreeBSD/386/include/lib9.h
@@ -473,31 +473,3 @@
 
 #define	setbinmode()
 
-/* floating point things to get it to build. (stolen from netbsd) */
-
-/* FCR */
-#define	FPINEX	(1<<5)
-#define	FPUNFL	((1<<4)|(1<<1))
-#define	FPOVFL	(1<<3)
-#define	FPZDIV	(1<<2)
-#define	FPINVAL	(1<<0)
-#define	FPRNR	(0<<10)
-#define	FPRZ	(3<<10)
-#define	FPRPINF	(2<<10)
-#define	FPRNINF	(1<<10)
-#define	FPRMASK	(3<<10)
-#define	FPPEXT	(3<<8)
-#define	FPPSGL	(0<<8)
-#define	FPPDBL	(2<<8)
-#define	FPPMASK	(3<<8)
-/* FSR */
-#define	FPAINEX	FPINEX
-#define	FPAOVFL	FPOVFL
-#define	FPAUNFL	FPUNFL
-#define	FPAZDIV	FPZDIV
-#define	FPAINVAL	FPINVAL
-
-extern	void	setfcr(ulong);
-extern	void	setfsr(ulong);
-extern	ulong	getfcr(void);
-extern	ulong	getfsr(void);
binary files a/Linux/386/bin/c2l b/Linux/386/bin/c2l differ
binary files a/Linux/386/bin/data2c b/Linux/386/bin/data2c differ
binary files a/Linux/386/bin/ftl b/Linux/386/bin/ftl differ
binary files a/Linux/386/bin/iar b/Linux/386/bin/iar differ
binary files a/Linux/386/bin/idea b/Linux/386/bin/idea differ
binary files a/Linux/386/bin/inm b/Linux/386/bin/inm differ
binary files a/Linux/386/bin/iyacc b/Linux/386/bin/iyacc differ
binary files a/Linux/386/bin/kprof b/Linux/386/bin/kprof differ
binary files a/Linux/386/bin/ksize b/Linux/386/bin/ksize differ
binary files a/Linux/386/bin/kstrip b/Linux/386/bin/kstrip differ
binary files a/Linux/386/bin/md5sum b/Linux/386/bin/md5sum differ
binary files a/Linux/386/bin/mk b/Linux/386/bin/mk differ
binary files a/Linux/386/bin/mk.save b/Linux/386/bin/mk.save differ
binary files a/Linux/386/bin/mkext b/Linux/386/bin/mkext differ
binary files a/Linux/386/bin/mkppcimage b/Linux/386/bin/mkppcimage differ
binary files a/Linux/386/bin/ms2 b/Linux/386/bin/ms2 differ
binary files a/Linux/386/bin/ndate b/Linux/386/bin/ndate differ
binary files a/Linux/386/bin/sqz b/Linux/386/bin/sqz differ
binary files a/Linux/386/bin/srclist b/Linux/386/bin/srclist differ
binary files a/Linux/386/bin/styxtest b/Linux/386/bin/styxtest differ
--- a/NetBSD/386/include/lib9.h
+++ b/NetBSD/386/include/lib9.h
@@ -244,6 +244,7 @@
  * math
  */
 extern	int	isNaN(double);
+extern	double	NaN(void);
 extern	int	isInf(double, int);
 extern	double	pow(double, double);
 
--- /dev/null
+++ b/NetBSD/power/include/emu.h
@@ -1,0 +1,28 @@
+/*
+ * system- and machine-specific declarations for emu:
+ * floating-point save and restore, signal handling primitive, and
+ * implementation of the current-process variable `up'.
+ */
+
+/*
+ * This structure must agree with FPsave and FPrestore asm routines
+ */
+typedef struct FPU FPU;
+struct FPU
+{
+	uchar	env[18*8];
+};
+
+#define KSTACK (32 * 1024)
+
+static __inline Proc *getup(void) {
+	Proc *p;
+	__asm__(	"mr	%0, 1" : "=r" (p));
+	return *(Proc **)((unsigned long)p & ~(KSTACK - 1));
+};
+
+#define	up	(getup())
+
+typedef sigjmp_buf osjmpbuf;
+#define	ossetjmp(buf)	sigsetjmp(buf, 1)
+
--- /dev/null
+++ b/NetBSD/power/include/lib9.h
@@ -1,0 +1,527 @@
+#include <sys/types.h>
+#include <sys/endian.h>
+#include <sys/stat.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <math.h>
+#include <fcntl.h>
+#include <setjmp.h>
+#include <float.h>
+#include <time.h>
+
+#define	getwd	infgetwd
+
+#define	round	infround
+#define	fmax	inffmax
+#define	log2	inflog2
+
+#ifndef EMU
+typedef struct Proc Proc;
+#endif
+
+/*
+ * math module dtoa
+ */
+#if _BYTE_ORDER == _LITTLE_ENDIAN
+#define __LITTLE_ENDIAN
+#endif
+
+#define	nil		((void*)0)
+
+typedef unsigned char	uchar;
+typedef signed char	schar;
+#if 0 /* XXX: uwe: already defined in <sys/types.h> */
+typedef unsigned long	ulong;
+#endif
+
+typedef int64_t		vlong;
+typedef uint64_t	uvlong;
+
+typedef uint8_t		u8int;
+typedef uint16_t	u16int;
+typedef uint32_t	u32int;
+typedef uvlong u64int;
+
+typedef uintptr_t	uintptr;
+
+typedef signed char	int8;
+typedef unsigned char	uint8;
+typedef short	int16;
+typedef unsigned short	uint16;
+typedef int	int32;
+typedef unsigned int	uint32;
+typedef long long	int64;
+typedef unsigned long long	uint64;
+
+typedef unsigned int Rune;
+typedef unsigned int	mpdigit;	/* for /sys/include/mp.h */
+
+
+#define	USED(x)		if(x){}else{}
+#define	SET(x)
+
+#undef nelem
+#define	nelem(x)	(sizeof(x)/sizeof((x)[0]))
+#undef offsetof
+#define	offsetof(s, m)	(ulong)(&(((s*)0)->m))
+#undef assert
+#define	assert(x)	if(x){}else _assert(#x)
+
+/*
+ * most mem and string routines are declared by ANSI/POSIX files above
+ */
+
+extern	char*	strecpy(char*, char*, char*);
+extern	char*	strdup(const char*);
+extern	int	cistrncmp(char*, char*, int);
+extern	int	cistrcmp(char*, char*);
+extern	char*	cistrstr(char*, char*);
+extern	int	tokenize(char*, char**, int);
+
+enum
+{
+	UTFmax		= 4,		/* maximum bytes per rune */
+	Runesync	= 0x80,		/* cannot represent part of a UTF sequence (<) */
+	Runeself	= 0x80,		/* rune and UTF sequences are the same (<) */
+	Runeerror	= 0xFFFD,	/* decoding error in UTF */
+	Runemax		= 0x10FFFF,	/* 21-bit rune */
+	Runemask	= 0x1FFFFF,	/* bits used by runes (see grep) */
+};
+
+/*
+ * rune routines
+ */
+extern	int	runetochar(char*, Rune*);
+extern	int	chartorune(Rune*, char*);
+extern	int	runelen(long);
+extern	int	runenlen(Rune*, int);
+extern	int	fullrune(char*, int);
+extern	int	utflen(char*);
+extern	int	utfnlen(char*, long);
+extern	char*	utfrune(char*, long);
+extern	char*	utfrrune(char*, long);
+extern	char*	utfutf(char*, char*);
+extern	char*	utfecpy(char*, char*, char*);
+
+extern	Rune*	runestrcat(Rune*, Rune*);
+extern	Rune*	runestrchr(Rune*, Rune);
+extern	int	runestrcmp(Rune*, Rune*);
+extern	Rune*	runestrcpy(Rune*, Rune*);
+extern	Rune*	runestrncpy(Rune*, Rune*, long);
+extern	Rune*	runestrecpy(Rune*, Rune*, Rune*);
+extern	Rune*	runestrdup(Rune*);
+extern	Rune*	runestrncat(Rune*, Rune*, long);
+extern	int	runestrncmp(Rune*, Rune*, long);
+extern	Rune*	runestrrchr(Rune*, Rune);
+extern	long	runestrlen(Rune*);
+extern	Rune*	runestrstr(Rune*, Rune*);
+
+extern	Rune	tolowerrune(Rune);
+extern	Rune	totitlerune(Rune);
+extern	Rune	toupperrune(Rune);
+extern	int	isalpharune(Rune);
+extern	int	islowerrune(Rune);
+extern	int	isspacerune(Rune);
+extern	int	istitlerune(Rune);
+extern	int	isupperrune(Rune);
+
+/*
+ * malloc
+ */
+extern	void*	malloc(size_t);
+extern	void*	mallocz(ulong, int);
+extern	void	free(void*);
+extern	ulong	msize(void*);
+extern	void*	calloc(size_t, size_t);
+extern	void*	realloc(void*, size_t);
+extern	void		setmalloctag(void*, ulong);
+extern	void		setrealloctag(void*, ulong);
+extern	ulong	getmalloctag(void*);
+extern	ulong	getrealloctag(void*);
+extern	void*	malloctopoolblock(void*);
+
+/*
+ * print routines
+ */
+typedef struct Fmt	Fmt;
+struct Fmt{
+	uchar	runes;			/* output buffer is runes or chars? */
+	void	*start;			/* of buffer */
+	void	*to;			/* current place in the buffer */
+	void	*stop;			/* end of the buffer; overwritten if flush fails */
+	int	(*flush)(Fmt *);	/* called when to == stop */
+	void	*farg;			/* to make flush a closure */
+	int	nfmt;			/* num chars formatted so far */
+	va_list	args;			/* args passed to dofmt */
+	int	r;			/* % format Rune */
+	int	width;
+	int	prec;
+	ulong	flags;
+};
+
+enum{
+	FmtWidth	= 1,
+	FmtLeft		= FmtWidth << 1,
+	FmtPrec		= FmtLeft << 1,
+	FmtSharp	= FmtPrec << 1,
+	FmtSpace	= FmtSharp << 1,
+	FmtSign		= FmtSpace << 1,
+	FmtZero		= FmtSign << 1,
+	FmtUnsigned	= FmtZero << 1,
+	FmtShort	= FmtUnsigned << 1,
+	FmtLong		= FmtShort << 1,
+	FmtVLong	= FmtLong << 1,
+	FmtComma	= FmtVLong << 1,
+	FmtByte	= FmtComma << 1,
+
+	FmtFlag		= FmtByte << 1
+};
+
+extern	int	print(char*, ...);
+extern	char*	seprint(char*, char*, char*, ...);
+extern	char*	vseprint(char*, char*, char*, va_list);
+extern	int	snprint(char*, int, char*, ...);
+extern	int	vsnprint(char*, int, char*, va_list);
+extern	char*	smprint(char*, ...);
+extern	char*	vsmprint(char*, va_list);
+extern	int	sprint(char*, char*, ...);
+extern	int	fprint(int, char*, ...);
+extern	int	vfprint(int, char*, va_list);
+
+extern	int	runesprint(Rune*, char*, ...);
+extern	int	runesnprint(Rune*, int, char*, ...);
+extern	int	runevsnprint(Rune*, int, char*, va_list);
+extern	Rune*	runeseprint(Rune*, Rune*, char*, ...);
+extern	Rune*	runevseprint(Rune*, Rune*, char*, va_list);
+extern	Rune*	runesmprint(char*, ...);
+extern	Rune*	runevsmprint(char*, va_list);
+
+extern	int	fmtfdinit(Fmt*, int, char*, int);
+extern	int	fmtfdflush(Fmt*);
+extern	int	fmtstrinit(Fmt*);
+extern	char*	fmtstrflush(Fmt*);
+extern	int	runefmtstrinit(Fmt*);
+extern	Rune*	runefmtstrflush(Fmt*);
+
+extern	int	fmtinstall(int, int (*)(Fmt*));
+extern	int	dofmt(Fmt*, char*);
+extern	int	dorfmt(Fmt*, Rune*);
+extern	int	fmtprint(Fmt*, char*, ...);
+extern	int	fmtvprint(Fmt*, char*, va_list);
+extern	int	fmtrune(Fmt*, int);
+extern	int	fmtstrcpy(Fmt*, char*);
+extern	int	fmtrunestrcpy(Fmt*, Rune*);
+/*
+ * error string for %r
+ * supplied on per os basis, not part of fmt library
+ */
+extern	int	errfmt(Fmt *f);
+
+/*
+ * quoted strings
+ */
+extern	char	*unquotestrdup(char*);
+extern	Rune	*unquoterunestrdup(Rune*);
+extern	char	*quotestrdup(char*);
+extern	Rune	*quoterunestrdup(Rune*);
+extern	int	quotestrfmt(Fmt*);
+extern	int	quoterunestrfmt(Fmt*);
+extern	void	quotefmtinstall(void);
+extern	int	(*doquote)(int);
+
+/*
+ * random number
+ */
+extern	int	nrand(int);
+extern	ulong	truerand(void);
+extern	ulong	ntruerand(ulong);
+
+/*
+ * math
+ */
+extern	int	isNaN(double);
+extern	double	NaN(void);
+extern	int	isInf(double, int);
+extern	double	pow(double, double);
+
+/*
+ * Time-of-day
+ */
+
+typedef struct Tm Tm;
+struct Tm {
+	int	sec;
+	int	min;
+	int	hour;
+	int	mday;
+	int	mon;
+	int	year;
+	int	wday;
+	int	yday;
+	char	zone[4];
+	int	tzoff;
+};
+extern	vlong	osnsec(void);
+#define	nsec	osnsec
+	
+/*
+ * one-of-a-kind
+ */
+extern	void	_assert(char*);
+extern	double	charstod(int(*)(void*), void*);
+extern	char*	cleanname(char*);
+extern	double	frexp(double, int*);
+extern	ulong	getcallerpc(void*);
+extern	int	getfields(char*, char**, int, int, char*);
+extern	char*	getuser(void);
+extern	char*	getwd(char*, int);
+extern	double	ipow10(int);
+extern	double	ldexp(double, int);
+extern	double	modf(double, double*);
+#define	pow10	infpow10
+extern	double	pow10(int);
+extern	vlong	strtoll(const char*, char**, int);
+#define	qsort	infqsort
+extern	void	qsort(void*, long, long, int (*)(void*, void*));
+extern	uvlong	strtoull(const char*, char**, int);
+extern	void	sysfatal(char*, ...);
+extern	int	dec64(uchar*, int, char*, int);
+extern	int	enc64(char*, int, uchar*, int);
+extern	int	dec32(uchar*, int, char*, int);
+extern	int	enc32(char*, int, uchar*, int);
+extern	int	dec16(uchar*, int, char*, int);
+extern	int	enc16(char*, int, uchar*, int);
+extern	int	encodefmt(Fmt*);
+
+/*
+ *  synchronization
+ */
+typedef
+struct Lock {
+	int	val;
+	int	pid;
+} Lock;
+
+extern int	_tas(int*);
+
+extern	void	lock(Lock*);
+extern	void	unlock(Lock*);
+extern	int	canlock(Lock*);
+
+typedef struct QLock QLock;
+struct QLock
+{
+	Lock	use;			/* to access Qlock structure */
+	Proc	*head;			/* next process waiting for object */
+	Proc	*tail;			/* last process waiting for object */
+	int	locked;			/* flag */
+};
+
+extern	void	qlock(QLock*);
+extern	void	qunlock(QLock*);
+extern	int	canqlock(QLock*);
+extern	void	_qlockinit(ulong (*)(ulong, ulong));	/* called only by the thread library */
+
+typedef
+struct RWLock
+{
+	Lock	l;			/* Lock modify lock */
+	QLock	x;			/* Mutual exclusion lock */
+	QLock	k;			/* Lock for waiting writers */
+	int	readers;		/* Count of readers in lock */
+} RWLock;
+
+extern	int	canrlock(RWLock*);
+extern	int	canwlock(RWLock*);
+extern	void	rlock(RWLock*);
+extern	void	runlock(RWLock*);
+extern	void	wlock(RWLock*);
+extern	void	wunlock(RWLock*);
+
+/*
+ * network dialing
+ */
+#define NETPATHLEN 40
+
+/*
+ * system calls
+ *
+ */
+#define	STATMAX	65535U	/* max length of machine-independent stat structure */
+#define	DIRMAX	(sizeof(Dir)+STATMAX)	/* max length of Dir structure */
+#define	ERRMAX	128	/* max length of error string */
+
+#define	MORDER	0x0003	/* mask for bits defining order of mounting */
+#define	MREPL	0x0000	/* mount replaces object */
+#define	MBEFORE	0x0001	/* mount goes before others in union directory */
+#define	MAFTER	0x0002	/* mount goes after others in union directory */
+#define	MCREATE	0x0004	/* permit creation in mounted directory */
+#define	MCACHE	0x0010	/* cache some data */
+#define	MMASK	0x0017	/* all bits on */
+
+#define	OREAD	0	/* open for read */
+#define	OWRITE	1	/* write */
+#define	ORDWR	2	/* read and write */
+#define	OEXEC	3	/* execute, == read but check execute permission */
+#define	OTRUNC	16	/* or'ed in (except for exec), truncate file first */
+#define	OCEXEC	32	/* or'ed in, close on exec */
+#define	ORCLOSE	64	/* or'ed in, remove on close */
+#define	OEXCL	0x1000	/* or'ed in, exclusive use (create only) */
+
+#define	AEXIST	0	/* accessible: exists */
+#define	AEXEC	1	/* execute access */
+#define	AWRITE	2	/* write access */
+#define	AREAD	4	/* read access */
+
+/* bits in Qid.type */
+#define QTDIR		0x80		/* type bit for directories */
+#define QTAPPEND	0x40		/* type bit for append only files */
+#define QTEXCL		0x20		/* type bit for exclusive use files */
+#define QTMOUNT		0x10		/* type bit for mounted channel */
+#define QTAUTH		0x08		/* type bit for authentication file */
+#define QTFILE		0x00		/* plain file */
+
+/* bits in Dir.mode */
+#define DMDIR		0x80000000	/* mode bit for directories */
+#define DMAPPEND	0x40000000	/* mode bit for append only files */
+#define DMEXCL		0x20000000	/* mode bit for exclusive use files */
+#define DMMOUNT		0x10000000	/* mode bit for mounted channel */
+#define DMAUTH		0x08000000	/* mode bit for authentication file */
+#define DMREAD		0x4		/* mode bit for read permission */
+#define DMWRITE		0x2		/* mode bit for write permission */
+#define DMEXEC		0x1		/* mode bit for execute permission */
+
+typedef
+struct Qid
+{
+	uvlong	path;
+	ulong	vers;
+	uchar	type;
+} Qid;
+
+typedef
+struct Dir {
+	/* system-modified data */
+	ushort	type;	/* server type */
+	uint	dev;	/* server subtype */
+	/* file data */
+	Qid	qid;	/* unique id from server */
+	ulong	mode;	/* permissions */
+	ulong	atime;	/* last read time */
+	ulong	mtime;	/* last write time */
+	vlong	length;	/* file length */
+	char	*name;	/* last element of path */
+	char	*uid;	/* owner name */
+	char	*gid;	/* group name */
+	char	*muid;	/* last modifier name */
+} Dir;
+
+extern	Dir*	dirstat(char*);
+extern	Dir*	dirfstat(int);
+extern	int	dirwstat(char*, Dir*);
+extern	int	dirfwstat(int, Dir*);
+extern	long	dirread(int, Dir**);
+extern	void	nulldir(Dir*);
+extern	long	dirreadall(int, Dir**);
+
+typedef
+struct Waitmsg
+{
+	int pid;	/* of loved one */
+	ulong time[3];	/* of loved one & descendants */
+	char	*msg;
+} Waitmsg;
+
+extern	void	_exits(char*);
+
+extern	void	exits(char*);
+extern	int	create(char*, int, int);
+extern	int	errstr(char*, uint);
+
+extern	void	perror(const char*);
+extern	long	readn(int, void*, long);
+extern	int	remove(const char*);
+extern	void	rerrstr(char*, uint);
+extern	vlong	seek(int, vlong, int);
+extern	int	segflush(void*, ulong);
+extern	void	werrstr(char*, ...);
+
+extern char *argv0;
+#define	ARGBEGIN	for((argv0||(argv0=*argv)),argv++,argc--;\
+			    argv[0] && argv[0][0]=='-' && argv[0][1];\
+			    argc--, argv++) {\
+				char *_args, *_argt;\
+				Rune _argc;\
+				_args = &argv[0][1];\
+				if(_args[0]=='-' && _args[1]==0){\
+					argc--; argv++; break;\
+				}\
+				_argc = 0;\
+				while(*_args && (_args += chartorune(&_argc, _args)))\
+				switch(_argc)
+#define	ARGEND		SET(_argt);USED(_argt);USED(_argc); USED(_args);}USED(argv); USED(argc);
+#define	ARGF()		(_argt=_args, _args="",\
+				(*_argt? _argt: argv[1]? (argc--, *++argv): 0))
+#define	EARGF(x)	(_argt=_args, _args="",\
+				(*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0)))
+
+#define	ARGC()		_argc
+
+/*
+ *	Extensions for Inferno to basic libc.h
+ */
+
+#define	setbinmode()
+
+extern	void	setfcr(ulong);
+extern	void	setfsr(ulong);
+extern	ulong	getfcr(void);
+extern	ulong	getfsr(void);
+
+
+/* FPSCR */
+#define	FPSFX	(1<<31)	/* exception summary (sticky) */
+#define	FPSEX	(1<<30)	/* enabled exception summary */
+#define	FPSVX	(1<<29)	/* invalid operation exception summary */
+#define	FPSOX	(1<<28)	/* overflow exception OX (sticky) */
+#define	FPSUX	(1<<27)	/* underflow exception UX (sticky) */
+#define	FPSZX	(1<<26)	/* zero divide exception ZX (sticky) */
+#define	FPSXX	(1<<25)	/* inexact exception XX (sticky) */
+#define	FPSVXSNAN (1<<24)	/* invalid operation exception for SNaN (sticky) */
+#define	FPSVXISI	(1<<23)	/* invalid operation exception for ∞-∞ (sticky) */
+#define	FPSVXIDI	(1<<22)	/* invalid operation exception for ∞/∞ (sticky) */
+#define	FPSVXZDZ (1<<21)	/* invalid operation exception for 0/0 (sticky) */
+#define	FPSVXIMZ	(1<<20)	/* invalid operation exception for ∞*0 (sticky) */
+#define	FPSVXVC	(1<<19)	/* invalid operation exception for invalid compare (sticky) */
+#define	FPSFR	(1<<18)	/* fraction rounded */
+#define	FPSFI	(1<<17)	/* fraction inexact */
+#define	FPSFPRF	(1<<16)	/* floating point result class */
+#define	FPSFPCC	(0xF<<12)	/* <, >, =, unordered */
+#define	FPVXCVI	(1<<8)	/* enable exception for invalid integer convert (sticky) */
+
+/* FCR */
+#define	FPVE	(1<<7)	/* invalid operation exception enable */
+#define	FPOVFL	(1<<6)	/* enable overflow exceptions */
+#define	FPUNFL	(1<<5)	/* enable underflow */
+#define	FPZDIV	(1<<4)	/* enable zero divide */
+#define	FPINEX	(1<<3)	/* enable inexact exceptions */
+#define	FPRMASK	(3<<0)	/* rounding mode */
+#define	FPRNR	(0<<0)
+#define	FPRZ	(1<<0)
+#define	FPRPINF	(2<<0)
+#define	FPRNINF	(3<<0)
+#define	FPPEXT	0
+#define	FPPSGL	0
+#define	FPPDBL	0
+#define	FPPMASK	0
+#define	FPINVAL	FPVE
+/* FSR */
+#define	FPAOVFL	FPSOX
+#define	FPAINEX	FPSXX
+#define	FPAUNFL	FPSUX
+#define	FPAZDIV	FPSZX
+#define	FPAINVAL	FPSVX
--- a/OpenBSD/386/include/emu.h
+++ b/OpenBSD/386/include/emu.h
@@ -15,6 +15,7 @@
 
 #define KSTACK (32 * 1024)
 
+#ifndef USE_PTHREADS
 static __inline Proc *getup(void) {
 	Proc *p;
 	__asm__(	"movl	%%esp, %%eax\n\t"
@@ -22,6 +23,9 @@
 	);
 	return *(Proc **)((unsigned long)p & ~(KSTACK - 1));
 };
+#else
+extern	Proc*	getup(void);
+#endif
 
 #define	up	(getup())
 
--- a/OpenBSD/386/include/lib9.h
+++ b/OpenBSD/386/include/lib9.h
@@ -1,4 +1,5 @@
 /* define _BSD_SOURCE to use ISO C, POSIX, and 4.3BSD things. */
+#define	USE_PTHREADS
 #ifndef _BSD_SOURCE
 #define _BSD_SOURCE
 #endif
@@ -5,6 +6,10 @@
 /* these aren't really needed because OpenBSD does the right thing and makes off_t 64 bits, full stop */
 #define _LARGEFILE64_SOURCE	1
 #define _FILE_OFFSET_BITS 64
+
+#ifdef USE_PTHREADS
+#define	_REENTRANT	1
+#endif
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <stdlib.h>
@@ -473,3 +478,29 @@
 
 #define	setbinmode()
 
+/* FCR */
+#define FPINEX  (1<<5)
+#define FPUNFL  ((1<<4)|(1<<1))
+#define FPOVFL  (1<<3)
+#define FPZDIV  (1<<2)
+#define FPINVAL (1<<0)
+#define FPRNR   (0<<10)
+#define FPRZ    (3<<10)
+#define FPRPINF (2<<10)
+#define FPRNINF (1<<10)
+#define FPRMASK (3<<10)
+#define FPPEXT  (3<<8)
+#define FPPSGL  (0<<8)
+#define FPPDBL  (2<<8)
+#define FPPMASK (3<<8)
+/* FSR */
+#define FPAINEX FPINEX
+#define FPAOVFL FPOVFL
+#define FPAUNFL FPUNFL
+#define FPAZDIV FPZDIV
+#define FPAINVAL        FPINVAL
+
+extern  void    setfcr(ulong);
+extern  void    setfsr(ulong);
+extern  ulong   getfcr(void);
+extern  ulong   getfsr(void);
--- a/README.md
+++ b/README.md
@@ -4,6 +4,6 @@
 
 The system can be used to build portable client and server applications. It makes it straightforward to build lean applications that share all manner of resources over a network, without the cruft of much of the 'Grid' software one sees.
 
-Inferno can run 'native' on various ARM, PowerPC, SPARC and x86 platforms but also 'hosted', under an existing operating system (including FreeBSD, Irix, Linux, MacOS X, Plan 9, and Solaris), again on various processor types.
+Inferno can run 'native' on various ARM, PowerPC, SPARC and x86 platforms but also 'hosted', under an existing operating system (including AIX, FreeBSD, Irix, Linux, MacOS X, Plan 9, and Solaris), again on various processor types.
 
 This Bitbucket project includes source for the basic applications, Inferno itself (hosted and native), all supporting software, including the native compiler suite, essential executables and supporting files.
--- a/appl/acme/ecmd.b
+++ b/appl/acme/ecmd.b
@@ -1192,7 +1192,7 @@
 {
 	buf: string;
 	w: ref Window;
-	match, i, dirty: int;
+	match, dirty: int;
 	s: Rangeset;
 
 	# compile expr first so if we get an error, we haven't allocated anything
@@ -1203,7 +1203,7 @@
 	dirty = !w.isdir && !w.isscratch && f.mod;
 	buf = sprint("%c%c%c %s\n", " '"[dirty],
 		'+', " ."[curtext!=nil && curtext.file==f], f.name);
-	(match, s) = rxexecute(nil, buf, 0, i);
+	(match, s) = rxexecute(nil, buf, 0, len buf);
 	buf = nil;
 	return match;
 }
--- a/appl/cmd/limbo/limbo.y
+++ b/appl/cmd/limbo/limbo.y
@@ -655,13 +655,13 @@
 	{
 		$$ = mkids($1.src, enter("junk", 0), $3, nil);
 		$$.store = Darg;
-		yyerror("illegal argument declaraion");
+		yyerror("illegal argument declaration");
 	}
 	| idterms ':' adtk
 	{
 		$$ = mkids($1.src, enter("junk", 0), $3, nil);
 		$$.store = Darg;
-		yyerror("illegal argument declaraion");
+		yyerror("illegal argument declaration");
 	}
 	;
 
--- a/appl/cmd/limbo/types.b
+++ b/appl/cmd/limbo/types.b
@@ -1775,7 +1775,7 @@
 				+id.sym.name+" of "+stypeconv(base));
 		id.cycerr = byte 1;
 	}else if(arc & ArcCyc){
-		if((arc & ArcArray) && id.cyc == byte 0 && !(arc & ArcPolycyc)){
+		if((arc & ArcArray) && oldcycles && id.cyc == byte 0 && !(arc & ArcPolycyc)){
 			if(id.cycerr == byte 0)
 				error(base.src.start, "illegal circular reference to type "+typeconv(id.ty)
 					+" in field "+id.sym.name+" of "+stypeconv(base));
--- a/appl/cmd/m4.b
+++ b/appl/cmd/m4.b
@@ -52,8 +52,11 @@
 rquote := '\'';
 initcom := "#";
 endcom := "\n";
+prefix := "";
 bout: ref Iobuf;
 sh: Sh;
+stderr: ref Sys->FD;
+tracing := 0;
 
 init(nil: ref Draw->Context, args: list of string)
 {
@@ -61,9 +64,27 @@
 	bufio = load Bufio Bufio->PATH;
 
 	bout = bufio->fopen(sys->fildes(1), Sys->OWRITE);
+	stderr = sys->fildes(2);
 
 	define("inferno", "inferno", 0);
 
+	arg := load Arg Arg->PATH;
+	arg->setusage("m4 [-t] [-pprefix] [-Dname[=value]] [-Qname[=value]] [-Uname] [file ...]");
+	arg->init(args);
+
+	while((o := arg->opt()) != 0){
+		case o {
+		'D' or 'Q' or 'U' =>
+			;	# for second pass
+		'p' =>
+			prefix = arg->earg();
+		't' =>
+			tracing = 1;
+		* =>
+			arg->usage();
+		}
+	}
+
 	builtin("changecom", dochangecom);
 	builtin("changequote", dochangequote);
 	builtin("copydef", docopydef);
@@ -88,11 +109,9 @@
 	builtin("undefine", doundefine);
 	builtin("undivert", doundivert);
 
-	arg := load Arg Arg->PATH;
-	arg->setusage("m4 [-Dname[=value]] [-Qname[=value]] [-Uname] [file ...]");
 	arg->init(args);
 
-	while((o := arg->opt()) != 0){
+	while((o = arg->opt()) != 0){
 		case o {
 		'D' =>
 			argdefine(arg->earg(), 0);
@@ -100,6 +119,10 @@
 			argdefine(arg->earg(), 1);
 		'U' =>
 			undefine(arg->earg());
+		'p' =>
+			arg->earg();
+		't' =>
+			;
 		* =>
 			arg->usage();
 		}
@@ -157,7 +180,8 @@
 		ios := hd instack;
 		where = sys->sprint(" %s:%d:", ios.name, ios.line);
 	}
-	sys->fprint(sys->fildes(2), "m4:%s %s\n", where, s);
+	bout.flush();
+	sys->fprint(stderr, "m4:%s %s\n", where, s);
 	raise "fail:error";
 }
 
@@ -191,9 +215,12 @@
 	curarg = ref Param("");
 	nesting := 0;	# () depth
 	skipws();
+	mark := instack;
 	for(;;){
-		if((c = getc()) < 0)
+		if((c = getc()) < 0) {
+			instack = mark;
 			error("EOF in parameters");
+		}
 		if(isalpha(c))
 			called(c);
 		else if(c == lquote)
@@ -228,9 +255,12 @@
 quoted()
 {
 	nesting :=0;
+	mark := instack;
 	while((c := getc()) != rquote || nesting > 0){
-		if(c < 0)
+		if(c < 0) {
+			instack = mark;
 			error("EOF in string");
+		}
 		if(c == rquote)
 			nesting--;
 		else if(c == lquote)
@@ -276,19 +306,9 @@
 	return c == ' ' || c == '\t' || c == '\n' || c == '\r';
 }
 
-isname(s: string): int
-{
-	if(s == nil || !isalpha(s[0]))
-		return 0;
-	for(i := 1; i < len s; i++)
-		if(!(isalpha(s[i]) || s[i]>='0' && s[i]<='9'))
-			return 0;
-	return 1;
-}
-
 isalpha(c: int): int
 {
-	return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '_' || c > 16rA0;
+	return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '_' || c > 16rA0 && c != lquote && c != rquote;
 }
 
 hash(name: string): int
@@ -301,6 +321,13 @@
 
 builtin(name: string, impl: ref fn(nil: array of string))
 {
+	if(prefix != "")
+		name = prefix+name;
+	ibuiltin(name, impl);
+}
+
+ibuiltin(name: string, impl: ref fn(nil: array of string))
+{
 	h := hash(name);
 	n := ref Name(name, nil, impl, 0, 0);
 	names[h] = n :: names[h];
@@ -418,6 +445,12 @@
 
 expand(def: ref Name, args: array of string)
 {
+	if(tracing){
+		sys->fprint(stderr, "expand %s [%s]", args[0], def.name);
+		for(i := 1; i < len args; i++)
+			sys->fprint(stderr, " %d: [%s]", i, args[i]);
+		sys->fprint(stderr, "\n");
+	}
 	if(def.impl != nil){
 		def.impl(args);
 		return;
@@ -474,7 +507,7 @@
 			if(n.impl == nil)
 				define(args[2], n.repl, n.asis);
 			else
-				builtin(args[2], n.impl);
+				ibuiltin(args[2], n.impl);
 		}else
 			define(args[2], "", 0);
 	}
@@ -524,12 +557,12 @@
 
 doifdef(args: array of string)
 {
-	if(len args < 2)
+	if(len args < 3)
 		return;
 	n := lookup(args[1]);
 	if(n != nil)
 		pushs(args[2]);
-	else if(len args > 2)
+	else if(len args > 3)
 		pushs(args[3]);
 }
 
@@ -642,7 +675,7 @@
 	for(i := 1; i < len args; i++)
 		s += " "+args[i];
 	if(s != nil)
-		sys->fprint(sys->fildes(2), "m4:%s\n", s);
+		sys->fprint(stderr, "m4:%s\n", s);
 }
 
 dolen(args: array of string)
--- a/appl/math/mersenne.b
+++ b/appl/math/mersenne.b
@@ -3,9 +3,9 @@
 include "sys.m";
 	sys : Sys;
 include "draw.m";
-include "keyring.m";
-	keyring: Keyring;
-	IPint: import keyring;
+include "ipints.m";
+	ipints: IPints;
+	IPint: import ipints;
 
 # Test primality of Mersenne numbers
 
@@ -17,7 +17,7 @@
 init(nil: ref Draw->Context, argv: list of string)
 {
 	sys = load Sys Sys->PATH;
-	keyring = load Keyring Keyring->PATH;
+	ipints = load IPints IPints->PATH;
 	p := 3;
 	if(tl argv != nil)
 		p = int hd tl argv;
--- a/appl/math/parts.b
+++ b/appl/math/parts.b
@@ -3,9 +3,9 @@
 include "sys.m";
 	sys : Sys;
 include "draw.m";
-include "keyring.m";
-	keyring: Keyring;
-	IPint: import keyring;
+include "ipints.m";
+	ipints: IPints;
+	IPint: import ipints;
 
 #
 # the number p(n) of partitions of n 
@@ -25,7 +25,7 @@
 init(nil: ref Draw->Context, argv: list of string)
 {
 	sys = load Sys Sys->PATH;
-	keyring = load Keyring Keyring->PATH;
+	ipints = load IPints IPints->PATH;
 	argv = tl argv;
 	while(argv != nil){
 		s := hd argv;
--- a/doc/port.ms
+++ b/doc/port.ms
@@ -189,6 +189,7 @@
 The source is held in directory
 .CW emu ,
 with a subdirectory for each hosted platform:
+.CW AIX ,
 .CW FreeBSD ,
 .CW Irix ,
 .CW Linux ,
@@ -246,6 +247,7 @@
 .PP
 There are working emu versions
 for
+AIX/power,
 FreeBSD/386,
 Irix/mips,
 Linux/386,
--- /dev/null
+++ b/emu/AIX/asm-power.s
@@ -1,0 +1,108 @@
+.set r0,0; .set SP,1; .set RTOC,2; .set r3,3; .set r4,4
+.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
+.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
+.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
+.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
+.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
+.set r30,30; .set r31,31
+.set fp0,0; .set fp1,1; .set fp2,2; .set fp3,3; .set fp4,4
+.set fp5,5; .set fp6,6; .set fp7,7; .set fp8,8; .set fp9,9
+.set fp10,10; .set fp11,11; .set fp12,12; .set fp13,13; .set fp14,14
+.set fp15,15; .set fp16,16; .set fp17,17; .set fp18,18; .set fp19,19
+.set fp20,20; .set fp21,21; .set fp22,22; .set fp23,23; .set fp24,24
+.set fp25,25; .set fp26,26; .set fp27,27; .set fp28,28; .set fp29,29
+.set fp30,30; .set fp31,31
+.set v0,0; .set v1,1; .set v2,2; .set v3,3; .set v4,4
+.set v5,5; .set v6,6; .set v7,7; .set v8,8; .set v9,9
+.set v10,10; .set v11,11; .set v12,12; .set v13,13; .set v14,14
+.set v15,15; .set v16,16; .set v17,17; .set v18,18; .set v19,19
+.set v20,20; .set v21,21; .set v22,22; .set v23,23; .set v24,24
+.set v25,25; .set v26,26; .set v27,27; .set v28,28; .set v29,29
+.set v30,30; .set v31,31
+.set LR,8; .set CTR,9; .set TID,17; .set DSISR,18; .set DAR,19; .set TO_RTCU,20
+
+.machine "ppc"
+
+	.align	2
+	.globl	.FPsave
+.FPsave:
+	stfd	fp14,0*8(r3)
+	stfd	fp15,1*8(r3)
+	stfd	fp16,2*8(r3)
+	stfd	fp17,3*8(r3)
+	stfd	fp18,4*8(r3)
+	stfd	fp19,5*8(r3)
+	stfd	fp20,6*8(r3)
+	stfd	fp21,7*8(r3)
+	stfd	fp22,8*8(r3)
+	stfd	fp23,9*8(r3)
+	stfd	fp24,10*8(r3)
+	stfd	fp25,11*8(r3)
+	stfd	fp26,12*8(r3)
+	stfd	fp27,13*8(r3)
+	stfd	fp28,14*8(r3)
+	stfd	fp29,15*8(r3)
+	stfd	fp30,16*8(r3)
+	stfd	fp31,17*8(r3)
+	blr
+
+	.align	2
+	.globl	.FPrestore
+.FPrestore:
+	lfd		fp14,0*8(r3)
+	lfd		fp15,1*8(r3)
+	lfd		fp16,2*8(r3)
+	lfd		fp17,3*8(r3)
+	lfd		fp18,4*8(r3)
+	lfd		fp19,5*8(r3)
+	lfd		fp20,6*8(r3)
+	lfd		fp21,7*8(r3)
+	lfd		fp22,8*8(r3)
+	lfd		fp23,9*8(r3)
+	lfd		fp24,10*8(r3)
+	lfd		fp25,11*8(r3)
+	lfd		fp26,12*8(r3)
+	lfd		fp27,13*8(r3)
+	lfd		fp28,14*8(r3)
+	lfd		fp29,15*8(r3)
+	lfd		fp30,16*8(r3)
+	lfd		fp31,17*8(r3)
+	blr
+
+	.align	2
+	.globl	._tas
+._tas:
+	sync
+	mr		r4, r3
+	addi		r5,0,0x1	
+_tas_1:
+	lwarx	r3, 0, r4
+	cmpwi	r3, 0
+	bne-	_tas_2
+	stwcx.	r5, 0, r4
+	bne-	_tas_1
+_tas_2:
+	sync
+	blr
+
+	.align	2
+	.globl	.executeonnewstack
+.executeonnewstack:
+	mr		SP,r3	# change stacks
+	stwu 	LR,-16(SP)	# save lr to aid the traceback
+	li		r0,0
+	stw 	r0,20(SP)
+	mr		r3,r5
+	mtctr 	r4
+	bctrl	# tramp(arg)
+	br
+
+	.align	2
+	.globl	.unlockandexit
+.unlockandexit:
+	li	r0,0x0
+	stw	r0,0(r3)	# unlock
+	li	r0,1		# sys exit; 234 is exit group
+	li	r3,0		# exit status
+	sc
+	br
--- /dev/null
+++ b/emu/AIX/cmd.c
@@ -1,0 +1,213 @@
+#include	<sys/types.h>
+#include	<signal.h>
+#include 	<pwd.h>
+#include	<sys/resource.h>
+#include	<sys/wait.h>
+#include	<fcntl.h>
+
+#include	"dat.h"
+#include	"fns.h"
+#include	"error.h"
+
+enum
+{
+	Debug = 0
+};
+
+/*
+ * os-specific devcmd support.
+ * this version should be reasonably portable across Unix systems.
+ */
+typedef struct Targ Targ;
+struct Targ
+{
+	int	fd[3];	/* fd[0] is standard input, fd[1] is standard output, fd[2] is standard error */
+	char**	args;
+	char*	dir;
+	int	pid;
+	int	wfd;	/* child writes errors that occur after the fork or on exec */
+	int	uid;
+	int	gid;
+};
+
+extern int gidnobody;
+extern int uidnobody;
+
+static int
+childproc(Targ *t)
+{
+	int i, nfd;
+
+	if(Debug)
+		print("devcmd: '%s'", t->args[0]);
+
+	nfd = getdtablesize();
+	for(i = 0; i < nfd; i++)
+		if(i != t->fd[0] && i != t->fd[1] && i != t->fd[2] && i != t->wfd)
+			close(i);
+
+	dup2(t->fd[0], 0);
+	dup2(t->fd[1], 1);
+	dup2(t->fd[2], 2);
+	close(t->fd[0]);
+	close(t->fd[1]);
+	close(t->fd[2]);
+
+	/* should have an auth file to do host-specific authorisation? */
+	if(t->gid != -1){
+		if(setgid(t->gid) < 0 && getegid() == 0){
+			fprint(t->wfd, "can't set gid %d: %s", t->gid, strerror(errno));
+			_exit(1);
+		}
+	}
+
+	if(t->uid != -1){
+		if(setuid(t->uid) < 0 && geteuid() == 0){
+			fprint(t->wfd, "can't set uid %d: %s", t->uid, strerror(errno));
+			_exit(1);
+		}
+	}
+
+	if(t->dir != nil && chdir(t->dir) < 0){
+		fprint(t->wfd, "can't chdir to %s: %s", t->dir, strerror(errno));
+		_exit(1);
+	}
+
+	signal(SIGPIPE, SIG_DFL);
+
+	execvp(t->args[0], t->args);
+	if(Debug)
+		print("execvp: %s\n",strerror(errno));
+	fprint(t->wfd, "exec failed: %s", strerror(errno));
+
+	_exit(1);
+}
+
+void*
+oscmd(char **args, int nice, char *dir, int *fd)
+{
+	Targ *t;
+	int r, fd0[2], fd1[2], fd2[2], wfd[2], n, pid;
+
+	t = mallocz(sizeof(*t), 1);
+	if(t == nil)
+		return nil;
+
+	fd0[0] = fd0[1] = -1;
+	fd1[0] = fd1[1] = -1;
+	fd2[0] = fd2[1] = -1;
+	wfd[0] = wfd[1] = -1;
+	if(pipe(fd0) < 0 || pipe(fd1) < 0 || pipe(fd2) < 0 || pipe(wfd) < 0)
+		goto Error;
+	if(fcntl(wfd[1], F_SETFD, FD_CLOEXEC) < 0)	/* close on exec to give end of file on success */
+		goto Error;
+
+	t->fd[0] = fd0[0];
+	t->fd[1] = fd1[1];
+	t->fd[2] = fd2[1];
+	t->wfd = wfd[1];
+	t->args = args;
+	t->dir = dir;
+	t->gid = up->env->gid;
+	if(t->gid == -1)
+		t->gid = gidnobody;
+	t->uid = up->env->uid;
+	if(t->uid == -1)
+		t->uid = uidnobody;
+
+	signal(SIGCHLD, SIG_DFL);
+	switch(pid = fork()) {
+	case -1:
+		goto Error;
+	case 0:
+		setpgid(0, getpid());
+		if(nice)
+			oslopri();
+		childproc(t);
+		_exit(1);
+	default:
+		t->pid = pid;
+		if(Debug)
+			print("cmd pid %d\n", t->pid);
+		break;
+	}
+
+	close(fd0[0]);
+	close(fd1[1]);
+	close(fd2[1]);
+	close(wfd[1]);
+
+	n = read(wfd[0], up->genbuf, sizeof(up->genbuf)-1);
+	close(wfd[0]);
+	if(n > 0){
+		close(fd0[1]);
+		close(fd1[0]);
+		close(fd2[0]);
+		free(t);
+		up->genbuf[n] = 0;
+		if(Debug)
+			print("oscmd: bad exec: %q\n", up->genbuf);
+		error(up->genbuf);
+		return nil;
+	}
+
+	fd[0] = fd0[1];
+	fd[1] = fd1[0];
+	fd[2] = fd2[0];
+	return t;
+
+Error:
+	r = errno;
+	if(Debug)
+		print("oscmd: %q\n",strerror(r));
+	close(fd0[0]);
+	close(fd0[1]);
+	close(fd1[0]);
+	close(fd1[1]);
+	close(fd2[0]);
+	close(fd2[1]);
+	close(wfd[0]);
+	close(wfd[1]);
+	error(strerror(r));
+	return nil;
+}
+
+int
+oscmdkill(void *a)
+{
+	Targ *t = a;
+
+	if(Debug)
+		print("kill: %d\n", t->pid);
+	return kill(-t->pid, SIGTERM);
+}
+
+int
+oscmdwait(void *a, char *buf, int n)
+{
+	Targ *t = a;
+	int s;
+
+	if(waitpid(t->pid, &s, 0) == -1){
+		if(Debug)
+			print("wait error: %d [in %d] %q\n", t->pid, getpid(), strerror(errno));
+		return -1;
+	}
+	if(WIFEXITED(s)){
+		if(WEXITSTATUS(s) == 0)
+			return snprint(buf, n, "%d 0 0 0 ''", t->pid);
+		return snprint(buf, n, "%d 0 0 0 'exit: %d'", t->pid, WEXITSTATUS(s));
+	}
+	if(WIFSIGNALED(s)){
+		if(WTERMSIG(s) == SIGTERM || WTERMSIG(s) == SIGKILL)
+			return snprint(buf, n, "%d 0 0 0 killed", t->pid);
+		return snprint(buf, n, "%d 0 0 0 'signal: %d'", t->pid, WTERMSIG(s));
+	}
+	return snprint(buf, n, "%d 0 0 0 'odd status: 0x%x'", t->pid, s);
+}
+
+void
+oscmdfree(void *a)
+{
+	free(a);
+}
--- /dev/null
+++ b/emu/AIX/deveia.c
@@ -1,0 +1,40 @@
+/*
+ * AIX serial port definitions
+ */
+
+static char *sysdev[] = {
+        "/dev/tty0",
+        "/dev/tty1",
+        "/dev/tty2",
+        "/dev/tty3",
+        "/dev/tty4",
+        "/dev/tty5",
+        "/dev/tty6",
+        "/dev/tty7",
+};
+
+#include <sys/ioctl.h>
+#include "deveia-posix.c"
+#include "deveia-bsd.c"
+
+
+static struct tcdef_t bps[] = {
+	{0,		B0},
+	{50,		B50},
+	{75,		B75},
+	{110,		B110},
+	{134,		B134},
+	{150,		B150},
+	{200,		B200},
+	{300,		B300},
+	{600,		B600},
+	{1200,	B1200},
+	{1800,	B1800},
+	{2400,	B2400},
+	{4800,	B4800},
+	{9600,	B9600},
+	{19200,	B19200},
+	{38400,	B38400},
+	{-1,		-1}
+};
+
--- /dev/null
+++ b/emu/AIX/devfs.c
@@ -1,0 +1,7 @@
+#include "devfs-posix.c"
+
+static vlong
+osdisksize(int fd)
+{
+	return 0;
+}
--- /dev/null
+++ b/emu/AIX/emu
@@ -1,0 +1,104 @@
+dev
+	root
+	cons
+	env
+	mnt
+	pipe
+	prog
+	prof
+	srv
+	dup
+	ssl
+	cap
+	fs
+	cmd	cmd
+	indir
+
+	draw	win-x11a
+	pointer
+	snarf
+
+	ip	ipif6-posix ipaux
+	eia
+	mem
+
+lib
+	interp
+	tk
+	freetype
+	math
+	draw
+
+	memlayer
+	memdraw
+	keyring
+	sec
+	mp
+
+	9
+
+link
+
+mod
+	sys
+	draw
+
+	tk
+	math
+	srv	srv
+	keyring
+	crypt
+	ipints
+	loader
+	freetype
+
+port
+	alloc
+	cache
+	chan
+	dev
+	devtab
+
+	dial
+	dis
+	discall
+	env
+	error
+	errstr
+	exception
+	exportfs
+	inferno
+	latin1
+	main
+	parse
+	pgrp
+	print
+	proc
+	qio
+	random
+	sysfile
+	uqid
+
+code
+
+init
+	emuinit
+
+root
+	/dev	/
+	/fd	/
+	/prog	/
+	/prof	/
+	/net	/
+	/net.alt	/
+	/chan	/
+	/nvfs	/
+	/env	/
+#	/dis
+#	/n
+#	/icons
+#	/osinit.dis
+#	/dis/emuinit.dis
+#	/dis/lib/auth.dis
+#	/dis/lib/ssl.dis
+#	/n/local /
--- /dev/null
+++ b/emu/AIX/emu-g
@@ -1,0 +1,100 @@
+env
+	X11LIBS=
+dev
+	root
+	cons
+	env
+	mnt
+	pipe
+	prog
+	prof
+	srv
+	dup
+	ssl
+	cap
+	fs
+	cmd	cmd
+	indir
+
+	ip	ipif6-posix ipaux
+	eia
+	mem
+
+lib
+	interp
+	math
+	keyring
+	sec
+	mp
+
+	9
+
+link
+
+mod
+	sys
+	math
+	srv	srv
+	keyring
+	crypt
+	ipints
+	loader
+
+port
+	alloc
+	cache
+	chan
+	dev
+	devtab
+
+	dial
+	dis
+	discall
+	env
+	error
+	errstr
+	exception
+	exportfs
+	inferno
+	latin1
+	main
+	parse
+	pgrp
+	print
+	proc
+	qio
+	random
+	sysfile
+	uqid
+
+code
+	void setpointer(int x, int y){USED(x); USED(y);}
+	ulong strtochan(char *s){USED(s); return ~0;}
+
+init
+	emuinit
+
+root
+	/dev	/
+	/fd	/
+	/prog	/
+	/prof	/
+	/net	/
+	/net.alt	/
+	/chan	/
+	/nvfs	/
+	/env	/
+#	/chan
+#	/dev
+#	/dis
+#	/env
+#	/n
+#	/net
+#	/nvfs /
+#	/prog
+#	/icons
+#	/osinit.dis
+#	/dis/emuinit.dis
+#	/dis/lib/auth.dis
+#	/dis/lib/ssl.dis
+#	/n/local /
--- /dev/null
+++ b/emu/AIX/mkfile
@@ -1,0 +1,52 @@
+SYSTARG=AIX
+<../../mkconfig
+SYSTARG=AIX
+
+#Configurable parameters
+
+CONF=emu			#default configuration
+CONFLIST=emu
+CLEANCONFLIST=
+
+INSTALLDIR=$ROOT/$SYSTARG/$OBJTYPE/bin	#path of directory where kernel is installed
+
+#end configurable parameters
+
+X11LIBS= -lX11 -lXext
+
+<$ROOT/mkfiles/mkfile-$SYSTARG-$OBJTYPE	#set vars based on target system
+
+<| $SHELLNAME ../port/mkdevlist $CONF	#sets $IP, $DEVS, $PORT, $LIBS
+<mkfile-$OBJTYPE
+
+OBJ=\
+	asm-$OBJTYPE.$O\
+	$ARCHFILES\
+	os.$O\
+	kproc-pthreads.$O\
+	segflush-$OBJTYPE.$O\
+	$CONF.root.$O\
+	lock.$O\
+	$DEVS\
+	$PORT\
+
+LIBNAMES=${LIBS:%=lib%.a}
+
+HFILES=\
+
+CFLAGS='-DROOT="'$ROOT'"' -DEMU -I. -I../port -I$ROOT/$SYSTARG/$OBJTYPE/include -I$ROOT/include -I$ROOT/libinterp $CTHREADFLAGS $CFLAGS $EMUOPTIONS
+SYSLIBS= $X11LIBS -lm -lpthread
+KERNDATE=`{$NDATE}
+
+default:V:	$O.$CONF
+
+$O.$CONF:	$OBJ $CONF.c $CONF.root.h $LIBNAMES
+	$CC $CFLAGS '-DKERNDATE='$KERNDATE $CONF.c
+	$LD $LDFLAGS -o $target $OBJ $CONF.$O $LIBFILES $SYSLIBS
+
+install:V: $O.$CONF
+	cp $O.$CONF $INSTALLDIR/$CONF
+
+<../port/portmkfile
+
+devfs.$O:	../port/devfs-posix.c
--- /dev/null
+++ b/emu/AIX/os.c
@@ -1,0 +1,300 @@
+#include	<sys/types.h>
+#include	<time.h>
+#include	<termios.h>
+#include	<signal.h>
+#include 	<pwd.h>
+#include	<sched.h>
+#include	<sys/resource.h>
+#include	<sys/wait.h>
+#include	<sys/time.h>
+
+#include	<stdint.h>
+
+#include	"dat.h"
+#include	"fns.h"
+#include	"error.h"
+
+#include <semaphore.h>
+
+#include	<raise.h>
+
+enum
+{
+	DELETE	= 0x7f,
+	CTRLC	= 'C'-'@',
+	NSTACKSPERALLOC = 16,
+	X11STACK=	256*1024
+};
+char *hosttype = "Linux";
+
+typedef sem_t	Sem;
+
+extern int dflag;
+
+int	gidnobody = -1;
+int	uidnobody = -1;
+static struct 	termios tinit;
+
+static void
+sysfault(char *what, void *addr)
+{
+	char buf[64];
+
+	snprint(buf, sizeof(buf), "sys: %s%#p", what, addr);
+	disfault(nil, buf);
+}
+
+static void
+trapILL(int signo, siginfo_t *si, void *a)
+{
+	USED(signo);
+	USED(a);
+	sysfault("illegal instruction pc=", si->si_addr);
+}
+
+static int
+isnilref(siginfo_t *si)
+{
+	return si != 0 && (si->si_addr == (void*)~(uintptr_t)0 || (uintptr_t)si->si_addr < 512);
+}
+
+static void
+trapmemref(int signo, siginfo_t *si, void *a)
+{
+	USED(a);	/* ucontext_t*, could fetch pc in machine-dependent way */
+	if(isnilref(si))
+		disfault(nil, exNilref);
+	else if(signo == SIGBUS)
+		sysfault("bad address addr=", si->si_addr);	/* eg, misaligned */
+	else
+		sysfault("segmentation violation addr=", si->si_addr);
+}
+
+static void
+trapFPE(int signo, siginfo_t *si, void *a)
+{
+	char buf[64];
+
+	USED(signo);
+	USED(a);
+	snprint(buf, sizeof(buf), "sys: fp: exception status=%.4lux pc=%#p", getfsr(), si->si_addr);
+	disfault(nil, buf);
+}
+
+static void
+trapUSR1(int signo)
+{
+	int intwait;
+
+	USED(signo);
+
+	intwait = up->intwait;
+	up->intwait = 0;	/* clear it to let proc continue in osleave */
+
+	if(up->type != Interp)		/* Used to unblock pending I/O */
+		return;
+
+	if(intwait == 0)		/* Not posted so it's a sync error */
+		disfault(nil, Eintr);	/* Should never happen */
+}
+
+void
+oslongjmp(void *regs, osjmpbuf env, int val)
+{
+	USED(regs);
+	siglongjmp(env, val);
+}
+
+static void
+termset(void)
+{
+	struct termios t;
+
+	tcgetattr(0, &t);
+	tinit = t;
+	t.c_lflag &= ~(ICANON|ECHO|ISIG);
+	t.c_cc[VMIN] = 1;
+	t.c_cc[VTIME] = 0;
+	tcsetattr(0, TCSANOW, &t);
+}
+
+static void
+termrestore(void)
+{
+	tcsetattr(0, TCSANOW, &tinit);
+}
+
+void
+cleanexit(int x)
+{
+	USED(x);
+
+	if(up->intwait) {
+		up->intwait = 0;
+		return;
+	}
+
+	if(dflag == 0)
+		termrestore();
+
+	kill(0, SIGKILL);
+	exit(0);
+}
+
+void
+osreboot(char *file, char **argv)
+{
+	if(dflag == 0)
+		termrestore();
+	execvp(file, argv);
+	error("reboot failure");
+}
+
+void
+libinit(char *imod)
+{
+	struct sigaction act;
+	struct passwd *pw;
+	Proc *p;
+	char sys[64];
+
+	setsid();
+
+	gethostname(sys, sizeof(sys));
+	kstrdup(&ossysname, sys);
+	pw = getpwnam("nobody");
+	if(pw != nil) {
+		uidnobody = pw->pw_uid;
+		gidnobody = pw->pw_gid;
+	}
+
+	if(dflag == 0)
+		termset();
+
+	memset(&act, 0, sizeof(act));
+	act.sa_handler = trapUSR1;
+	sigaction(SIGUSR1, &act, nil);
+
+	act.sa_handler = SIG_IGN;
+	sigaction(SIGCHLD, &act, nil);
+
+	/*
+	 * For the correct functioning of devcmd in the
+	 * face of exiting slaves
+	 */
+	signal(SIGPIPE, SIG_IGN);
+	if(signal(SIGTERM, SIG_IGN) != SIG_IGN)
+		signal(SIGTERM, cleanexit);
+	if(signal(SIGINT, SIG_IGN) != SIG_IGN)
+		signal(SIGINT, cleanexit);
+
+	if(sflag == 0) {
+		act.sa_flags = SA_SIGINFO;
+		act.sa_sigaction = trapILL;
+		sigaction(SIGILL, &act, nil);
+		act.sa_sigaction = trapFPE;
+		sigaction(SIGFPE, &act, nil);
+		act.sa_sigaction = trapmemref;
+		sigaction(SIGBUS, &act, nil);
+		sigaction(SIGSEGV, &act, nil);
+		act.sa_flags &= ~SA_SIGINFO;
+	}
+
+	p = newproc();
+	kprocinit(p);
+
+	pw = getpwuid(getuid());
+	if(pw != nil)
+		kstrdup(&eve, pw->pw_name);
+	else
+		print("cannot getpwuid\n");
+
+	p->env->uid = getuid();
+	p->env->gid = getgid();
+
+	emuinit(imod);
+}
+
+int
+readkbd(void)
+{
+	int n;
+	char buf[1];
+
+	n = read(0, buf, sizeof(buf));
+	if(n < 0)
+		print("keyboard close (n=%d, %s)\n", n, strerror(errno));
+	if(n <= 0)
+		pexit("keyboard thread", 0);
+
+	switch(buf[0]) {
+	case '\r':
+		buf[0] = '\n';
+		break;
+	case DELETE:
+		buf[0] = 'H' - '@';
+		break;
+	case CTRLC:
+		cleanexit(0);
+		break;
+	}
+	return buf[0];
+}
+
+/*
+ * Return an abitrary millisecond clock time
+ */
+long
+osmillisec(void)
+{
+	static long sec0 = 0, usec0;
+	struct timeval t;
+
+	if(gettimeofday(&t,(struct timezone*)0)<0)
+		return 0;
+
+	if(sec0 == 0) {
+		sec0 = t.tv_sec;
+		usec0 = t.tv_usec;
+	}
+	return (t.tv_sec-sec0)*1000+(t.tv_usec-usec0+500)/1000;
+}
+
+/*
+ * Return the time since the epoch in nanoseconds and microseconds
+ * The epoch is defined at 1 Jan 1970
+ */
+vlong
+osnsec(void)
+{
+	struct timeval t;
+
+	gettimeofday(&t, nil);
+	return (vlong)t.tv_sec*1000000000L + t.tv_usec*1000;
+}
+
+vlong
+osusectime(void)
+{
+	struct timeval t;
+ 
+	gettimeofday(&t, nil);
+	return (vlong)t.tv_sec * 1000000 + t.tv_usec;
+}
+
+int
+osmillisleep(ulong milsec)
+{
+	struct  timespec time;
+
+	time.tv_sec = milsec/1000;
+	time.tv_nsec= (milsec%1000)*1000000;
+	nanosleep(&time, NULL);
+	return 0;
+}
+
+int
+limbosleep(ulong milsec)
+{
+	return osmillisleep(milsec);
+}
--- /dev/null
+++ b/emu/AIX/segflush-power.c
@@ -1,0 +1,33 @@
+#include <sys/types.h>
+
+#include "dat.h"
+
+
+/*
+ * from geoff collyer's port
+ * invalidate instruction cache and write back data cache from a to a+n-1,
+ * at least.
+ */
+int
+segflush(void *a, ulong n)
+{
+    ulong *p;
+
+    // cache blocks are often eight words (32 bytes) long, sometimes 16 bytes.
+    // need to determine it dynamically?
+    for (p = (ulong *)((ulong)a & ~7UL); (char *)p < (char *)a + n; p++)
+        __asm__("dcbst	0,r0\n\t"	// not dcbf, which writes back, then invalidates
+            "icbi	0,r0\n\t"
+            : // no output
+            : "ar" (p)
+            );
+     __asm__("sync\n\t"
+            : // no output
+            :
+            );
+   __asm__("isync\n\t"
+            : // no output
+            :
+            );
+	return 0;
+}
--- /dev/null
+++ b/emu/Linux/emu-g.c
@@ -1,0 +1,80 @@
+#include "dat.h"
+#include "fns.h"
+#include "error.h"
+#include "interp.h"
+
+
+#include "emu-g.root.h"
+
+ulong ndevs = 25;
+
+extern Dev rootdevtab;
+extern Dev consdevtab;
+extern Dev envdevtab;
+extern Dev mntdevtab;
+extern Dev pipedevtab;
+extern Dev progdevtab;
+extern Dev profdevtab;
+extern Dev srvdevtab;
+extern Dev dupdevtab;
+extern Dev ssldevtab;
+extern Dev capdevtab;
+extern Dev fsdevtab;
+extern Dev cmddevtab;
+extern Dev indirdevtab;
+extern Dev ipdevtab;
+extern Dev eiadevtab;
+extern Dev memdevtab;
+Dev* devtab[]={
+	&rootdevtab,
+	&consdevtab,
+	&envdevtab,
+	&mntdevtab,
+	&pipedevtab,
+	&progdevtab,
+	&profdevtab,
+	&srvdevtab,
+	&dupdevtab,
+	&ssldevtab,
+	&capdevtab,
+	&fsdevtab,
+	&cmddevtab,
+	&indirdevtab,
+	&ipdevtab,
+	&eiadevtab,
+	&memdevtab,
+	nil,
+	nil,
+	nil,
+	nil,
+	nil,
+	nil,
+	nil,
+	nil,
+	nil,
+};
+
+void links(void){
+}
+
+extern void sysmodinit(void);
+extern void mathmodinit(void);
+extern void srvmodinit(void);
+extern void keyringmodinit(void);
+extern void cryptmodinit(void);
+extern void ipintsmodinit(void);
+extern void loadermodinit(void);
+void modinit(void){
+	sysmodinit();
+	mathmodinit();
+	srvmodinit();
+	keyringmodinit();
+	cryptmodinit();
+	ipintsmodinit();
+	loadermodinit();
+}
+
+	void setpointer(int x, int y){USED(x); USED(y);}
+	ulong strtochan(char *s){USED(s); return ~0;}
+char* conffile = "emu-g";
+ulong kerndate = KERNDATE;
binary files /dev/null b/emu/Linux/o.emu-g differ
--- /dev/null
+++ b/emu/NetBSD/asm-power.S
@@ -1,0 +1,91 @@
+#include <machine/asm.h>
+
+ENTRY_NOPROFILE(FPsave)
+	stfd	%f14,0*8(%r3)
+	stfd	%f15,1*8(%r3)
+	stfd	%f16,2*8(%r3)
+	stfd	%f17,3*8(%r3)
+	stfd	%f18,4*8(%r3)
+	stfd	%f19,5*8(%r3)
+	stfd	%f20,6*8(%r3)
+	stfd	%f21,7*8(%r3)
+	stfd	%f22,8*8(%r3)
+	stfd	%f23,9*8(%r3)
+	stfd	%f24,10*8(%r3)
+	stfd	%f25,11*8(%r3)
+	stfd	%f26,12*8(%r3)
+	stfd	%f27,13*8(%r3)
+	stfd	%f28,14*8(%r3)
+	stfd	%f29,15*8(%r3)
+	stfd	%f30,16*8(%r3)
+	stfd	%f31,17*8(%r3)
+	blr
+	END(FPsave)
+
+ENTRY_NOPROFILE(FPrestore)
+	lfd	%f14,0*8(%r3)
+	lfd	%f15,1*8(%r3)
+	lfd	%f16,2*8(%r3)
+	lfd	%f17,3*8(%r3)
+	lfd	%f18,4*8(%r3)
+	lfd	%f19,5*8(%r3)
+	lfd	%f20,6*8(%r3)
+	lfd	%f21,7*8(%r3)
+	lfd	%f22,8*8(%r3)
+	lfd	%f23,9*8(%r3)
+	lfd	%f24,10*8(%r3)
+	lfd	%f25,11*8(%r3)
+	lfd	%f26,12*8(%r3)
+	lfd	%f27,13*8(%r3)
+	lfd	%f28,14*8(%r3)
+	lfd	%f29,15*8(%r3)
+	lfd	%f30,16*8(%r3)
+	lfd	%f31,17*8(%r3)
+	blr
+	END(FPrestore)
+
+ENTRY_NOPROFILE(_tas)
+	sync
+	mr	%r4, %r3
+	addi	%r5,0,0x1	
+1:
+	lwarx	%r3, 0, %r4
+	cmpwi	%r3, 0
+	bne-	2f
+	stwcx.	%r5, 0, %r4
+	bne-	1b
+2:
+	sync
+	blr
+	END(_tas)
+
+/*
+ * void
+ * executeonnewstack(void *tos, void (*tramp)(void *arg), void *arg)
+ */
+ENTRY_NOPROFILE(executeonnewstack)
+	mr	%r1,%r3		/* change stacks */
+	stwu 	%lr,-16(%r1)	/* save lr to aid the traceback */
+	li	%r0,0
+	stw 	%r0,20(%r1)
+	mr	%r3,%r5
+	mtctr 	%r4
+	bctrl	/* tramp(arg) */
+	br
+	END(executeonnewstack)
+
+/*
+ * void unlockandexit(int *key)
+ *
+ * NB: the return status may be garbaged if the stack is reused
+ *	between the unlock and the system call, but this should
+ *	not matter since no task is waiting for the result
+ */
+ENTRY_NOPROFILE(unlockandexit)
+	li	%r0,0x0
+	stw	%r0,0(%r3)	/* unlock */
+	li	%r0,1		/* sys exit; 234 is exit group */
+	li	%r3,0		/* exit status */
+	sc
+	br
+	END(unlockandexit)
--- a/emu/NetBSD/emu
+++ b/emu/NetBSD/emu
@@ -81,6 +81,9 @@
 	uqid
 
 code
+	#ifdef __powerpc__
+	int macjit = 1; /* tell compiler it's not plan9 abi */
+	#endif
 
 init
 	emuinit
--- a/emu/NetBSD/emu-g
+++ b/emu/NetBSD/emu-g
@@ -70,6 +70,10 @@
 	uqid
 
 code
+	#ifdef __powerpc__
+	int macjit = 1; /* tell compiler it's not plan9 abi */
+	#endif
+
 	void setpointer(int x, int y){USED(x); USED(y);}
 	ulong strtochan(char *s){USED(s); return ~0;}
 
--- a/emu/NetBSD/os.c
+++ b/emu/NetBSD/os.c
@@ -527,11 +527,3 @@
 	*(Proc **)rv = p;
 	return rv;
 }
-
-int
-segflush(void *a, ulong n)
-{
-	USED(a);
-	USED(n);
-	return 0;
-}
--- /dev/null
+++ b/emu/NetBSD/segflush-386.c
@@ -1,0 +1,9 @@
+#include "dat.h"
+
+int
+segflush(void *a, ulong n)
+{
+	USED(a);
+	USED(n);
+	return 0;
+}
--- /dev/null
+++ b/emu/NetBSD/segflush-power.c
@@ -1,0 +1,12 @@
+#include <sys/types.h>
+#include <machine/cpu.h>
+
+#include "dat.h"
+
+
+int
+segflush(void *a, ulong n)
+{
+	__syncicache(a, n);
+	return 0;
+}
--- a/emu/OpenBSD/asm-386.S
+++ b/emu/OpenBSD/asm-386.S
@@ -3,8 +3,6 @@
 #include <sys/syscall.h>
 #include <machine/asm.h>
 
-#include "rfork_thread.S"
-
 /*
  * executeonnewstack(void *tos, void (*tramp)(void *arg), void *arg)
  */
--- a/emu/OpenBSD/os.c
+++ b/emu/OpenBSD/os.c
@@ -24,53 +24,9 @@
 };
 char *hosttype = "OpenBSD";
 
-int rfork_thread(int, void *, void (*)(void *), void *);
-
-extern void unlockandexit(int*);
-extern void executeonnewstack(void*, void (*f)(void*), void*);
-static void *stackalloc(Proc *p, void **tos);
-static void stackfreeandexit(void *stack);
-
 extern int dflag;
 
 void
-pexit(char *msg, int t)
-{
-	Osenv *e;
-	Proc *p;
-	void *kstack;
-
-	lock(&procs.l);
-	p = up;
-	if(p->prev)
-		p->prev->next = p->next;
-	else
-		procs.head = p->next;
-
-	if(up->next)
-		p->next->prev = p->prev;
-	else
-		procs.tail = p->prev;
-	unlock(&procs.l);
-
-	if(0)
-		print("pexit: %s: %s\n", up->text, msg);
-
-	e = up->env;
-	if(e != nil) {
-		closefgrp(e->fgrp);
-		closepgrp(e->pgrp);
-		closeegrp(e->egrp);
-		closesigs(e->sigs);
-	}
-	kstack = p->kstack;
-	free(p->prog);
-	free(p);
-	if(kstack != nil)
-		stackfreeandexit(kstack);
-}
-
-void
 trapBUS(int signo, siginfo_t *info, void *context)
 {
 	if(info)
@@ -77,7 +33,7 @@
 		print("trapBUS: signo: %d code: %d addr: %lx\n",
 		info->si_signo, info->si_code, info->si_addr);
 	else
-		print("trapBUS: no info\n"); 
+		print("trapBUS: no info\n");
 	disfault(nil, "Bus error");
 }
 
@@ -135,7 +91,7 @@
 
 	memset(&act, 0 , sizeof(act));
 	sigemptyset(&initmask);
-	
+
 	signal(SIGPIPE, SIG_IGN);	/* prevent signal when devcmd child exits */
 	if(signal(SIGTERM, SIG_IGN) != SIG_IGN)
 		signal(SIGTERM, cleanexit);
@@ -180,102 +136,7 @@
 		panic("sigprocmask");
 }
 
-static void
-tramp(void *arg)
-{
-	Proc *p;
-
-	p = arg;
-	p->pid = p->sigid = getpid();
-	sigprocmask(SIG_BLOCK, &initmask, nil);	/* in 5.3, rfork_thread doesn't copy from parent, contrary to docs? */
-	(*p->func)(p->arg);
-	pexit("{Tramp}", 0);
-	_exit(0);
-}
-
 void
-kproc(char *name, void (*func)(void*), void *arg, int flags)
-{
-	Proc *p;
-	Pgrp *pg;
-	Fgrp *fg;
-	Egrp *eg;
-	int pid;
-	void *tos;
-
-	p = newproc();
-
-	if(flags & KPDUPPG) {
-		pg = up->env->pgrp;
-		incref(&pg->r);
-		p->env->pgrp = pg;
-	}
-	if(flags & KPDUPFDG) {
-		fg = up->env->fgrp;
-		incref(&fg->r);
-		p->env->fgrp = fg;
-	}
-	if(flags & KPDUPENVG) {
-		eg = up->env->egrp;
-		incref(&eg->r);
-		p->env->egrp = eg;
-	}
-
-	p->env->uid = up->env->uid;
-	p->env->gid = up->env->gid;
-	kstrdup(&p->env->user, up->env->user);
-
-	strcpy(p->text, name);
-
-	p->func = func;
-	p->arg = arg;
-
-	lock(&procs.l);
-	if(procs.tail != nil) {
-		p->prev = procs.tail;
-		procs.tail->next = p;
-	}
-	else {
-		procs.head = p;
-		p->prev = nil;
-	}
-	procs.tail = p;
-	unlock(&procs.l);
-
-	if(flags & KPX11){
-		p->kstack = nil;	/* never freed; also up not defined */
-		tos = (char*)mallocz(X11STACK, 0) + X11STACK - sizeof(void*);
-	}else
-		p->kstack = stackalloc(p, &tos);
-	pid = rfork_thread(RFPROC|RFMEM|RFNOWAIT, tos, tramp, p);
-	if(pid < 0)
-		panic("rfork");
-}
-
-void
-oshostintr(Proc *p)
-{
-	kill(p->sigid, SIGUSR1);
-}
-
-void
-osblock(void)
-{
-	sigset_t mask;
-
-	sigprocmask(SIG_SETMASK, NULL, &mask);
-	sigdelset(&mask, SIGUSR2);
-	sigsuspend(&mask);
-}
-
-void
-osready(Proc *p)
-{
-	if(kill(p->sigid, SIGUSR2) < 0)
-		fprint(2, "emu: osready failed: pid %d: %s\n", p->sigid, strerror(errno));
-}
-
-void
 oslongjmp(void *regs, osjmpbuf env, int val)
 {
 	USED(regs);
@@ -335,7 +196,7 @@
 getnobody()
 {
 	struct passwd *pwd;
-	
+
 	if(pwd = getpwnam("nobody")) {
 		uidnobody = pwd->pw_uid;
 		gidnobody = pwd->pw_gid;
@@ -347,7 +208,6 @@
 {
 	struct passwd *pw;
 	Proc *p;
-	void *tos;
 	char sys[64];
 
 	setsid();
@@ -362,7 +222,7 @@
 	setsigs();
 
 	p = newproc();
-	p->kstack = stackalloc(p, &tos);
+	kprocinit(p);
 
 	pw = getpwuid(getuid());
 	if(pw != nil)
@@ -369,11 +229,11 @@
 		kstrdup(&eve, pw->pw_name);
 	else
 		print("cannot getpwuid\n");
- 
+
 	p->env->uid = getuid();
 	p->env->gid = getgid();
 
-	executeonnewstack(tos, emuinit, imod);
+	emuinit(imod);
 }
 
 int
@@ -440,7 +300,7 @@
 osusectime(void)
 {
 	struct timeval t;
- 
+
 	gettimeofday(&t, nil);
 	return (vlong)t.tv_sec * 1000000 + t.tv_usec;
 }
@@ -454,76 +314,6 @@
 	time.tv_nsec = (milsec % 1000) * 1000000;
 	nanosleep(&time, 0);
 	return 0;
-}
-
-void
-osyield(void)
-{
-	sched_yield();
-}
-
-void
-ospause(void)
-{
-	for(;;)
-		pause();
-}
-
-void
-oslopri(void)
-{
-	setpriority(PRIO_PROCESS, 0, getpriority(PRIO_PROCESS,0)+4);
-}
-
-static struct {
-	Lock l;
-	void *free;
-} stacklist;
-
-static void
-_stackfree(void *stack)
-{
-	*((void **)stack) = stacklist.free;
-	stacklist.free = stack;
-}
-
-static void
-stackfreeandexit(void *stack)
-{
-	lock(&stacklist.l);
-	_stackfree(stack);
-	unlockandexit(&stacklist.l.val);
-}
-
-static void *
-stackalloc(Proc *p, void **tos)
-{
-	void *rv;
-	lock(&stacklist.l);
-	if (stacklist.free == 0) {
-		int x;
-		/*
-		 * obtain some more by using sbrk()
-		 */
-		void *more = sbrk(KSTACK * (NSTACKSPERALLOC + 1));
-		if (more == 0)
-			panic("stackalloc: no more stacks");
-		/*
-		 * align to KSTACK
-		 */
-		more = (void *)((((unsigned long)more) + (KSTACK - 1)) & ~(KSTACK - 1));
-		/*
-		 * free all the new stacks onto the freelist
-		 */
-		for (x = 0; x < NSTACKSPERALLOC; x++)
-			_stackfree((char *)more + KSTACK * x);
-	}
-	rv = stacklist.free;
-	stacklist.free = *(void **)rv;
-	unlock(&stacklist.l);
-	*tos = rv + KSTACK - sizeof(void*);
-	*(Proc **)rv = p;
-	return rv;
 }
 
 int
--- a/emu/port/devfs-posix.c
+++ b/emu/port/devfs-posix.c
@@ -9,7 +9,7 @@
 
 #include	<sys/types.h>
 #include	<sys/stat.h>
-#include	<sys/fcntl.h>
+#include	<fcntl.h>
 #include	<sys/socket.h>
 #include	<sys/un.h>
 #include	<utime.h>
--- a/emu/port/win-x11a.c
+++ b/emu/port/win-x11a.c
@@ -304,7 +304,7 @@
 		lp = dp + width;
 		while(dp < lp){
 			v = *dp++;
-			w = infernortox11[(v>>16)&0xff]<<16|infernogtox11[(v>>8)&0xff]<<8|infernobtox11[(v>>0)&0xff]<<0;
+			w = v&(0xff<<24)|infernortox11[(v>>16)&0xff]<<16|infernogtox11[(v>>8)&0xff]<<8|infernobtox11[(v>>0)&0xff]<<0;
 			*wp++ = w;
 		}
 		dp += dx;
@@ -313,6 +313,33 @@
 }
 
 static void
+copy16to16(Rectangle r)
+{
+	int dx, width;
+	u16int *dp, *wp, *edp, *lp;
+
+	width = Dx(r);
+	dx = Xsize - width;
+	dp = (u16int*)(gscreendata + ((r.min.y * Xsize) + r.min.x) * 2);
+	wp = (u16int*)(xscreendata + ((r.min.y * Xsize) + r.min.x) * 2);
+	edp = (u16int*)(gscreendata + ((r.max.y * Xsize) + r.max.x) * 2);
+
+	/* The pixel format should be the same as the underlying X display (see
+	   the xtruevisual function) unless a different channel format is
+	   explicitly specified on the command line, so just copy the pixel data
+	   without any processing. */
+
+	while(dp < edp) {
+		lp = dp + width;
+		while(dp < lp){
+			*wp++ = *dp++;
+		}
+		dp += dx;
+		wp += dx;
+	}
+}
+
+static void
 copy8to32(Rectangle r)
 {
 	int dx, width;
@@ -435,6 +462,17 @@
 	case 32:
 		copy32to32(r);
 		break;
+    case 16:
+        switch(xscreendepth){
+        case 16:
+            copy16to16(r);
+            break;
+        default:
+		    fprint(2, "emu: bad display depth %d chan %s xscreendepth %d\n", displaydepth,
+			    chantostr(chanbuf, displaychan), xscreendepth);
+		    cleanexit(0);
+        }
+        break;
 	case 8:
 		switch(xscreendepth){
 		case 24:
--- /dev/null
+++ b/fonts/vga/unicode.font
@@ -1,0 +1,252 @@
+16 12
+0x0000	0x007f	vga.0000-007F
+0x00a0	0x021f	vga.00A0-021F
+0x0222	0x0233	vga.0222-0233
+0x0250	0x02ad	vga.0250-02AD
+0x02b0	0x02cf	vga.02B0-02CF
+0x02d8	0x02dd	vga.02D8-02DD
+0x02ee	0x02ee	vga.02EE-02EE
+0x0300	0x0301	vga.0300-0301
+0x0303	0x0303	vga.0303-0303
+0x0309	0x0309	vga.0309-0309
+0x0312	0x0314	vga.0312-0314
+0x0323	0x0323	vga.0323-0323
+0x0340	0x0341	vga.0340-0341
+0x0374	0x0375	vga.0374-0375
+0x037a	0x037a	vga.037A-037A
+0x037e	0x037e	vga.037E-037E
+0x0384	0x038a	vga.0384-038A
+0x038c	0x038c	vga.038C-038C
+0x038e	0x03a1	vga.038E-03A1
+0x03a3	0x03ce	vga.03A3-03CE
+0x03d0	0x03d7	vga.03D0-03D7
+0x03da	0x03f3	vga.03DA-03F3
+0x0400	0x0486	vga.0400-0486
+0x0488	0x04ce	vga.0488-04CE
+0x04d0	0x04f5	vga.04D0-04F5
+0x04f8	0x04f9	vga.04F8-04F9
+0x0500	0x050f	vga.0500-050F
+0x0530	0x0556	vga.0530-0556
+0x0559	0x055f	vga.0559-055F
+0x0561	0x0587	vga.0561-0587
+0x0589	0x058a	vga.0589-058A
+0x0591	0x05a1	vga.0591-05A1
+0x05a3	0x05b9	vga.05A3-05B9
+0x05bb	0x05c4	vga.05BB-05C4
+0x05d0	0x05ea	vga.05D0-05EA
+0x05f0	0x05f4	vga.05F0-05F4
+0x060c	0x060c	vga.060C-060C
+0x061b	0x061b	vga.061B-061B
+0x061f	0x061f	vga.061F-061F
+0x0621	0x063a	vga.0621-063A
+0x0640	0x0655	vga.0640-0655
+0x0660	0x066d	vga.0660-066D
+0x0670	0x06ed	vga.0670-06ED
+0x06f0	0x06fe	vga.06F0-06FE
+0x10d3	0x10d3	vga.10D3-10D3
+0x10d7	0x10d7	vga.10D7-10D7
+0x10da	0x10da	vga.10DA-10DA
+0x10dd	0x10dd	vga.10DD-10DD
+0x10e6	0x10e6	vga.10E6-10E6
+0x1e00	0x1e9b	vga.1E00-1E9B
+0x1ea0	0x1ef9	vga.1EA0-1EF9
+0x1f00	0x1f07	vga.1F00-1F07
+0x2000	0x2027	vga.2000-2027
+0x2030	0x2046	vga.2030-2046
+0x2048	0x204d	vga.2048-204D
+0x2070	0x2070	vga.2070-2070
+0x2074	0x208f	vga.2074-208F
+0x20a0	0x20af	vga.20A0-20AF
+0x2100	0x213a	vga.2100-213A
+0x2153	0x2183	vga.2153-2183
+0x2190	0x21f3	vga.2190-21F3
+0x2200	0x22f1	vga.2200-22F1
+0x2300	0x2300	vga.2300-2300
+0x2302	0x2302	vga.2302-2302
+0x2308	0x230b	vga.2308-230B
+0x2310	0x2310	vga.2310-2310
+0x2318	0x2318	vga.2318-2318
+0x231a	0x231b	vga.231A-231B
+0x2320	0x2321	vga.2320-2321
+0x2329	0x232a	vga.2329-232A
+0x239b	0x23bd	vga.239B-23BD
+0x23ce	0x23ce	vga.23CE-23CE
+0x2409	0x240d	vga.2409-240D
+0x2423	0x2424	vga.2423-2424
+0x2426	0x2426	vga.2426-2426
+0x2500	0x2595	vga.2500-2595
+0x25a0	0x25f7	vga.25A0-25F7
+0x2600	0x2602	vga.2600-2602
+0x2605	0x260d	vga.2605-260D
+0x2610	0x2613	vga.2610-2613
+0x2620	0x2620	vga.2620-2620
+0x2622	0x2622	vga.2622-2622
+0x2626	0x2626	vga.2626-2626
+0x2628	0x262b	vga.2628-262B
+0x262e	0x2637	vga.262E-2637
+0x2639	0x2653	vga.2639-2653
+0x2660	0x2667	vga.2660-2667
+0x2669	0x266f	vga.2669-266F
+0xfb00	0xfb05	vga.FB00-FB05
+0xfb50	0xfbb1	vga.FB50-FBB1
+0xfbd3	0xfbe9	vga.FBD3-FBE9
+0xfbfc	0xfbff	vga.FBFC-FBFF
+0xfc5b	0xfc63	vga.FC5B-FC63
+0xfc90	0xfc90	vga.FC90-FC90
+0xfcf2	0xfcf4	vga.FCF2-FCF4
+0xfd3c	0xfd3f	vga.FD3C-FD3F
+0xfdf2	0xfdf2	vga.FDF2-FDF2
+0xfe50	0xfe52	vga.FE50-FE52
+0xfe54	0xfe66	vga.FE54-FE66
+0xfe68	0xfe6b	vga.FE68-FE6B
+0xfe70	0xfe72	vga.FE70-FE72
+0xfe74	0xfe74	vga.FE74-FE74
+0xfe76	0xfefc	vga.FE76-FEFC
+0xfeff	0xfeff	vga.FEFF-FEFF
+0xfffd	0xfffd	vga.FFFD-FFFD
+0xfff9	0xffff	../dejavu/dejavu.12.fff9
+0xfb00	0xfc00	../dejavu/dejavu.12.fb00
+0xf6c5	0xf7c5	../dejavu/dejavu.12.f6c5
+0xf400	0xf500	../dejavu/dejavu.12.f400
+0xa746	0xa846	../dejavu/dejavu.12.a746
+0xa644	0xa744	../dejavu/dejavu.12.a644
+0x2e18	0x2f18	../dejavu/dejavu.12.2e18
+0x2c60	0x2d60	../dejavu/dejavu.12.2c60
+0x2b00	0x2c00	../dejavu/dejavu.12.2b00
+0x29eb	0x2aeb	../dejavu/dejavu.12.29eb
+0x28a2	0x29a2	../dejavu/dejavu.12.28a2
+0x27a1	0x28a1	../dejavu/dejavu.12.27a1
+0x2638	0x2738	../dejavu/dejavu.12.2638
+0x2524	0x2624	../dejavu/dejavu.12.2524
+0x2423	0x2523	../dejavu/dejavu.12.2423
+0x2310	0x2410	../dejavu/dejavu.12.2310
+0x220b	0x230b	../dejavu/dejavu.12.220b
+0x2109	0x2209	../dejavu/dejavu.12.2109
+0x2003	0x2103	../dejavu/dejavu.12.2003
+0x1f02	0x2002	../dejavu/dejavu.12.1f02
+0x1e01	0x1f01	../dejavu/dejavu.12.1e01
+0x1d00	0x1e00	../dejavu/dejavu.12.1d00
+0x10a0	0x11a0	../dejavu/dejavu.12.10a0
+0x0510	0x0610	../dejavu/dejavu.12.0510
+0x0404	0x0504	../dejavu/dejavu.12.0404
+0x0303	0x0403	../dejavu/dejavu.12.0303
+0x0202	0x0302	../dejavu/dejavu.12.0202
+0x0000	0x0100	../dejavu/dejavu.12.0000
+0xfe00	0xfeff	../dejavusans/dejavusans.12.fe00
+0xf001	0xf101	../dejavusans/dejavusans.12.f001
+0xef00	0xf000	../dejavusans/dejavusans.12.ef00
+0x4dc0	0x4dff	../dejavusans/dejavusans.12.4dc0
+0x2d61	0x2e61	../dejavusans/dejavusans.12.2d61
+0x2a7d	0x2b7d	../dejavusans/dejavusans.12.2a7d
+0x2940	0x2a40	../dejavusans/dejavusans.12.2940
+0x2713	0x2813	../dejavusans/dejavusans.12.2713
+0x2612	0x2712	../dejavusans/dejavusans.12.2612
+0x2422	0x2522	../dejavusans/dejavusans.12.2422
+0x22f8	0x23f8	../dejavusans/dejavusans.12.22f8
+0x21fc	0x22f7	../dejavusans/dejavusans.12.21fc
+0x1502	0x15ff	../dejavusans/dejavusans.12.1502
+0x1401	0x1501	../dejavusans/dejavusans.12.1401
+0x0f00	0x0f3f	../dejavusans/dejavusans.12.0e3f
+0x07c0	0x08c0	../dejavusans/dejavusans.12.07c0
+0x0606	0x0706	../dejavusans/dejavusans.12.0606
+0x3000	0x30fe	../shinonome/k12.3000
+0x4e00	0x4ffe	../shinonome/k12.4e00
+0x5005	0x51fe	../shinonome/k12.5005
+0x5200	0x53fa	../shinonome/k12.5200
+0x5401	0x55fe	../shinonome/k12.5401
+0x5606	0x57fc	../shinonome/k12.5606
+0x5800	0x59ff	../shinonome/k12.5800
+0x5a01	0x5bff	../shinonome/k12.5a01
+0x5c01	0x5dfe	../shinonome/k12.5c01
+0x5e02	0x5fff	../shinonome/k12.5e02
+0x600e	0x61ff	../shinonome/k12.600e
+0x6200	0x63fa	../shinonome/k12.6200
+0x6406	0x65fb	../shinonome/k12.6406
+0x6602	0x67ff	../shinonome/k12.6602
+0x6802	0x69ff	../shinonome/k12.6802
+0x6a02	0x6bf3	../shinonome/k12.6a02
+0x6c08	0x6dfb	../shinonome/k12.6c08
+0x6e05	0x6ffe	../shinonome/k12.6e05
+0x7001	0x71ff	../shinonome/k12.7001
+0x7206	0x73fe	../shinonome/k12.7206
+0x7403	0x75ff	../shinonome/k12.7403
+0x7601	0x77fc	../shinonome/k12.7601
+0x7802	0x79fb	../shinonome/k12.7802
+0x7a00	0x7bf7	../shinonome/k12.7a00
+0x7c00	0x7dfb	../shinonome/k12.7c00
+0x7e01	0x7ffc	../shinonome/k12.7e01
+0x8000	0x81fe	../shinonome/k12.8000
+0x8201	0x83fd	../shinonome/k12.8201
+0x8403	0x85fe	../shinonome/k12.8403
+0x8602	0x87fe	../shinonome/k12.8602
+0x8805	0x89f8	../shinonome/k12.8805
+0x8a00	0x8b9a	../shinonome/k12.8a00
+0x8c37	0x8dff	../shinonome/k12.8c37
+0x8e08	0x8ffd	../shinonome/k12.8e08
+0x9000	0x91ff	../shinonome/k12.9000
+0x920d	0x93e8	../shinonome/k12.920d
+0x9403	0x95e5	../shinonome/k12.9403
+0x961c	0x97ff	../shinonome/k12.961c
+0x9801	0x99ff	../shinonome/k12.9801
+0x9a01	0x9bf5	../shinonome/k12.9a01
+0x9c04	0x9dfd	../shinonome/k12.9c04
+0x9e1a	0x9fa0	../shinonome/k12.9e1a
+0x0e00	0x0eff	../fixed/7x14.0E00
+0x1600	0x16ff	../fixed/7x14.1600
+0x2400	0x24ff	../fixed/7x14.2400
+0xff00	0xffff	../fixed/7x14.FF00
+0x1000	0x10ff	../fixed/9x15.1000
+0x1200	0x12ff	../fixed/9x15.1200
+0x1300	0x13ff	../fixed/9x15.1300
+0xe000	0xe0ff	../fixed/9x15.E000
+0xe700	0xe7ff	../fixed/9x15.E700
+0x1400	0x14ff	../fixed/9x18.1400
+0xfc00	0xfcff	../fixed/10x20.FC00
+0xfd00	0xfdff	../fixed/10x20.FD00
+0x4e00	0x4fff	../jis/jis4e00.24
+0x5000	0x51ff	../jis/jis5000.24
+0x5200	0x53ff	../jis/jis5200.24
+0x5400	0x55ff	../jis/jis5400.24
+0x5600	0x57ff	../jis/jis5600.24
+0x5a00	0x5bff	../jis/jis5a00.24
+0x5c00	0x5dff	../jis/jis5c00.24
+0x5e00	0x5fff	../jis/jis5e00.24
+0x6000	0x61ff	../jis/jis6000.24
+0x6200	0x63ff	../jis/jis6200.24
+0x6400	0x65ff	../jis/jis6400.24
+0x6600	0x67ff	../jis/jis6600.24
+0x6800	0x69ff	../jis/jis6800.24
+0x6a00	0x6bff	../jis/jis6a00.24
+0x6c00	0x6dff	../jis/jis6c00.24
+0x6e00	0x6fff	../jis/jis6e00.24
+0x7000	0x71ff	../jis/jis7000.24
+0x7200	0x73ff	../jis/jis7200.24
+0x7400	0x75ff	../jis/jis7400.24
+0x7600	0x77ff	../jis/jis7600.24
+0x7800	0x79ff	../jis/jis7800.24
+0x7a00	0x7bff	../jis/jis7a00.24
+0x7c00	0x7dff	../jis/jis7c00.24
+0x7e00	0x7fff	../jis/jis7e00.24
+0x8000	0x81ff	../jis/jis8000.24
+0x8200	0x83ff	../jis/jis8200.24
+0x8400	0x85ff	../jis/jis8400.24
+0x8600	0x87ff	../jis/jis8600.24
+0x8800	0x89ff	../jis/jis8800.24
+0x8a00	0x8bff	../jis/jis8a00.24
+0x8c00	0x8dff	../jis/jis8c00.24
+0x8e00	0x8fff	../jis/jis8e00.24
+0x9200	0x93ff	../jis/jis9200.24
+0x9400	0x95ff	../jis/jis9400.24
+0x9600	0x97ff	../jis/jis9600.24
+0x9800	0x99ff	../jis/jis9800.24
+0x9a00	0x9bff	../jis/jis9a00.24
+0x9c00	0x9dff	../jis/jis9c00.24
+0x9e00	0x9fff	../jis/jis9e00.24
+0x1100	0x11ff	../fixed/6x13.1100
+0x4d00	0x4dff	../fixed/10x20.4D00
+0xf6c4	0xf7c4	../dejavubi/dejavubi.12.f6c4
+0xf5c5	0xf6c5	../dejavusansbi/dejavusansbi.12.f5c5
+0x1700	0x1746	../dejavusansit/dejavusansit.12.1646
+0xf101	0xf201	../germgoth/germgoth.14.f101
+0x3000	0x30ff	../fixed/10x20.3000
+0x2010	0x21d4	../shinonome/k14.2010
binary files /dev/null b/fonts/vga/vga.0000-0000 differ
binary files /dev/null b/fonts/vga/vga.0000-007F differ
binary files /dev/null b/fonts/vga/vga.0020-007F differ
binary files /dev/null b/fonts/vga/vga.00A0-021F differ
binary files /dev/null b/fonts/vga/vga.0222-0233 differ
binary files /dev/null b/fonts/vga/vga.0250-02AD differ
binary files /dev/null b/fonts/vga/vga.02B0-02CF differ
binary files /dev/null b/fonts/vga/vga.02D8-02DD differ
binary files /dev/null b/fonts/vga/vga.02EE-02EE differ
binary files /dev/null b/fonts/vga/vga.0300-0301 differ
binary files /dev/null b/fonts/vga/vga.0303-0303 differ
binary files /dev/null b/fonts/vga/vga.0309-0309 differ
binary files /dev/null b/fonts/vga/vga.0312-0314 differ
binary files /dev/null b/fonts/vga/vga.0323-0323 differ
binary files /dev/null b/fonts/vga/vga.0340-0341 differ
binary files /dev/null b/fonts/vga/vga.0374-0375 differ
binary files /dev/null b/fonts/vga/vga.037A-037A differ
binary files /dev/null b/fonts/vga/vga.037E-037E differ
binary files /dev/null b/fonts/vga/vga.0384-038A differ
binary files /dev/null b/fonts/vga/vga.038C-038C differ
binary files /dev/null b/fonts/vga/vga.038E-03A1 differ
binary files /dev/null b/fonts/vga/vga.03A3-03CE differ
binary files /dev/null b/fonts/vga/vga.03D0-03D7 differ
binary files /dev/null b/fonts/vga/vga.03DA-03F3 differ
binary files /dev/null b/fonts/vga/vga.0400-0486 differ
binary files /dev/null b/fonts/vga/vga.0488-04CE differ
binary files /dev/null b/fonts/vga/vga.04D0-04F5 differ
binary files /dev/null b/fonts/vga/vga.04F8-04F9 differ
binary files /dev/null b/fonts/vga/vga.0500-050F differ
binary files /dev/null b/fonts/vga/vga.0530-0556 differ
binary files /dev/null b/fonts/vga/vga.0559-055F differ
binary files /dev/null b/fonts/vga/vga.0561-0587 differ
binary files /dev/null b/fonts/vga/vga.0589-058A differ
binary files /dev/null b/fonts/vga/vga.0591-05A1 differ
binary files /dev/null b/fonts/vga/vga.05A3-05B9 differ
binary files /dev/null b/fonts/vga/vga.05BB-05C4 differ
binary files /dev/null b/fonts/vga/vga.05D0-05EA differ
binary files /dev/null b/fonts/vga/vga.05F0-05F4 differ
binary files /dev/null b/fonts/vga/vga.060C-060C differ
binary files /dev/null b/fonts/vga/vga.061B-061B differ
binary files /dev/null b/fonts/vga/vga.061F-061F differ
binary files /dev/null b/fonts/vga/vga.0621-063A differ
binary files /dev/null b/fonts/vga/vga.0640-0655 differ
binary files /dev/null b/fonts/vga/vga.0660-066D differ
binary files /dev/null b/fonts/vga/vga.0670-06ED differ
binary files /dev/null b/fonts/vga/vga.06F0-06FE differ
binary files /dev/null b/fonts/vga/vga.10D3-10D3 differ
binary files /dev/null b/fonts/vga/vga.10D7-10D7 differ
binary files /dev/null b/fonts/vga/vga.10DA-10DA differ
binary files /dev/null b/fonts/vga/vga.10DD-10DD differ
binary files /dev/null b/fonts/vga/vga.10E6-10E6 differ
binary files /dev/null b/fonts/vga/vga.1E00-1E9B differ
binary files /dev/null b/fonts/vga/vga.1EA0-1EF9 differ
binary files /dev/null b/fonts/vga/vga.1F00-1F07 differ
binary files /dev/null b/fonts/vga/vga.2000-2027 differ
binary files /dev/null b/fonts/vga/vga.2030-2046 differ
binary files /dev/null b/fonts/vga/vga.2048-204D differ
binary files /dev/null b/fonts/vga/vga.2070-2070 differ
binary files /dev/null b/fonts/vga/vga.2074-208F differ
binary files /dev/null b/fonts/vga/vga.20A0-20AF differ
binary files /dev/null b/fonts/vga/vga.2100-213A differ
binary files /dev/null b/fonts/vga/vga.2153-2183 differ
binary files /dev/null b/fonts/vga/vga.2190-21F3 differ
binary files /dev/null b/fonts/vga/vga.2200-22F1 differ
binary files /dev/null b/fonts/vga/vga.2300-2300 differ
binary files /dev/null b/fonts/vga/vga.2302-2302 differ
binary files /dev/null b/fonts/vga/vga.2308-230B differ
binary files /dev/null b/fonts/vga/vga.2310-2310 differ
binary files /dev/null b/fonts/vga/vga.2318-2318 differ
binary files /dev/null b/fonts/vga/vga.231A-231B differ
binary files /dev/null b/fonts/vga/vga.2320-2321 differ
binary files /dev/null b/fonts/vga/vga.2329-232A differ
binary files /dev/null b/fonts/vga/vga.239B-23BD differ
binary files /dev/null b/fonts/vga/vga.23CE-23CE differ
binary files /dev/null b/fonts/vga/vga.2409-240D differ
binary files /dev/null b/fonts/vga/vga.2423-2424 differ
binary files /dev/null b/fonts/vga/vga.2426-2426 differ
binary files /dev/null b/fonts/vga/vga.2500-2595 differ
binary files /dev/null b/fonts/vga/vga.25A0-25F7 differ
binary files /dev/null b/fonts/vga/vga.2600-2602 differ
binary files /dev/null b/fonts/vga/vga.2605-260D differ
binary files /dev/null b/fonts/vga/vga.2610-2613 differ
binary files /dev/null b/fonts/vga/vga.2620-2620 differ
binary files /dev/null b/fonts/vga/vga.2622-2622 differ
binary files /dev/null b/fonts/vga/vga.2626-2626 differ
binary files /dev/null b/fonts/vga/vga.2628-262B differ
binary files /dev/null b/fonts/vga/vga.262E-2637 differ
binary files /dev/null b/fonts/vga/vga.2639-2653 differ
binary files /dev/null b/fonts/vga/vga.2660-2667 differ
binary files /dev/null b/fonts/vga/vga.2669-266F differ
binary files /dev/null b/fonts/vga/vga.FB00-FB05 differ
binary files /dev/null b/fonts/vga/vga.FB50-FBB1 differ
binary files /dev/null b/fonts/vga/vga.FBD3-FBE9 differ
binary files /dev/null b/fonts/vga/vga.FBFC-FBFF differ
binary files /dev/null b/fonts/vga/vga.FC5B-FC63 differ
binary files /dev/null b/fonts/vga/vga.FC90-FC90 differ
binary files /dev/null b/fonts/vga/vga.FCF2-FCF4 differ
binary files /dev/null b/fonts/vga/vga.FD3C-FD3F differ
binary files /dev/null b/fonts/vga/vga.FDF2-FDF2 differ
binary files /dev/null b/fonts/vga/vga.FE50-FE52 differ
binary files /dev/null b/fonts/vga/vga.FE54-FE66 differ
binary files /dev/null b/fonts/vga/vga.FE68-FE6B differ
binary files /dev/null b/fonts/vga/vga.FE70-FE72 differ
binary files /dev/null b/fonts/vga/vga.FE74-FE74 differ
binary files /dev/null b/fonts/vga/vga.FE76-FEFC differ
binary files /dev/null b/fonts/vga/vga.FEFF-FEFF differ
binary files /dev/null b/fonts/vga/vga.FFFD-FFFD differ
--- /dev/null
+++ b/fonts/vga/vga.font
@@ -1,0 +1,106 @@
+16 12
+0x0	0x7F	vga.0000-007F
+0xA0	0x21F	vga.00A0-021F
+0x222	0x233	vga.0222-0233
+0x250	0x2AD	vga.0250-02AD
+0x2B0	0x2CF	vga.02B0-02CF
+0x2D8	0x2DD	vga.02D8-02DD
+0x2EE	0x2EE	vga.02EE-02EE
+0x300	0x301	vga.0300-0301
+0x303	0x303	vga.0303-0303
+0x309	0x309	vga.0309-0309
+0x312	0x314	vga.0312-0314
+0x323	0x323	vga.0323-0323
+0x340	0x341	vga.0340-0341
+0x374	0x375	vga.0374-0375
+0x37A	0x37A	vga.037A-037A
+0x37E	0x37E	vga.037E-037E
+0x384	0x38A	vga.0384-038A
+0x38C	0x38C	vga.038C-038C
+0x38E	0x3A1	vga.038E-03A1
+0x3A3	0x3CE	vga.03A3-03CE
+0x3D0	0x3D7	vga.03D0-03D7
+0x3DA	0x3F3	vga.03DA-03F3
+0x400	0x486	vga.0400-0486
+0x488	0x4CE	vga.0488-04CE
+0x4D0	0x4F5	vga.04D0-04F5
+0x4F8	0x4F9	vga.04F8-04F9
+0x500	0x50F	vga.0500-050F
+0x530	0x556	vga.0530-0556
+0x559	0x55F	vga.0559-055F
+0x561	0x587	vga.0561-0587
+0x589	0x58A	vga.0589-058A
+0x591	0x5A1	vga.0591-05A1
+0x5A3	0x5B9	vga.05A3-05B9
+0x5BB	0x5C4	vga.05BB-05C4
+0x5D0	0x5EA	vga.05D0-05EA
+0x5F0	0x5F4	vga.05F0-05F4
+0x60C	0x60C	vga.060C-060C
+0x61B	0x61B	vga.061B-061B
+0x61F	0x61F	vga.061F-061F
+0x621	0x63A	vga.0621-063A
+0x640	0x655	vga.0640-0655
+0x660	0x66D	vga.0660-066D
+0x670	0x6ED	vga.0670-06ED
+0x6F0	0x6FE	vga.06F0-06FE
+0x10D3	0x10D3	vga.10D3-10D3
+0x10D7	0x10D7	vga.10D7-10D7
+0x10DA	0x10DA	vga.10DA-10DA
+0x10DD	0x10DD	vga.10DD-10DD
+0x10E6	0x10E6	vga.10E6-10E6
+0x1E00	0x1E9B	vga.1E00-1E9B
+0x1EA0	0x1EF9	vga.1EA0-1EF9
+0x1F00	0x1F07	vga.1F00-1F07
+0x2000	0x2027	vga.2000-2027
+0x2030	0x2046	vga.2030-2046
+0x2048	0x204D	vga.2048-204D
+0x2070	0x2070	vga.2070-2070
+0x2074	0x208F	vga.2074-208F
+0x20A0	0x20AF	vga.20A0-20AF
+0x2100	0x213A	vga.2100-213A
+0x2153	0x2183	vga.2153-2183
+0x2190	0x21F3	vga.2190-21F3
+0x2200	0x22F1	vga.2200-22F1
+0x2300	0x2300	vga.2300-2300
+0x2302	0x2302	vga.2302-2302
+0x2308	0x230B	vga.2308-230B
+0x2310	0x2310	vga.2310-2310
+0x2318	0x2318	vga.2318-2318
+0x231A	0x231B	vga.231A-231B
+0x2320	0x2321	vga.2320-2321
+0x2329	0x232A	vga.2329-232A
+0x239B	0x23BD	vga.239B-23BD
+0x23CE	0x23CE	vga.23CE-23CE
+0x2409	0x240D	vga.2409-240D
+0x2423	0x2424	vga.2423-2424
+0x2426	0x2426	vga.2426-2426
+0x2500	0x2595	vga.2500-2595
+0x25A0	0x25F7	vga.25A0-25F7
+0x2600	0x2602	vga.2600-2602
+0x2605	0x260D	vga.2605-260D
+0x2610	0x2613	vga.2610-2613
+0x2620	0x2620	vga.2620-2620
+0x2622	0x2622	vga.2622-2622
+0x2626	0x2626	vga.2626-2626
+0x2628	0x262B	vga.2628-262B
+0x262E	0x2637	vga.262E-2637
+0x2639	0x2653	vga.2639-2653
+0x2660	0x2667	vga.2660-2667
+0x2669	0x266F	vga.2669-266F
+0xFB00	0xFB05	vga.FB00-FB05
+0xFB50	0xFBB1	vga.FB50-FBB1
+0xFBD3	0xFBE9	vga.FBD3-FBE9
+0xFBFC	0xFBFF	vga.FBFC-FBFF
+0xFC5B	0xFC63	vga.FC5B-FC63
+0xFC90	0xFC90	vga.FC90-FC90
+0xFCF2	0xFCF4	vga.FCF2-FCF4
+0xFD3C	0xFD3F	vga.FD3C-FD3F
+0xFDF2	0xFDF2	vga.FDF2-FDF2
+0xFE50	0xFE52	vga.FE50-FE52
+0xFE54	0xFE66	vga.FE54-FE66
+0xFE68	0xFE6B	vga.FE68-FE6B
+0xFE70	0xFE72	vga.FE70-FE72
+0xFE74	0xFE74	vga.FE74-FE74
+0xFE76	0xFEFC	vga.FE76-FEFC
+0xFEFF	0xFEFF	vga.FEFF-FEFF
+0xFFFD	0xFFFD	vga.FFFD-FFFD
--- a/lib/emptydirs
+++ b/lib/emptydirs
@@ -1,3 +1,4 @@
+AIX/power/lib
 FreeBSD/386/lib
 Inferno/386/bin
 Inferno/386/lib
@@ -16,6 +17,8 @@
 MacOSX/386/lib
 MacOSX/power/lib
 NetBSD/386/lib
+NetBSD/power/lib
+NetBSD/power/bin
 Nt/386/lib
 OpenBSD/386/bin
 OpenBSD/386/lib
--- /dev/null
+++ b/lib9/getcallerpc-AIX-power.c
@@ -1,0 +1,12 @@
+#include <lib9.h>
+
+ulong
+getcallerpc(void *x)
+{
+ulong *lp;
+
+	lp = x;
+
+	return lp[-1];
+}
+
--- a/lib9/getcallerpc-NetBSD-386.S
+++ b/lib9/getcallerpc-NetBSD-386.S
@@ -1,8 +1,7 @@
-	.file	"getcallerpc-NetBSD-386.S"
+#include <machine/asm.h>
 
-	.type	getcallerpc,@function
-	.global	getcallerpc
-getcallerpc:
+NENTRY(getcallerpc)
 	movl	4(%esp), %eax
 	movl	-4(%eax), %eax
 	ret
+	END(getcallerpc)
--- /dev/null
+++ b/lib9/getcallerpc-NetBSD-power.S
@@ -1,0 +1,6 @@
+#include <machine/asm.h>
+
+ENTRY_NOPROFILE(getcallerpc)
+	mflr	%r3
+	blr
+	END(getcallerpc)
--- /dev/null
+++ b/lib9/setfcr-AIX-power.c
@@ -1,0 +1,39 @@
+#include "lib9.h"
+
+ulong
+getfcr(void)
+{
+	double fpscr;
+
+	fpscr = __readflm();
+	return ((ulong*)&fpscr)[1];
+}
+
+ulong
+getfsr(void)
+{
+	double fpscr;
+
+	fpscr = __readflm();
+	return ((ulong*)&fpscr)[1];
+}
+
+void
+setfsr(ulong fsr)
+{
+	double fpscr;
+
+	fpscr = __readflm();
+	(((ulong*)&fpscr)[1]) = fsr;
+	__setflm(fpscr);
+}
+
+void
+setfcr(ulong fcr)
+{
+	double fpscr;
+
+	fpscr = __readflm();
+	(((ulong*)&fpscr)[1]) = fcr;
+	__setflm(fpscr);
+}
--- a/lib9/setfcr-Linux-power.S
+++ b/lib9/setfcr-Linux-power.S
@@ -3,13 +3,13 @@
 
 FN(getfcr):
 	mffs	%f0
-	stfdu	%f0,-16(%r1)
+	stfd	%f0,-16(%r1)
 	lw	%r3,-12(%r1)
 	blr
 
 FN(getfsr):
 	mffs	%f0
-	stfdu	%f0,-16(%r1)
+	stfd	%f0,-16(%r1)
 	lw	%r3,-12(%r1)
 	blr
 
--- a/lib9/setfcr-NetBSD-386.S
+++ b/lib9/setfcr-NetBSD-386.S
@@ -1,10 +1,9 @@
+#include <machine/asm.h>
 
-#define	FN(x)	.type x,@function; .global x; x
 #define	ENT	subl $16, %esp
 #define	RET	addl $16, %esp; ret
 
-	.file	"setfcr-Linux-386.S"
-FN(setfcr):
+NENTRY(setfcr)
 	ENT
 	xorb	$0x3f, %al
 	movl	%eax, (%esp)
@@ -11,8 +10,9 @@
 	fwait
 	fldcw	(%esp)
 	RET
+	END(setfcr)
 
-FN(getfcr):
+NENTRY(getfcr)
 	ENT
 	fwait
 	fstcw	(%esp)
@@ -20,8 +20,9 @@
 	andl	$0xffff, %eax
 	xorb	$0x3f, %al
 	RET
+	END(getfcr)
 
-FN(getfsr):
+NENTRY(getfsr)
 	ENT
 	fwait
 	fstsw	(%esp)
@@ -28,7 +29,9 @@
 	movw	(%esp), %ax
 	andl	$0xffff, %eax
 	RET
+	END(getfsr)
 
-FN(setfsr):
+NENTRY(setfsr)
 	fclex
 	ret
+	END(setfsr)
--- /dev/null
+++ b/lib9/setfcr-NetBSD-power.S
@@ -1,0 +1,33 @@
+#include <machine/asm.h>
+
+ENTRY_NOPROFILE(getfcr)
+	mffs	%f0
+	stfd	%f0,-16(%r1)
+	lwz	%r3,-12(%r1)
+	blr
+	END(getfcr)
+
+ENTRY_NOPROFILE(getfsr)
+	mffs	%f0
+	stfd	%f0,-16(%r1)
+	lwz	%r3,-12(%r1)
+	blr
+	END(getfsr)
+
+ENTRY_NOPROFILE(setfsr)
+	sync
+	stw	%r3,-12(%r1)
+	lfd	%f0,-16(%r1)
+	mtfsf	0xff, %f0
+	isync
+	blr
+	END(setfsr)
+
+ENTRY_NOPROFILE(setfcr)
+	sync
+	stw	%r3,-12(%r1)
+	lfd	%f0,-16(%r1)
+	mtfsf	0xff, %f0
+	isync
+	blr
+	END(setfcr)
--- /dev/null
+++ b/lib9/setfcr-OpenBSD-386.S
@@ -1,0 +1,34 @@
+
+#define	FN(x)	.type x,@function; .global x; x
+#define	ENT	subl $16, %esp
+#define	RET	addl $16, %esp; ret
+
+	.file	"setfcr-Linux-386.S"
+FN(setfcr):
+	ENT
+	xorb	$0x3f, %al
+	movl	%eax, (%esp)
+	fwait
+	fldcw	(%esp)
+	RET
+
+FN(getfcr):
+	ENT
+	fwait
+	fstcw	(%esp)
+	movw	(%esp), %ax
+	andl	$0xffff, %eax
+	xorb	$0x3f, %al
+	RET
+
+FN(getfsr):
+	ENT
+	fwait
+	fstsw	(%esp)
+	movw	(%esp), %ax
+	andl	$0xffff, %eax
+	RET
+
+FN(setfsr):
+	fclex
+	ret
--- a/libinterp/comp-power.c
+++ b/libinterp/comp-power.c
@@ -31,6 +31,10 @@
 #define	MFSPR(s, d)	gen(XO(31,339) | ((d)<<21) | ((s)<<11))
 #define	MTSPR(s, d)	gen(XO(31,467) | ((s)<<21) | ((d)<<11));
 
+#define	MFCR(d)		gen(XO(31,19) | ((d)<<21))
+#define	MTCRF(s, mask)	gen(XO(31,144) | ((s)<<21) | ((mask)<<12))
+#define	MTCR(s)		MTCRF(s, 0xff)
+
 #define	SLWI(d,a,n)	gen(slw((d),(a),(n),0))
 #define	LRET()	gen(Oblr)
 
@@ -1636,7 +1640,7 @@
 }
 
 enum {
-	PREFLEN = 20,	/* max instruction words in comvec */
+	PREFLEN = 64,	/* max instruction words in comvec */
 };
 
 static void
@@ -1649,6 +1653,45 @@
 	s = code = malloc(PREFLEN*sizeof(*code));
 	if(s == nil)
 		error(exNomem);
+
+#ifdef __ELF__
+	if(macjit) {
+		ulong *cp;
+		int r;
+
+		/*
+		 * ELF frame:
+		 *  0(%sp) - back chain
+		 *  4(%sp) - callee's LR save slot
+		 *  8(%sp) to 36(%sp) - 8 words of parameter list area
+		 * 40(%sp) to 48(%sp) - pad to 16 byte alignment/local vars
+		 */
+		mfspr(Ro1, Rlr);
+		AIRR(Ostw, Ro1, Rsp,4);
+		AIRR(Ostwu, Rsp, Rsp,-128);
+
+		MFCR(Ro1);
+		AIRR(Ostw, Ro1, Rsp,52);
+		for (r = 14; r < 32; ++r)
+			AIRR(Ostw, r, Rsp,r*4);
+
+		cp = code;
+		gen(Ob | Lk);
+
+		AIRR(Olwz, Ro1, Rsp,52);
+		MTCR(Ro1);
+		for (r = 14; r < 32; ++r)
+			AIRR(Olwz, r, Rsp,r*4);
+		AIRR(Oaddi, Rsp, Rsp, 128);
+
+		AIRR(Olwz, Ro1, Rsp,4);
+		mtspr(Rlr, Ro1);
+		LRET();
+
+		PATCH(cp);
+	}
+#endif	/* __ELF__ */
+
 	ldc((ulong)&R, Rreg);
 	SETR0();
 	mfspr(Rlink, Rlr);
--- a/libinterp/runt.h
+++ b/libinterp/runt.h
@@ -3096,8 +3096,8 @@
 #define Math_Infinity Infinity
 #define Math_NaN NaN
 #define Math_MachEps 2.220446049250313e-16
-#define Math_Pi 3.1415927410125732
-#define Math_Degree .01745329238474369
+#define Math_Pi 3.141592653589793
+#define Math_Degree .017453292519943295
 #define Math_INVAL 1
 #define Math_ZDIV 2
 #define Math_OVFL 4
--- /dev/null
+++ b/libmath/FPcontrol-AIX.c
@@ -1,0 +1,77 @@
+#include "lib9.h"
+#include "mathi.h"
+
+void
+FPinit(void)
+{
+	setfsr(0);	/* Clear pending exceptions */
+	setfcr(FPPDBL|FPRNR|FPINVAL|FPZDIV|FPUNFL|FPOVFL);
+}
+
+ulong
+getFPstatus(void)
+{
+	ulong fsr = 0, fsr9 = getfsr();
+	/* on specific machines, could be table lookup */
+	if(fsr9&FPAINEX) fsr |= INEX;
+	if(fsr9&FPAOVFL) fsr |= OVFL;
+	if(fsr9&FPAUNFL) fsr |= UNFL;
+	if(fsr9&FPAZDIV) fsr |= ZDIV;
+	if(fsr9&FPAINVAL) fsr |= INVAL;
+	return fsr;
+}
+
+ulong
+FPstatus(ulong fsr, ulong mask)
+{
+	ulong fsr9 = 0;
+	ulong old = getFPstatus();
+	fsr = (fsr&mask) | (old&~mask);
+	if(fsr&INEX) fsr9 |= FPAINEX;
+	if(fsr&OVFL) fsr9 |= FPAOVFL;
+	if(fsr&UNFL) fsr9 |= FPAUNFL;
+	if(fsr&ZDIV) fsr9 |= FPAZDIV;
+	if(fsr&INVAL) fsr9 |= FPAINVAL;
+	setfsr(fsr9);
+	return(old&mask);
+}
+
+ulong
+getFPcontrol(void)
+{
+	ulong fcr = 0, fcr9 = getfcr();
+	switch(fcr9&FPRMASK){
+		case FPRNR:	fcr = RND_NR; break;
+		case FPRNINF:	fcr = RND_NINF; break;
+		case FPRPINF:	fcr = RND_PINF; break;
+		case FPRZ:	fcr = RND_Z; break;
+	}
+	if(fcr9&FPINEX) fcr |= INEX;
+	if(fcr9&FPOVFL) fcr |= OVFL;
+	if(fcr9&FPUNFL) fcr |= UNFL;
+	if(fcr9&FPZDIV) fcr |= ZDIV;
+	if(fcr9&FPINVAL) fcr |= INVAL;
+	return fcr;
+}
+
+ulong
+FPcontrol(ulong fcr, ulong mask)
+{
+	ulong fcr9 = FPPDBL;
+	ulong old = getFPcontrol();
+	fcr = (fcr&mask) | (old&~mask);
+	if(fcr&INEX) fcr9 |= FPINEX;
+	if(fcr&OVFL) fcr9 |= FPOVFL;
+	if(fcr&UNFL) fcr9 |= FPUNFL;
+	if(fcr&ZDIV) fcr9 |= FPZDIV;
+	if(fcr&INVAL) fcr9 |= FPINVAL;
+	switch(fcr&RND_MASK){
+		case RND_NR:	fcr9 |= FPRNR; break;
+		case RND_NINF:	fcr9 |= FPRNINF; break;
+		case RND_PINF:	fcr9 |= FPRPINF; break;
+		case RND_Z:	fcr9 |= FPRZ; break;
+	}
+	setfcr(fcr9);
+	return(old&mask);
+}
+
--- /dev/null
+++ b/libmemdraw/mkfile-AIX
@@ -1,0 +1,1 @@
+<mkfile-Inferno
--- /dev/null
+++ b/libmemlayer/mkfile-AIX
@@ -1,0 +1,4 @@
+#
+#	System dependent objects for Posix model systems
+#
+SYSFILES=lalloc.$O
--- a/limbo/lex.c
+++ b/limbo/lex.c
@@ -1434,7 +1434,7 @@
 {
 	void *p;
 
-	p = malloc(n);
+	p = malloc(n != 0? n: 1);
 	if(p == nil)
 		fatal("out of memory");
 	return p;
--- a/limbo/limbo.y
+++ b/limbo/limbo.y
@@ -582,13 +582,13 @@
 	{
 		$$ = mkids(&$1->src, enter("junk", 0), $3, nil);
 		$$->store = Darg;
-		yyerror("illegal argument declaraion");
+		yyerror("illegal argument declaration");
 	}
 	| idterms ':' adtk
 	{
 		$$ = mkids(&$1->src, enter("junk", 0), $3, nil);
 		$$->store = Darg;
-		yyerror("illegal argument declaraion");
+		yyerror("illegal argument declaration");
 	}
 	;
 
--- a/limbo/types.c
+++ b/limbo/types.c
@@ -2024,7 +2024,7 @@
 				id->sym->name, base);
 		id->cycerr = 1;
 	}else if(arc & ArcCyc){
-		if((arc & ArcArray) && id->cyc == 0 && !(arc & ArcPolycyc)){
+		if((arc & ArcArray) && oldcycles && id->cyc == 0 && !(arc & ArcPolycyc)){
 			if(id->cycerr == 0)
 				error(base->src.start, "illegal circular reference to type %T in field %s of %t",
 					id->ty, id->sym->name, base);
@@ -3466,7 +3466,7 @@
 
 	if(t == nil)
 		return nil;
-if(debug['w']) print("expandtype %d %lux %T\n", t->kind, (ulong)t, t);
+if(debug['w']) print("expandtype %d %#p %T\n", t->kind, t, t);
 	if(!toccurs(t, tp))
 		return t;
 if(debug['w']) print("\texpanding\n");
--- a/limbo/y.tab.c
+++ b/limbo/y.tab.c
@@ -2025,7 +2025,7 @@
 {
 		yyval.ids = mkids(&yypt[-2].yyv.node->src, enter("junk", 0), yypt[-0].yyv.type, nil);
 		yyval.ids->store = Darg;
-		yyerror("illegal argument declaraion");
+		yyerror("illegal argument declaration");
 	} break;
 case 104:
 #line	588	"limbo.y"
@@ -2032,7 +2032,7 @@
 {
 		yyval.ids = mkids(&yypt[-2].yyv.node->src, enter("junk", 0), yypt[-0].yyv.type, nil);
 		yyval.ids->store = Darg;
-		yyerror("illegal argument declaraion");
+		yyerror("illegal argument declaration");
 	} break;
 case 105:
 #line	596	"limbo.y"
--- a/man/1/m4
+++ b/man/1/m4
@@ -4,6 +4,12 @@
 .SH SYNOPSIS
 .B m4
 [
+.BI -p prefix
+]
+[
+.B -t
+]
+[
 .BI -D name = value
 ] [
 .BI -Q name = value
@@ -236,7 +242,20 @@
 Undiverting discards the diverted text.
 .PD
 .PP
+The
+.B -p
+option causes
+.I m4
+to add the given prefix character to the names of predefined macros;
+typically the
+.I prefix
+is a Unicode character, to reduce the chance of a clash with macro names in the input text.
+The
+.B -t
+option produces a trace on standard error.
+.PP
 .I M4
+otherwise
 interprets its command line options after installing the predefined macro set.
 The
 .B -D
--- /dev/null
+++ b/mkfiles/mkfile-AIX-power
@@ -1,0 +1,25 @@
+TARGMODEL=	Posix
+TARGSHTYPE=	sh
+CPUS=		power
+
+O=		o
+OS=		o
+
+AR=		ar
+ARFLAGS=	crvs
+
+AS=		xlc -c
+ASFLAGS=
+
+CC=		xlc_r -c
+CFLAGS=	-q32 -g -O -qsuppress=1506-224\
+	-I$ROOT/$SYSTARG/$OBJTYPE/include\
+	-I$ROOT/include\
+
+ANSICPP=
+LD=		xlc_r
+LDFLAGS=	-bmaxdata:0x80000000
+SYSLIBS=	-lm
+
+YACC=		iyacc
+YFLAGS=		-d
--- a/mkfiles/mkfile-NetBSD-386
+++ b/mkfiles/mkfile-NetBSD-386
@@ -14,6 +14,7 @@
 CC=		cc -c
 CFLAGS=		-g\
 		-O\
+		-fno-strict-aliasing\
 		-Wno-deprecated-declarations -Wuninitialized -Wunused -Wreturn-type -Wimplicit\
 		-I$ROOT/NetBSD/386/include\
 		-I$ROOT/include\
--- /dev/null
+++ b/mkfiles/mkfile-NetBSD-power
@@ -1,0 +1,30 @@
+TARGMODEL=	Posix
+TARGSHTYPE=	sh
+CPUS=		power
+
+O=		o
+OS=		o
+
+AR=		ar
+ARFLAGS=	ruvs
+
+AS=		cc -c
+ASFLAGS=
+
+CC=		cc -c
+CFLAGS=		-g\
+		-O\
+		-fno-strict-aliasing\
+		-Wno-deprecated-declarations -Wuninitialized -Wunused -Wreturn-type -Wimplicit\
+		-I$ROOT/NetBSD/power/include\
+		-I$ROOT/include\
+		-I/usr/X11R7/include
+
+ANSICPP=
+LD=		cc
+LDFLAGS=
+
+SYSLIBS=
+
+YACC=		iyacc
+YFLAGS=		-d
--- /dev/null
+++ b/mkfiles/mkhost-AIX
@@ -1,0 +1,14 @@
+
+#	Variables for host system type = AIX
+
+SHELLTYPE=	sh
+SHELLNAME=	/bin/sh
+HOSTMODEL=	Posix
+OSTARG=		os
+
+DATA2S=		data2s
+NDATE=		ndate
+KSIZE=		ksize
+AWK=		awk
+
+MKAR=		archive-$SYSTARG
--- a/module/draw.m
+++ b/module/draw.m
@@ -91,7 +91,7 @@
 	RGB15: con Chans(((CIgnore<<4)|1)<<24 | ((CRed<<4)|5)<<16 | ((CGreen<<4)|5)<<8 | ((CBlue<<4)|5));
 	RGB16: con Chans(((CRed<<4)|5)<<16 | ((CGreen<<4)|6)<<8 | ((CBlue<<4)|5));
 	RGB24: con Chans(((CRed<<4)|8)<<16 | ((CGreen<<4)|8)<<8 | ((CBlue<<4)|8));
-	RGBA32: con Chans((((CRed<<4)|8)<<16 | ((CGreen<<4)|8)<<8 | ((CBlue<<4)|8))<<8 | ((CAlpha<<4)|8));
+	RGBA32: con Chans((((CRed<<4)|8)<<24 | ((CGreen<<4)|8)<<16 | ((CBlue<<4)|8))<<8 | ((CAlpha<<4)|8));
 	ARGB32: con Chans(((CAlpha<<4)|8)<<24 | ((CRed<<4)|8)<<16 | ((CGreen<<4)|8)<<8 | ((CBlue<<4)|8));	# stupid VGAs
 	XRGB32: con Chans(((CIgnore<<4)|8)<<24 | ((CRed<<4)|8)<<16 | ((CGreen<<4)|8)<<8 | ((CBlue<<4)|8));	# stupid VGAs
 
binary files /dev/null b/services/webget/smallinferno.gif differ
--- a/utils/8l/l.h
+++ b/utils/8l/l.h
@@ -195,7 +195,7 @@
 		uchar	obuf[MAXIO];			/* output buffer */
 		uchar	ibuf[MAXIO];			/* input buffer */
 	} u;
-	char	dbuf[1];
+	char	dbuf[2*MAXIO];
 } buf;
 
 #define	cbuf	u.obuf
@@ -236,8 +236,8 @@
 EXTERN	char	literal[32];
 EXTERN	Prog*	etextp;
 EXTERN	Prog*	firstp;
-EXTERN	char	fnuxi8[8];
-EXTERN	char	fnuxi4[4];
+EXTERN	uchar	fnuxi8[8];
+EXTERN	uchar	fnuxi4[4];
 EXTERN	Sym*	hash[NHASH];
 EXTERN	Sym*	histfrog[MAXHIST];
 EXTERN	int	histfrogp;
@@ -247,9 +247,9 @@
 EXTERN	int	libraryp;
 EXTERN	int	xrefresolv;
 EXTERN	char*	hunk;
-EXTERN	char	inuxi1[1];
-EXTERN	char	inuxi2[2];
-EXTERN	char	inuxi4[4];
+EXTERN	uchar	inuxi1[1];
+EXTERN	uchar	inuxi2[2];
+EXTERN	uchar	inuxi4[4];
 EXTERN	char	ycover[Ymax*Ymax];
 EXTERN	uchar*	andptr;
 EXTERN	uchar	and[30];
--- /dev/null
+++ b/utils/mk/archive-AIX.c
@@ -1,0 +1,203 @@
+#include	"mk.h"
+#include	<ar.h>
+
+static int dolong;
+
+static void atimes(char *);
+static char *split(char*, char**);
+
+long
+atimeof(int force, char *name)
+{
+	Symtab *sym;
+	long t;
+	char *archive, *member, buf[512];
+
+	archive = split(name, &member);
+	if(archive == 0)
+		Exit();
+
+	t = mtime(archive);
+	sym = symlook(archive, S_AGG, 0);
+	if(sym){
+		if(force || (t > (long)sym->value)){
+			atimes(archive);
+			sym->value = (void *)t;
+		}
+	}
+	else{
+		atimes(archive);
+		/* mark the aggegate as having been done */
+		symlook(strdup(archive), S_AGG, "")->value = (void *)t;
+	}
+	snprint(buf, sizeof(buf), "%s(%s)", archive, member);
+	sym = symlook(buf, S_TIME, 0);
+	if (sym)
+		return (long)sym->value;	/* uggh */
+	return 0;
+}
+
+void
+atouch(char *name)
+{
+	char *archive, *member;
+	int fd, i, namelen;
+	struct fl_hdr g;
+	struct ar_hdr h;
+	long t;
+	char memname[256];
+
+	archive = split(name, &member);
+	if(archive == 0)
+		Exit();
+
+	fd = open(archive, ORDWR);
+	if(fd < 0){
+		fd = create(archive, OWRITE, 0666);
+		if(fd < 0){
+			perror(archive);
+			Exit();
+		}
+		write(fd, ARMAG, SARMAG);
+		for(i = 0; i < 6; i++)
+			fprint(fd, "%-20ld", 0);
+	}
+	if(symlook(name, S_TIME, 0)){
+		/* hoon off and change it in situ */
+		LSEEK(fd, 0, 0);
+		if(read(fd, &g, SAR_FLHDR) != SAR_FLHDR){
+			close(fd);
+			return;
+		}
+		t = atol(g.fstmoff);
+		if(t == 0){
+			close(fd);
+			return;
+		}
+		for(;;){
+			LSEEK(fd, t, 0);
+			if(read(fd, (char *)&h, SAR_HDR) != SAR_HDR)
+				break;
+
+			namelen = atol(h.namlen);
+			if(namelen == 0 || namelen >= sizeof memname){
+				namelen = 0;
+				goto skip;
+			}
+			if(read(fd, memname, namelen) != namelen)
+				break;
+			memname[namelen] = 0;
+
+			if(strcmp(member, memname) == 0){
+				snprint(h.date, sizeof(h.date), "%-12ld", time(0));
+				LSEEK(fd, t, 0);
+				write(fd, (char *)&h, SAR_HDR);
+				break;
+			}
+		skip:
+			t = atol(h.nxtmem);
+			if(t == 0)
+				break;
+		}
+	}
+	close(fd);
+}
+
+static void
+atimes(char *ar)
+{
+	struct fl_hdr g;
+	struct ar_hdr h;
+	long o, t;
+	int fd, i, namelen;
+	char buf[2048], *p, *strings;
+	char name[1024];
+	Symtab *sym;
+
+	strings = nil;
+	fd = open(ar, OREAD);
+	if(fd < 0)
+		return;
+
+	if(read(fd, &g, SAR_FLHDR) != SAR_FLHDR){
+		close(fd);
+		return;
+	}
+	o = atol(g.fstmoff);
+	if(o == 0){
+		close(fd);
+		return;
+	}
+	for(;;){
+		LSEEK(fd, o, 0);
+		if(read(fd, (char *)&h, SAR_HDR) != SAR_HDR)
+			break;
+
+		t = atol(h.date);
+		if(t == 0)	/* as it sometimes happens; thanks ken */
+			t = 1;
+
+		namelen = atol(h.namlen);
+		if(namelen == 0 || namelen >= sizeof name){
+			namelen = 0;
+			goto skip;
+		}
+		if(read(fd, name, namelen) != namelen)
+			break;
+		name[namelen] = 0;
+
+		snprint(buf, sizeof buf, "%s(%s)", ar, name);
+		sym = symlook(strdup(buf), S_TIME, (void *)t);
+		sym->value = (void *)t;
+	skip:
+		o = atol(h.nxtmem);
+		if(o == 0)
+			break;
+	}
+	close(fd);
+	free(strings);
+}
+
+static int
+type(char *file)
+{
+	int fd;
+	char buf[SARMAG];
+
+	fd = open(file, OREAD);
+	if(fd < 0){
+		if(symlook(file, S_BITCH, 0) == 0){
+			Bprint(&bout, "%s doesn't exist: assuming it will be an archive\n", file);
+			symlook(file, S_BITCH, (void *)file);
+		}
+		return 1;
+	}
+	if(read(fd, buf, SARMAG) != SARMAG){
+		close(fd);
+		return 0;
+	}
+	close(fd);
+	return strncmp(ARMAG, buf, SARMAG) == 0;
+}
+
+static char*
+split(char *name, char **member)
+{
+	char *p, *q;
+
+	p = strdup(name);
+	q = utfrune(p, '(');
+	if(q){
+		*q++ = 0;
+		if(member)
+			*member = q;
+		q = utfrune(q, ')');
+		if (q)
+			*q = 0;
+		if(type(p))
+			return p;
+		free(p);
+		fprint(2, "mk: '%s' is not an archive\n", name);
+	}
+	return 0;
+}
--- a/utils/mk/mkfile
+++ b/utils/mk/mkfile
@@ -1,9 +1,11 @@
+MKAR=	archive
+
 <../../mkconfig
 
 TARG=mk
 
 OFILES=	arc.$O\
-	archive.$O\
+	$MKAR.$O\
 	bufblock.$O\
 	env.$O\
 	file.$O\