git: 9front

Download patch

ref: 579da332357798e3f033cb0c16d0e9876b35d0d9
parent: 2cfec7519eef4bb8e94d6a42744831b916926b58
author: cinap_lenrek <cinap_lenrek@localhost>
date: Fri May 20 20:42:08 EDT 2011

remove keyboard stuff from other ports, make openssl and python compile on arm

--- a/sys/include/ape/openssl/opensslconf.h
+++ b/sys/include/ape/openssl/opensslconf.h
@@ -84,8 +84,6 @@
 /* Generate 80386 code? */
 #if defined(PLAN9) && defined(T386)
 #define I386_ONLY
-#else
-#error unknown objtype
 #endif
 #if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */
 #if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR)
--- a/sys/src/9/alphapc/fns.h
+++ b/sys/src/9/alphapc/fns.h
@@ -54,7 +54,6 @@
 int	iounused(int, int);
 int	irqallocread(char*, long, vlong);
 int	isaconfig(char*, int, ISAConf*);
-void	kbdinit(void);
 #define kexit(a)
 #define	kmapinval()
 void	*kmapv(uvlong, int);
--- a/sys/src/9/alphapc/kbd.c
+++ /dev/null
@@ -1,456 +1,0 @@
-#include	"u.h"
-#include	"../port/lib.h"
-#include	"mem.h"
-#include	"dat.h"
-#include	"fns.h"
-#include	"io.h"
-#include	"../port/error.h"
-
-enum {
-	Data=		0x60,		/* data port */
-
-	Status=		0x64,		/* status port */
-	 Inready=	0x01,		/*  input character ready */
-	 Outbusy=	0x02,		/*  output busy */
-	 Sysflag=	0x04,		/*  system flag */
-	 Cmddata=	0x08,		/*  cmd==0, data==1 */
-	 Inhibit=	0x10,		/*  keyboard/mouse inhibited */
-	 Minready=	0x20,		/*  mouse character ready */
-	 Rtimeout=	0x40,		/*  general timeout */
-	 Parity=	0x80,
-
-	Cmd=		0x64,		/* command port (write only) */
-
-	Spec=		0x80,
-
-	PF=		Spec|0x20,	/* num pad function key */
-	View=		Spec|0x00,	/* view (shift window up) */
-	KF=		0xF000,	/* function key (begin Unicode private space) */
-	Shift=		Spec|0x60,
-	Break=		Spec|0x61,
-	Ctrl=		Spec|0x62,
-	Latin=		Spec|0x63,
-	Caps=		Spec|0x64,
-	Num=		Spec|0x65,
-	Middle=		Spec|0x66,
-	No=		0x00,		/* peter */
-
-	Home=		KF|13,
-	Up=		KF|14,
-	Pgup=		KF|15,
-	Print=		KF|16,
-	Left=		KF|17,
-	Right=		KF|18,
-	End=		'\r',
-	Down=		View,
-	Pgdown=		KF|19,
-	Ins=		KF|20,
-	Scroll=	KF|21,
-	Del=		0x7F,
-};
-
-/*
- * The codes at 0x79 and 0x81 are produed by the PFU Happy Hacking keyboard.
- * A 'standard' keyboard doesn't produce anything above 0x58.
- */
-Rune kbtab[] = 
-{
-[0x00]	No,	0x1b,	'1',	'2',	'3',	'4',	'5',	'6',
-[0x08]	'7',	'8',	'9',	'0',	'-',	'=',	'\b',	'\t',
-[0x10]	'q',	'w',	'e',	'r',	't',	'y',	'u',	'i',
-[0x18]	'o',	'p',	'[',	']',	'\n',	Ctrl,	'a',	's',
-[0x20]	'd',	'f',	'g',	'h',	'j',	'k',	'l',	';',
-[0x28]	'\'',	'`',	Shift,	'\\',	'z',	'x',	'c',	'v',
-[0x30]	'b',	'n',	'm',	',',	'.',	'/',	Shift,	'*',
-[0x38]	Latin,	' ',	Ctrl,	KF|1,	KF|2,	KF|3,	KF|4,	KF|5,
-[0x40]	KF|6,	KF|7,	KF|8,	KF|9,	KF|10,	Num,	Scroll,	'7',
-[0x48]	'8',	'9',	'-',	'4',	'5',	'6',	'+',	'1',
-[0x50]	'2',	'3',	'0',	'.',	No,	No,	No,	KF|11,
-[0x58]	KF|12,	No,	No,	No,	No,	No,	No,	No,
-[0x60]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x68]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x70]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x78]	No,	View,	No,	Up,	No,	No,	No,	No,
-};
-
-Rune kbtabshift[] =
-{
-[0x00]	No,	0x1b,	'!',	'@',	'#',	'$',	'%',	'^',
-[0x08]	'&',	'*',	'(',	')',	'_',	'+',	'\b',	'\t',
-[0x10]	'Q',	'W',	'E',	'R',	'T',	'Y',	'U',	'I',
-[0x18]	'O',	'P',	'{',	'}',	'\n',	Ctrl,	'A',	'S',
-[0x20]	'D',	'F',	'G',	'H',	'J',	'K',	'L',	':',
-[0x28]	'"',	'~',	Shift,	'|',	'Z',	'X',	'C',	'V',
-[0x30]	'B',	'N',	'M',	'<',	'>',	'?',	Shift,	'*',
-[0x38]	Latin,	' ',	Ctrl,	KF|1,	KF|2,	KF|3,	KF|4,	KF|5,
-[0x40]	KF|6,	KF|7,	KF|8,	KF|9,	KF|10,	Num,	Scroll,	'7',
-[0x48]	'8',	'9',	'-',	'4',	'5',	'6',	'+',	'1',
-[0x50]	'2',	'3',	'0',	'.',	No,	No,	No,	KF|11,
-[0x58]	KF|12,	No,	No,	No,	No,	No,	No,	No,
-[0x60]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x68]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x70]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x78]	No,	Up,	No,	Up,	No,	No,	No,	No,
-};
-
-Rune kbtabesc1[] =
-{
-[0x00]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x08]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x10]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x18]	No,	No,	No,	No,	'\n',	Ctrl,	No,	No,
-[0x20]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x28]	No,	No,	Shift,	No,	No,	No,	No,	No,
-[0x30]	No,	No,	No,	No,	No,	'/',	No,	Print,
-[0x38]	Latin,	No,	No,	No,	No,	No,	No,	No,
-[0x40]	No,	No,	No,	No,	No,	No,	Break,	Home,
-[0x48]	Up,	Pgup,	No,	Left,	No,	Right,	No,	End,
-[0x50]	Down,	Pgdown,	Ins,	Del,	No,	No,	No,	No,
-[0x58]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x60]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x68]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x70]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x78]	No,	Up,	No,	No,	No,	No,	No,	No,
-};
-
-enum
-{
-	/* controller command byte */
-	Cscs1=		(1<<6),		/* scan code set 1 */
-	Cauxdis=	(1<<5),		/* mouse disable */
-	Ckbddis=	(1<<4),		/* kbd disable */
-	Csf=		(1<<2),		/* system flag */
-	Cauxint=	(1<<1),		/* mouse interrupt enable */
-	Ckbdint=	(1<<0),		/* kbd interrupt enable */
-};
-
-static Lock i8042lock;
-static uchar ccc;
-static void (*auxputc)(int, int);
-
-/*
- *  wait for output no longer busy
- */
-static int
-outready(void)
-{
-	int tries;
-
-	for(tries = 0; (inb(Status) & Outbusy); tries++){
-		if(tries > 500)
-			return -1;
-		delay(2);
-	}
-	return 0;
-}
-
-/*
- *  wait for input
- */
-static int
-inready(void)
-{
-	int tries;
-
-	for(tries = 0; !(inb(Status) & Inready); tries++){
-		if(tries > 500)
-			return -1;
-		delay(2);
-	}
-	return 0;
-}
-
-/*
- *  ask 8042 to reset the machine
- */
-void
-i8042reset(void)
-{
-	ushort *s = KADDR(0x472);
-	int i, x;
-
-	*s = 0x1234;		/* BIOS warm-boot flag */
-
-	/*
-	 *  newer reset the machine command
-	 */
-	outready();
-	outb(Cmd, 0xFE);
-	outready();
-
-	/*
-	 *  Pulse it by hand (old somewhat reliable)
-	 */
-	x = 0xDF;
-	for(i = 0; i < 5; i++){
-		x ^= 1;
-		outready();
-		outb(Cmd, 0xD1);
-		outready();
-		outb(Data, x);	/* toggle reset */
-		delay(100);
-	}
-}
-
-int
-i8042auxcmd(int cmd)
-{
-	unsigned int c;
-	int tries;
-
-	c = 0;
-	tries = 0;
-
-	ilock(&i8042lock);
-	do{
-		if(tries++ > 2)
-			break;
-		if(outready() < 0)
-			break;
-		outb(Cmd, 0xD4);
-		if(outready() < 0)
-			break;
-		outb(Data, cmd);
-		if(outready() < 0)
-			break;
-		if(inready() < 0)
-			break;
-		c = inb(Data);
-	} while(c == 0xFE || c == 0);
-	iunlock(&i8042lock);
-
-	if(c != 0xFA){
-		print("i8042: %2.2ux returned to the %2.2ux command\n", c, cmd);
-		return -1;
-	}
-	return 0;
-}
-
-/*
- *  keyboard interrupt
- */
-static void
-i8042intr(Ureg*, void*)
-{
-	int s, c, i;
-	static int esc1, esc2;
-	static int alt, caps, ctl, num, shift;
-	static int collecting, nk;
-	static Rune kc[5];
-	int keyup;
-
-	/*
-	 *  get status
-	 */
-	lock(&i8042lock);
-	s = inb(Status);
-	if(!(s&Inready)){
-		unlock(&i8042lock);
-		return;
-	}
-
-	/*
-	 *  get the character
-	 */
-	c = inb(Data);
-	unlock(&i8042lock);
-
-	/*
-	 *  if it's the aux port...
-	 */
-	if(s & Minready){
-		if(auxputc != nil)
-			auxputc(c, shift);
-		return;
-	}
-
-	/*
-	 *  e0's is the first of a 2 character sequence
-	 */
-	if(c == 0xe0){
-		esc1 = 1;
-		return;
-	} else if(c == 0xe1){
-		esc2 = 2;
-		return;
-	}
-
-	keyup = c&0x80;
-	c &= 0x7f;
-	if(c > sizeof kbtab){
-		c |= keyup;
-		if(c != 0xFF)	/* these come fairly often: CAPSLOCK U Y */
-			print("unknown key %ux\n", c);
-		return;
-	}
-
-	if(esc1){
-		c = kbtabesc1[c];
-		esc1 = 0;
-	} else if(esc2){
-		esc2--;
-		return;
-	} else if(shift)
-		c = kbtabshift[c];
-	else
-		c = kbtab[c];
-
-	if(caps && c<='z' && c>='a')
-		c += 'A' - 'a';
-
-	/*
-	 *  keyup only important for shifts
-	 */
-	if(keyup){
-		switch(c){
-		case Latin:
-			alt = 0;
-			break;
-		case Shift:
-			shift = 0;
-			break;
-		case Ctrl:
-			ctl = 0;
-			break;
-		}
-		return;
-	}
-
-	/*
- 	 *  normal character
-	 */
-	if(!(c & (Spec|KF))){
-		if(ctl){
-			if(alt && c == Del)
-				exit(0);
-			c &= 0x1f;
-		}
-		if(!collecting){
-			kbdputc(kbdq, c);
-			return;
-		}
-		kc[nk++] = c;
-		c = latin1(kc, nk);
-		if(c < -1)	/* need more keystrokes */
-			return;
-		if(c != -1)	/* valid sequence */
-			kbdputc(kbdq, c);
-		else	/* dump characters */
-			for(i=0; i<nk; i++)
-				kbdputc(kbdq, kc[i]);
-		nk = 0;
-		collecting = 0;
-		return;
-	} else {
-		switch(c){
-		case Caps:
-			caps ^= 1;
-			return;
-		case Num:
-			num ^= 1;
-			return;
-		case Shift:
-			shift = 1;
-			return;
-		case Latin:
-			alt = 1;
-			collecting = 1;
-			nk = 0;
-			return;
-		case Ctrl:
-			ctl = 1;
-			return;
-		}
-	}
-	kbdputc(kbdq, c);
-}
-
-void
-i8042auxenable(void (*putc)(int, int))
-{
-	char *err = "i8042: aux init failed\n";
-
-	/* enable kbd/aux xfers and interrupts */
-	ccc &= ~Cauxdis;
-	ccc |= Cauxint;
-
-	ilock(&i8042lock);
-	if(outready() < 0)
-		print(err);
-	outb(Cmd, 0x60);			/* write control register */
-	if(outready() < 0)
-		print(err);
-	outb(Data, ccc);
-	if(outready() < 0)
-		print(err);
-	outb(Cmd, 0xA8);			/* auxilliary device enable */
-	if(outready() < 0){
-		iunlock(&i8042lock);
-		return;
-	}
-	auxputc = putc;
-	intrenable(IrqAUX, i8042intr, 0, BUSUNKNOWN, "kbdaux");
-	iunlock(&i8042lock);
-}
-
-static void
-setscan(int code)
-{
-	char *err = "setscan: set scan code failed\n";
-
-	outb(Data, 0xF0);
-	if(inready() < 0 || inb(Data) != 0xFA || outready() < 0) {
-		print(err);
-		return;
-	}
-	outb(Data, code);
-	if(inready() < 0) {
-		print(err);
-		return;
-	}
-	inb(Data);
-	if(outready() < 0)
-		print(err);
-}
-
-void
-kbdinit(void)
-{
-	int c;
-
-	kbdq = qopen(4*1024, 0, 0, 0);
-	if(kbdq == nil)
-		panic("kbdinit");
-	qnoblock(kbdq, 1);
-
-	ioalloc(Data, 1, 0, "kbd");
-	ioalloc(Cmd, 1, 0, "kbd");
-
-	intrenable(IrqKBD, i8042intr, 0, BUSUNKNOWN, "kbd");
-
-	/* wait for a quiescent controller */
-	while((c = inb(Status)) & (Outbusy | Inready))
-		if(c & Inready)
-			inb(Data);
-
-	/* get current controller command byte */
-	outb(Cmd, 0x20);
-	if(inready() < 0){
-		print("kbdinit: can't read ccc\n");
-		ccc = 0;
-	} else
-		ccc = inb(Data);
-
-	/* enable kbd xfers and interrupts */
-	/* disable mouse */
-	ccc &= ~Ckbddis;
-	ccc |= Csf | Ckbdint | Cscs1;
-	if(outready() < 0)
-		print("kbd init failed\n");
-	outb(Cmd, 0x60);
-	if(outready() < 0)
-		print("kbd init failed\n");
-	outb(Data, ccc);
-	outready();
-	setscan(0x02);
-}
--- a/sys/src/9/alphapc/main.c
+++ b/sys/src/9/alphapc/main.c
@@ -99,7 +99,6 @@
 	printinit();
 	/* it's now safe to print */
 	/* dumpopts();			/* DEBUG */
-	kbdinit();
 	i8250console();
 	quotefmtinstall();
 	print("\nPlan 9\n");
--- a/sys/src/9/alphapc/mkfile
+++ b/sys/src/9/alphapc/mkfile
@@ -16,7 +16,6 @@
 	chan.$O\
 	dev.$O\
 	fault.$O\
-	latin1.$O\
 	log.$O\
 	edf.$O\
 	mul64fract.$O\
@@ -46,7 +45,6 @@
 	fdc37c93x.$O\
 	fptrap.$O\
 	i8259.$O\
-	kbd.$O\
 	main.$O\
 	mmu.$O\
 	random.$O\
@@ -78,6 +76,9 @@
 install:V: $p$CONF
 	cp $p$CONF /$objtype/$p$CONF
 
+rootfs.bz2:
+	rc ../port/mkbootfs
+
 <../boot/bootmkfile
 <../port/portmkfile
 <|../port/mkbootrules $CONF
@@ -95,7 +96,6 @@
 devarch.$O:	axp.h
 faultalpha.$O:	/$objtype/include/ureg.h
 fptrap.$O:	/$objtype/include/ureg.h
-kbd.$O:		/$objtype/include/ureg.h
 l.$O:		osf1pal.h
 main.$O: 	/$objtype/include/ureg.h errstr.h init.h
 mmu.$O:		/sys/src/boot/alphapc/conf.h
--- a/sys/src/9/alphapc/screen.h
+++ b/sys/src/9/alphapc/screen.h
@@ -7,6 +7,7 @@
 
 /* devmouse.c */
 extern void mousetrack(int, int, int, int);
+extern void absmousetrack(int, int, int, int);
 extern Point mousexy(void);
 
 extern void mouseaccelerate(int);
--- a/sys/src/9/bitsy/devµc.c
+++ b/sys/src/9/bitsy/devµc.c
@@ -12,7 +12,6 @@
 	Qbattery,
 	Qbuttons,
 	Qcruft,
-	Qkbdin,
 	Qled,
 	Qversion,
 	Qpower,
@@ -28,27 +27,6 @@
 	SOF=	0x2,		/* start of frame */
 };
 
-/* from /sys/include/keyboard.h */
-enum {
-	KF=	0xF000,	/* Rune: beginning of private Unicode space */
-	/* KF|1, KF|2, ..., KF|0xC is F1, F2, ..., F12 */
-	Khome=	KF|0x0D,
-	Kup=	KF|0x0E,
-	Kpgup=	KF|0x0F,
-	Kprint=	KF|0x10,
-	Kleft=	KF|0x11,
-	Kright=	KF|0x12,
-	Kdown=	0x80,
-	Kview=	0x80,
-	Kpgdown=	KF|0x13,
-	Kins=	KF|0x14,
-	Kend=	'\r',	/* [sic] */
-
-	Kalt=		KF|0x15,
-	Kshift=	KF|0x16,
-	Kctl=		KF|0x17,
-};
-
 Dirtab µcdir[]={
 	".",			{ Qdir, 0, QTDIR },	0,	DMDIR|0755,
 	"backlight",		{ Qbacklight, 0 },	0,	0664,
@@ -55,7 +33,6 @@
 	"battery",		{ Qbattery, 0 },		0,	0664,
 	"buttons",		{ Qbuttons, 0 },		0,	0664,
 	"cruft",		{ Qcruft, 0 },		0,	0664,
-	"kbdin",		{ Qkbdin, 0 },		0,	0664,
 	"led",			{ Qled, 0 },			0,	0664,
 	"version",		{ Qversion, 0 },		0,	0664,
 	"power",		{ Qpower, 0 },		0,	0600,
@@ -82,13 +59,6 @@
 	char	version[16+2];
 } ctlr;
 
-/* button map */
-Rune bmap[2][4] = 
-{
-	{Kup, Kright, Kleft, Kdown},	/* portrait mode */
-	{Kright, Kdown, Kup, Kleft},	/* landscape mode */
-};
-
 extern int landscape;
 
 int
@@ -148,12 +118,8 @@
 			b = p[0] & 0x7f;
 			up = p[0] & 0x80;
 
-			if(b > 5) {
-				/* rocker panel acts like arrow keys */
-				if(b < 10 && !up)
-					kbdputc(kbdq, bmap[landscape][b-6]);
-			} else {
-				/* the rest like mouse buttons */
+			if(b <= 5){
+				/* like mouse buttons */
 				if(--b == 0)
 					b = 5;
 				penbutton(up, 1<<b);
@@ -359,17 +325,6 @@
 	extern ulong resumeaddr[];
 	extern void power_resume(void);
 
-	if(c->qid.path == Qkbdin){
-		if(n >= sizeof(str))
-			n = sizeof(str)-1;
-		memmove(str, a, n);
-		str[n] = 0;
-		for(i = 0; i < n; i += j){
-			j = chartorune(&r, &str[i]);
-			kbdcr2nl(nil, r);
-		}
-		return n;
-	}
 	if(c->qid.path == Qpower){
 		if(!iseve())
 			error(Eperm);
--- a/sys/src/9/bitsy/mkfile
+++ b/sys/src/9/bitsy/mkfile
@@ -17,7 +17,6 @@
 	dev.$O\
 	edf.$O\
 	fault.$O\
-	latin1.$O\
 	mul64fract.$O\
 	rebootcmd.$O\
 	page.$O\
--- a/sys/src/9/kw/mkfile
+++ b/sys/src/9/kw/mkfile
@@ -21,7 +21,6 @@
 	dev.$O\
 	edf.$O\
 	fault.$O\
-	latin1.$O\
 	mul64fract.$O\
 	rebootcmd.$O\
 	page.$O\
--- a/sys/src/9/mtx/fns.h
+++ b/sys/src/9/mtx/fns.h
@@ -51,7 +51,6 @@
 void	ioinit(void);
 int	iprint(char*, ...);
 int	isaconfig(char*, int, ISAConf*);
-void	kbdinit(void);
 #define kexit(a)
 #define	kmapinval()
 void	links(void);
--- a/sys/src/9/mtx/kbd.c
+++ /dev/null
@@ -1,435 +1,0 @@
-#include	"u.h"
-#include	"../port/lib.h"
-#include	"mem.h"
-#include	"dat.h"
-#include	"fns.h"
-#include	"io.h"
-#include	"../port/error.h"
-
-enum {
-	Data=		0x60,		/* data port */
-
-	Status=		0x64,		/* status port */
-	 Inready=	0x01,		/*  input character ready */
-	 Outbusy=	0x02,		/*  output busy */
-	 Sysflag=	0x04,		/*  system flag */
-	 Cmddata=	0x08,		/*  cmd==0, data==1 */
-	 Inhibit=	0x10,		/*  keyboard/mouse inhibited */
-	 Minready=	0x20,		/*  mouse character ready */
-	 Rtimeout=	0x40,		/*  general timeout */
-	 Parity=	0x80,
-
-	Cmd=		0x64,		/* command port (write only) */
-
-	Spec=		0x80,
-
-	PF=		Spec|0x20,	/* num pad function key */
-	View=		Spec|0x00,	/* view (shift window up) */
-	KF=		0xF000,	/* function key (begin Unicode private space) */
-	Shift=		Spec|0x60,
-	Break=		Spec|0x61,
-	Ctrl=		Spec|0x62,
-	Latin=		Spec|0x63,
-	Caps=		Spec|0x64,
-	Num=		Spec|0x65,
-	Middle=		Spec|0x66,
-	No=		0x00,		/* peter */
-
-	Home=		KF|13,
-	Up=		KF|14,
-	Pgup=		KF|15,
-	Print=		KF|16,
-	Left=		KF|17,
-	Right=		KF|18,
-	End=		'\r',
-	Down=		View,
-	Pgdown=		KF|19,
-	Ins=		KF|20,
-	Del=		0x7F,
-	Scroll=		KF|21,
-};
-
-/*
- * The codes at 0x79 and 0x81 are produed by the PFU Happy Hacking keyboard.
- * A 'standard' keyboard doesn't produce anything above 0x58.
- */
-Rune kbtab[] = 
-{
-[0x00]	No,	0x1b,	'1',	'2',	'3',	'4',	'5',	'6',
-[0x08]	'7',	'8',	'9',	'0',	'-',	'=',	'\b',	'\t',
-[0x10]	'q',	'w',	'e',	'r',	't',	'y',	'u',	'i',
-[0x18]	'o',	'p',	'[',	']',	'\n',	Ctrl,	'a',	's',
-[0x20]	'd',	'f',	'g',	'h',	'j',	'k',	'l',	';',
-[0x28]	'\'',	'`',	Shift,	'\\',	'z',	'x',	'c',	'v',
-[0x30]	'b',	'n',	'm',	',',	'.',	'/',	Shift,	'*',
-[0x38]	Latin,	' ',	Ctrl,	KF|1,	KF|2,	KF|3,	KF|4,	KF|5,
-[0x40]	KF|6,	KF|7,	KF|8,	KF|9,	KF|10,	Num,	Scroll,	'7',
-[0x48]	'8',	'9',	'-',	'4',	'5',	'6',	'+',	'1',
-[0x50]	'2',	'3',	'0',	'.',	No,	No,	No,	KF|11,
-[0x58]	KF|12,	No,	No,	No,	No,	No,	No,	No,
-[0x60]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x68]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x70]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x78]	No,	View,	No,	Up,	No,	No,	No,	No,
-};
-
-Rune kbtabshift[] =
-{
-[0x00]	No,	0x1b,	'!',	'@',	'#',	'$',	'%',	'^',
-[0x08]	'&',	'*',	'(',	')',	'_',	'+',	'\b',	'\t',
-[0x10]	'Q',	'W',	'E',	'R',	'T',	'Y',	'U',	'I',
-[0x18]	'O',	'P',	'{',	'}',	'\n',	Ctrl,	'A',	'S',
-[0x20]	'D',	'F',	'G',	'H',	'J',	'K',	'L',	':',
-[0x28]	'"',	'~',	Shift,	'|',	'Z',	'X',	'C',	'V',
-[0x30]	'B',	'N',	'M',	'<',	'>',	'?',	Shift,	'*',
-[0x38]	Latin,	' ',	Ctrl,	KF|1,	KF|2,	KF|3,	KF|4,	KF|5,
-[0x40]	KF|6,	KF|7,	KF|8,	KF|9,	KF|10,	Num,	Scroll,	'7',
-[0x48]	'8',	'9',	'-',	'4',	'5',	'6',	'+',	'1',
-[0x50]	'2',	'3',	'0',	'.',	No,	No,	No,	KF|11,
-[0x58]	KF|12,	No,	No,	No,	No,	No,	No,	No,
-[0x60]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x68]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x70]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x78]	No,	Up,	No,	Up,	No,	No,	No,	No,
-};
-
-Rune kbtabesc1[] =
-{
-[0x00]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x08]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x10]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x18]	No,	No,	No,	No,	'\n',	Ctrl,	No,	No,
-[0x20]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x28]	No,	No,	Shift,	No,	No,	No,	No,	No,
-[0x30]	No,	No,	No,	No,	No,	'/',	No,	Print,
-[0x38]	Latin,	No,	No,	No,	No,	No,	No,	No,
-[0x40]	No,	No,	No,	No,	No,	No,	Break,	Home,
-[0x48]	Up,	Pgup,	No,	Left,	No,	Right,	No,	End,
-[0x50]	Down,	Pgdown,	Ins,	Del,	No,	No,	No,	No,
-[0x58]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x60]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x68]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x70]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x78]	No,	Up,	No,	No,	No,	No,	No,	No,
-};
-
-enum
-{
-	/* controller command byte */
-	Cscs1=		(1<<6),		/* scan code set 1 */
-	Cauxdis=	(1<<5),		/* mouse disable */
-	Ckbddis=	(1<<4),		/* kbd disable */
-	Csf=		(1<<2),		/* system flag */
-	Cauxint=	(1<<1),		/* mouse interrupt enable */
-	Ckbdint=	(1<<0),		/* kbd interrupt enable */
-};
-
-static Lock i8042lock;
-static uchar ccc;
-static void (*auxputc)(int, int);
-
-/*
- *  wait for output no longer busy
- */
-static int
-outready(void)
-{
-	int tries;
-
-	for(tries = 0; (inb(Status) & Outbusy); tries++){
-		if(tries > 500)
-			return -1;
-		delay(2);
-	}
-	return 0;
-}
-
-/*
- *  wait for input
- */
-static int
-inready(void)
-{
-	int tries;
-
-	for(tries = 0; !(inb(Status) & Inready); tries++){
-		if(tries > 500)
-			return -1;
-		delay(2);
-	}
-	return 0;
-}
-
-/*
- *  ask 8042 to reset the machine
- */
-void
-i8042reset(void)
-{
-	ushort *s = KADDR(0x472);
-	int i, x;
-
-	*s = 0x1234;		/* BIOS warm-boot flag */
-
-	/*
-	 *  newer reset the machine command
-	 */
-	outready();
-	outb(Cmd, 0xFE);
-	outready();
-
-	/*
-	 *  Pulse it by hand (old somewhat reliable)
-	 */
-	x = 0xDF;
-	for(i = 0; i < 5; i++){
-		x ^= 1;
-		outready();
-		outb(Cmd, 0xD1);
-		outready();
-		outb(Data, x);	/* toggle reset */
-		delay(100);
-	}
-}
-
-int
-i8042auxcmd(int cmd)
-{
-	unsigned int c;
-	int tries;
-
-	c = 0;
-	tries = 0;
-
-	ilock(&i8042lock);
-	do{
-		if(tries++ > 2)
-			break;
-		if(outready() < 0)
-			break;
-		outb(Cmd, 0xD4);
-		if(outready() < 0)
-			break;
-		outb(Data, cmd);
-		if(outready() < 0)
-			break;
-		if(inready() < 0)
-			break;
-		c = inb(Data);
-	} while(c == 0xFE || c == 0);
-	iunlock(&i8042lock);
-
-	if(c != 0xFA){
-		print("i8042: %2.2ux returned to the %2.2ux command\n", c, cmd);
-		return -1;
-	}
-	return 0;
-}
-
-/*
- *  keyboard interrupt
- */
-static void
-i8042intr(Ureg*, void*)
-{
-	int s, c, i;
-	static int esc1, esc2;
-	static int alt, caps, ctl, num, shift;
-	static int collecting, nk;
-	static Rune kc[5];
-	int keyup;
-
-	/*
-	 *  get status
-	 */
-	lock(&i8042lock);
-	s = inb(Status);
-	if(!(s&Inready)){
-		unlock(&i8042lock);
-		return;
-	}
-
-	/*
-	 *  get the character
-	 */
-	c = inb(Data);
-	unlock(&i8042lock);
-
-	/*
-	 *  if it's the aux port...
-	 */
-	if(s & Minready){
-		if(auxputc != nil)
-			auxputc(c, shift);
-		return;
-	}
-
-	/*
-	 *  e0's is the first of a 2 character sequence
-	 */
-	if(c == 0xe0){
-		esc1 = 1;
-		return;
-	} else if(c == 0xe1){
-		esc2 = 2;
-		return;
-	}
-
-	keyup = c&0x80;
-	c &= 0x7f;
-	if(c > sizeof kbtab){
-		c |= keyup;
-		if(c != 0xFF)	/* these come fairly often: CAPSLOCK U Y */
-			print("unknown key %ux\n", c);
-		return;
-	}
-
-	if(esc1){
-		c = kbtabesc1[c];
-		esc1 = 0;
-	} else if(esc2){
-		esc2--;
-		return;
-	} else if(shift)
-		c = kbtabshift[c];
-	else
-		c = kbtab[c];
-
-	if(caps && c<='z' && c>='a')
-		c += 'A' - 'a';
-
-	/*
-	 *  keyup only important for shifts
-	 */
-	if(keyup){
-		switch(c){
-		case Latin:
-			alt = 0;
-			break;
-		case Shift:
-			shift = 0;
-			break;
-		case Ctrl:
-			ctl = 0;
-			break;
-		}
-		return;
-	}
-
-	/*
- 	 *  normal character
-	 */
-	if(!(c & (Spec|KF))){
-		if(ctl){
-			if(alt && c == Del)
-				exit(0);
-			c &= 0x1f;
-		}
-		if(!collecting){
-			kbdputc(kbdq, c);
-			return;
-		}
-		kc[nk++] = c;
-		c = latin1(kc, nk);
-		if(c < -1)	/* need more keystrokes */
-			return;
-		if(c != -1)	/* valid sequence */
-			kbdputc(kbdq, c);
-		else	/* dump characters */
-			for(i=0; i<nk; i++)
-				kbdputc(kbdq, kc[i]);
-		nk = 0;
-		collecting = 0;
-		return;
-	} else {
-		switch(c){
-		case Caps:
-			caps ^= 1;
-			return;
-		case Num:
-			num ^= 1;
-			return;
-		case Shift:
-			shift = 1;
-			return;
-		case Latin:
-			alt = 1;
-			collecting = 1;
-			nk = 0;
-			return;
-		case Ctrl:
-			ctl = 1;
-			return;
-		}
-	}
-	kbdputc(kbdq, c);
-}
-
-void
-i8042auxenable(void (*putc)(int, int))
-{
-	char *err = "i8042: aux init failed\n";
-
-	/* enable kbd/aux xfers and interrupts */
-	ccc &= ~Cauxdis;
-	ccc |= Cauxint;
-
-	ilock(&i8042lock);
-	if(outready() < 0)
-		print(err);
-	outb(Cmd, 0x60);			/* write control register */
-	if(outready() < 0)
-		print(err);
-	outb(Data, ccc);
-	if(outready() < 0)
-		print(err);
-	outb(Cmd, 0xA8);			/* auxilliary device enable */
-	if(outready() < 0){
-		iunlock(&i8042lock);
-		return;
-	}
-	auxputc = putc;
-	intrenable(IrqAUX, i8042intr, 0, BUSUNKNOWN, "kbdaux");
-	iunlock(&i8042lock);
-}
-
-void
-kbdinit(void)
-{
-	int c;
-
-	kbdq = qopen(4*1024, 0, 0, 0);
-	if(kbdq == nil)
-		panic("kbdinit");
-	qnoblock(kbdq, 1);
-
-	ioalloc(Data, 1, 0, "kbd");
-	ioalloc(Cmd, 1, 0, "kbd");
-
-	intrenable(IrqKBD, i8042intr, 0, BUSUNKNOWN, "kbd");
-
-	/* wait for a quiescent controller */
-	while((c = inb(Status)) & (Outbusy | Inready))
-		if(c & Inready)
-			inb(Data);
-
-	/* get current controller command byte */
-	outb(Cmd, 0x20);
-	if(inready() < 0){
-		print("kbdinit: can't read ccc\n");
-		ccc = 0;
-	} else
-		ccc = inb(Data);
-
-	/* enable kbd xfers and interrupts */
-	/* disable mouse */
-	ccc &= ~Ckbddis;
-	ccc |= Csf | Ckbdint | Cscs1;
-	if(outready() < 0)
-		print("kbd init failed\n");
-	outb(Cmd, 0x60);
-	if(outready() < 0)
-		print("kbd init failed\n");
-	outb(Data, ccc);
-	outready();
-}
--- a/sys/src/9/mtx/main.c
+++ b/sys/src/9/mtx/main.c
@@ -29,7 +29,6 @@
 	mmuinit();
 	hwintrinit();
 	clockinit();
-	kbdinit();
 	procinit0();
 	initseg();
 	timersinit();
--- a/sys/src/9/mtx/mkfile
+++ b/sys/src/9/mtx/mkfile
@@ -17,7 +17,6 @@
 	dev.$O\
 	edf.$O\
 	fault.$O\
-	latin1.$O\
 	log.$O\
 	mul64fract.$O\
 	rebootcmd.$O\
@@ -43,7 +42,6 @@
 	inb.$O\
 	clock.$O\
 	i8259.$O\
-	kbd.$O\
 	main.$O\
 	mmu.$O\
 	random.$O\
--- a/sys/src/9/omap/archomap.c
+++ b/sys/src/9/omap/archomap.c
@@ -1282,11 +1282,6 @@
 }
 
 void
-kbdinit(void)
-{
-}
-
-void
 lastresortprint(char *buf, long bp)
 {
 	iprint("%.*s", (int)bp, buf);	/* nothing else seems to work */
--- a/sys/src/9/omap/beagle
+++ b/sys/src/9/omap/beagle
@@ -25,8 +25,6 @@
 
 	draw		screen
 	dss
-	kbmap
-	kbin
 	mouse
 
 	uart
@@ -73,10 +71,11 @@
 
 boot cpu
 	tcp
+	local
 
 bootdir
 	boot$CONF.out boot
-	/arm/bin/ip/ipconfig ipconfig
-	/arm/bin/auth/factotum factotum
-	/arm/bin/usb/usbd
-	nvram
+	/arm/bin/bzfs
+	/arm/bin/mntgen
+	/arm/bin/auth/factotum
+	rootfs.bz2
--- a/sys/src/9/omap/devcons.c
+++ /dev/null
@@ -1,1354 +1,0 @@
-#include	"u.h"
-#include	"../port/lib.h"
-#include	"mem.h"
-#include	"dat.h"
-#include	"fns.h"
-#include	"../port/error.h"
-#include	"pool.h"
-#include	<authsrv.h>
-
-void	(*consdebug)(void) = nil;
-void	(*screenputs)(char*, int) = nil;
-
-Queue*	kbdq;			/* unprocessed console input */
-Queue*	lineq;			/* processed console input */
-Queue*	serialoq;		/* serial console output */
-Queue*	kprintoq;		/* console output, for /dev/kprint */
-ulong	kprintinuse;		/* test and set whether /dev/kprint is open */
-int	iprintscreenputs = 1;
-
-int	panicking;
-
-static struct
-{
-	QLock;
-
-	int	raw;		/* true if we shouldn't process input */
-	Ref	ctl;		/* number of opens to the control file */
-	int	x;		/* index into line */
-	char	line[1024];	/* current input line */
-
-	int	count;
-	int	ctlpoff;
-
-	/* a place to save up characters at interrupt time before dumping them in the queue */
-	Lock	lockputc;
-	char	istage[1024];
-	char	*iw;
-	char	*ir;
-	char	*ie;
-} kbd = {
-	.iw	= kbd.istage,
-	.ir	= kbd.istage,
-	.ie	= kbd.istage + sizeof(kbd.istage),
-};
-
-char	*sysname;
-vlong	fasthz;
-
-static void	seedrand(void);
-static int	readtime(ulong, char*, int);
-static int	readbintime(char*, int);
-static int	writetime(char*, int);
-static int	writebintime(char*, int);
-
-enum
-{
-	CMhalt,
-	CMreboot,
-	CMpanic,
-};
-
-Cmdtab rebootmsg[] =
-{
-	CMhalt,		"halt",		1,
-	CMreboot,	"reboot",	0,
-	CMpanic,	"panic",	0,
-};
-
-void
-printinit(void)
-{
-	lineq = qopen(2*1024, 0, nil, nil);
-	if(lineq == nil)
-		panic("printinit");
-	qnoblock(lineq, 1);
-}
-
-int
-consactive(void)
-{
-	if(serialoq)
-		return qlen(serialoq) > 0;
-	return 0;
-}
-
-void
-prflush(void)
-{
-	ulong now;
-
-	now = m->ticks;
-	while(consactive())
-		if(m->ticks - now >= HZ)
-			break;
-}
-
-/*
- * Log console output so it can be retrieved via /dev/kmesg.
- * This is good for catching boot-time messages after the fact.
- */
-struct {
-	Lock lk;
-//	char buf[16384];		/* normal */
-	char buf[256*1024];		/* for acpi debugging */
-	uint n;
-} kmesg;
-
-static void
-kmesgputs(char *str, int n)
-{
-	uint nn, d;
-
-	ilock(&kmesg.lk);
-	/* take the tail of huge writes */
-	if(n > sizeof kmesg.buf){
-		d = n - sizeof kmesg.buf;
-		str += d;
-		n -= d;
-	}
-
-	/* slide the buffer down to make room */
-	nn = kmesg.n;
-	if(nn + n >= sizeof kmesg.buf){
-		d = nn + n - sizeof kmesg.buf;
-		if(d)
-			memmove(kmesg.buf, kmesg.buf+d, sizeof kmesg.buf-d);
-		nn -= d;
-	}
-
-	/* copy the data in */
-	memmove(kmesg.buf+nn, str, n);
-	nn += n;
-	kmesg.n = nn;
-	iunlock(&kmesg.lk);
-}
-
-/*
- *   Print a string on the console.  Convert \n to \r\n for serial
- *   line consoles.  Locking of the queues is left up to the screen
- *   or uart code.  Multi-line messages to serial consoles may get
- *   interspersed with other messages.
- */
-static void
-putstrn0(char *str, int n, int usewrite)
-{
-	int m;
-	char *t;
-
-	if(!islo())
-		usewrite = 0;
-
-	/*
-	 *  how many different output devices do we need?
-	 */
-	kmesgputs(str, n);
-
-	/*
-	 *  if someone is reading /dev/kprint,
-	 *  put the message there.
-	 *  if not and there's an attached bit mapped display,
-	 *  put the message there.
-	 *
-	 *  if there's a serial line being used as a console,
-	 *  put the message there.
-	 */
-	if(kprintoq != nil && !qisclosed(kprintoq)){
-		if(usewrite)
-			qwrite(kprintoq, str, n);
-		else
-			qiwrite(kprintoq, str, n);
-	}else if(screenputs != nil)
-		screenputs(str, n);
-
-	if(serialoq == nil){
-		uartputs(str, n);
-		return;
-	}
-
-	while(n > 0) {
-		t = memchr(str, '\n', n);
-		if(t && !kbd.raw) {
-			m = t-str;
-			if(usewrite){
-				qwrite(serialoq, str, m);
-				qwrite(serialoq, "\r\n", 2);
-			} else {
-				qiwrite(serialoq, str, m);
-				qiwrite(serialoq, "\r\n", 2);
-			}
-			n -= m+1;
-			str = t+1;
-		} else {
-			if(usewrite)
-				qwrite(serialoq, str, n);
-			else
-				qiwrite(serialoq, str, n);
-			break;
-		}
-	}
-}
-
-void
-putstrn(char *str, int n)
-{
-	putstrn0(str, n, 0);
-}
-
-int noprint;
-
-int
-print(char *fmt, ...)
-{
-	int n;
-	va_list arg;
-	char buf[PRINTSIZE];
-
-	if(noprint)
-		return -1;
-
-	va_start(arg, fmt);
-	n = vseprint(buf, buf+sizeof(buf), fmt, arg) - buf;
-	va_end(arg);
-
-	if(!normalprint) {
-		if(0) iprint("\nprint called too early from %#lux\n",
-			getcallerpc(&fmt));
-		iprint("%.*s", n, buf);
-	} else
-		putstrn(buf, n);
-
-	return n;
-}
-
-/*
- * Want to interlock iprints to avoid interlaced output on 
- * multiprocessor, but don't want to deadlock if one processor
- * dies during print and another has something important to say.
- * Make a good faith effort.
- */
-static Lock iprintlock;
-static int
-iprintcanlock(Lock *l)
-{
-	int i;
-	
-	for(i=0; i<1000; i++){
-		if(canlock(l))
-			return 1;
-		if(l->m == MACHP(m->machno))
-			return 0;
-		microdelay(100);
-	}
-	return 0;
-}
-
-int
-iprint(char *fmt, ...)
-{
-	int n, s, locked;
-	va_list arg;
-	char buf[PRINTSIZE];
-
-	s = splhi();
-	va_start(arg, fmt);
-	n = vseprint(buf, buf+sizeof(buf), fmt, arg) - buf;
-	va_end(arg);
-	locked = iprintcanlock(&iprintlock);
-	if(screenputs != nil && iprintscreenputs)
-		screenputs(buf, n);
-	if(consuart == nil || consuart->phys == nil ||
-	    consuart->phys->putc == nil)
-		_uartputs(buf, n);
-	else
-		uartputs(buf, n);
-	if(locked)
-		unlock(&iprintlock);
-	splx(s);
-
-	return n;
-}
-
-void
-panic(char *fmt, ...)
-{
-	int n, s;
-	va_list arg;
-	char buf[PRINTSIZE];
-
-	kprintoq = nil;	/* don't try to write to /dev/kprint */
-
-	if(panicking)
-		for(;;);
-	panicking = 1;
-
-	delay(20);
-	s = splhi();
-	strcpy(buf, "panic: ");
-	va_start(arg, fmt);
-	n = vseprint(buf+strlen(buf), buf+sizeof(buf), fmt, arg) - buf;
-	va_end(arg);
-	iprint("%s\n", buf);
-	if(consdebug)
-		(*consdebug)();
-	splx(s);
-	prflush();
-	buf[n] = '\n';
-//	putstrn(buf, n+1);
-//	dumpstack();
-
-	exit(1);
-}
-
-/* libmp at least contains a few calls to sysfatal; simulate with panic */
-void
-sysfatal(char *fmt, ...)
-{
-	char err[256];
-	va_list arg;
-
-	va_start(arg, fmt);
-	vseprint(err, err + sizeof err, fmt, arg);
-	va_end(arg);
-	panic("sysfatal: %s", err);
-}
-
-void
-_assert(char *fmt)
-{
-	panic("assert failed at %#p: %s", getcallerpc(&fmt), fmt);
-}
-
-int
-pprint(char *fmt, ...)
-{
-	int n;
-	Chan *c;
-	va_list arg;
-	char buf[2*PRINTSIZE];
-
-	if(up == nil || up->fgrp == nil)
-		return 0;
-
-	c = up->fgrp->fd[2];
-	if(c==0 || (c->mode!=OWRITE && c->mode!=ORDWR))
-		return 0;
-	n = snprint(buf, sizeof buf, "%s %lud: ", up->text, up->pid);
-	va_start(arg, fmt);
-	n = vseprint(buf+n, buf+sizeof(buf), fmt, arg) - buf;
-	va_end(arg);
-
-	if(waserror())
-		return 0;
-	devtab[c->type]->write(c, buf, n, c->offset);
-	poperror();
-
-	lock(c);
-	c->offset += n;
-	unlock(c);
-
-	return n;
-}
-
-static void
-echoscreen(char *buf, int n)
-{
-	char *e, *p;
-	char ebuf[128];
-	int x;
-
-	p = ebuf;
-	e = ebuf + sizeof(ebuf) - 4;
-	while(n-- > 0){
-		if(p >= e){
-			screenputs(ebuf, p - ebuf);
-			p = ebuf;
-		}
-		x = *buf++;
-		if(x == 0x15){
-			*p++ = '^';
-			*p++ = 'U';
-			*p++ = '\n';
-		} else
-			*p++ = x;
-	}
-	if(p != ebuf)
-		screenputs(ebuf, p - ebuf);
-}
-
-static void
-echoserialoq(char *buf, int n)
-{
-	int x;
-	char *e, *p;
-	char ebuf[128];
-
-	p = ebuf;
-	e = ebuf + sizeof(ebuf) - 4;
-	while(n-- > 0){
-		if(p >= e){
-			qiwrite(serialoq, ebuf, p - ebuf);
-			p = ebuf;
-		}
-		x = *buf++;
-		if(x == '\n'){
-			*p++ = '\r';
-			*p++ = '\n';
-		} else if(x == 0x15){
-			*p++ = '^';
-			*p++ = 'U';
-			*p++ = '\n';
-		} else
-			*p++ = x;
-	}
-	if(p != ebuf)
-		qiwrite(serialoq, ebuf, p - ebuf);
-}
-
-static void
-echo(char *buf, int n)
-{
-	static int ctrlt, pid;
-	int x;
-	char *e, *p;
-
-	if(n == 0)
-		return;
-
-	e = buf+n;
-	for(p = buf; p < e; p++){
-		switch(*p){
-		case 0x10:	/* ^P */
-			if(cpuserver && !kbd.ctlpoff){
-				active.exiting = 1;
-				return;
-			}
-			break;
-		case 0x14:	/* ^T */
-			ctrlt++;
-			if(ctrlt > 2)
-				ctrlt = 2;
-			continue;
-		}
-
-		if(ctrlt != 2)
-			continue;
-
-		/* ^T escapes */
-		ctrlt = 0;
-		switch(*p){
-		case 'S':
-			x = splhi();
-			dumpstack();
-			procdump();
-			splx(x);
-			return;
-		case 's':
-			dumpstack();
-			return;
-		case 'x':
-			xsummary();
-			ixsummary();
-			mallocsummary();
-		//	memorysummary();
-			pagersummary();
-			return;
-		case 'd':
-			if(consdebug == nil)
-				consdebug = rdb;
-			else
-				consdebug = nil;
-			print("consdebug now %#p\n", consdebug);
-			return;
-		case 'D':
-			if(consdebug == nil)
-				consdebug = rdb;
-			consdebug();
-			return;
-		case 'p':
-			x = spllo();
-			procdump();
-			splx(x);
-			return;
-		case 'q':
-			scheddump();
-			return;
-		case 'k':
-			killbig("^t ^t k");
-			return;
-		case 'r':
-			exit(0);
-			return;
-		}
-	}
-
-	qproduce(kbdq, buf, n);
-	if(kbd.raw)
-		return;
-	kmesgputs(buf, n);
-	if(screenputs != nil)
-		echoscreen(buf, n);
-	if(serialoq)
-		echoserialoq(buf, n);
-}
-
-/*
- *  Called by a uart interrupt for console input.
- *
- *  turn '\r' into '\n' before putting it into the queue.
- */
-int
-kbdcr2nl(Queue*, int ch)
-{
-	char *next;
-
-	ilock(&kbd.lockputc);		/* just a mutex */
-	if(ch == '\r' && !kbd.raw)
-		ch = '\n';
-	next = kbd.iw+1;
-	if(next >= kbd.ie)
-		next = kbd.istage;
-	if(next != kbd.ir){
-		*kbd.iw = ch;
-		kbd.iw = next;
-	}
-	iunlock(&kbd.lockputc);
-	return 0;
-}
-
-/*
- *  Put character, possibly a rune, into read queue at interrupt time.
- *  Called at interrupt time to process a character.
- */
-int
-kbdputc(Queue*, int ch)
-{
-	int i, n;
-	char buf[3];
-	Rune r;
-	char *next;
-
-	if(kbd.ir == nil)
-		return 0;		/* in case we're not inited yet */
-	
-	ilock(&kbd.lockputc);		/* just a mutex */
-	r = ch;
-	n = runetochar(buf, &r);
-	for(i = 0; i < n; i++){
-		next = kbd.iw+1;
-		if(next >= kbd.ie)
-			next = kbd.istage;
-		if(next == kbd.ir)
-			break;
-		*kbd.iw = buf[i];
-		kbd.iw = next;
-	}
-	iunlock(&kbd.lockputc);
-	return 0;
-}
-
-/*
- *  we save up input characters till clock time to reduce
- *  per character interrupt overhead.
- */
-static void
-kbdputcclock(void)
-{
-	char *iw;
-
-	/* this amortizes cost of qproduce */
-	if(kbd.iw != kbd.ir){
-		iw = kbd.iw;
-		if(iw < kbd.ir){
-			echo(kbd.ir, kbd.ie-kbd.ir);
-			kbd.ir = kbd.istage;
-		}
-		if(kbd.ir != iw){
-			echo(kbd.ir, iw-kbd.ir);
-			kbd.ir = iw;
-		}
-	}
-}
-
-enum{
-	Qdir,
-	Qbintime,
-	Qcons,
-	Qconsctl,
-	Qcputime,
-	Qdrivers,
-	Qkmesg,
-	Qkprint,
-	Qhostdomain,
-	Qhostowner,
-	Qnull,
-	Qosversion,
-	Qpgrpid,
-	Qpid,
-	Qppid,
-	Qrandom,
-	Qreboot,
-	Qswap,
-	Qsysname,
-	Qsysstat,
-	Qtime,
-	Quser,
-	Qzero,
-};
-
-enum
-{
-	VLNUMSIZE=	22,
-};
-
-static Dirtab consdir[]={
-	".",	{Qdir, 0, QTDIR},	0,		DMDIR|0555,
-	"bintime",	{Qbintime},	24,		0664,
-	"cons",		{Qcons},	0,		0660,
-	"consctl",	{Qconsctl},	0,		0220,
-	"cputime",	{Qcputime},	6*NUMSIZE,	0444,
-	"drivers",	{Qdrivers},	0,		0444,
-	"hostdomain",	{Qhostdomain},	DOMLEN,		0664,
-	"hostowner",	{Qhostowner},	0,		0664,
-	"kmesg",	{Qkmesg},	0,		0440,
-	"kprint",	{Qkprint, 0, QTEXCL},	0,	DMEXCL|0440,
-	"null",		{Qnull},	0,		0666,
-	"osversion",	{Qosversion},	0,		0444,
-	"pgrpid",	{Qpgrpid},	NUMSIZE,	0444,
-	"pid",		{Qpid},		NUMSIZE,	0444,
-	"ppid",		{Qppid},	NUMSIZE,	0444,
-	"random",	{Qrandom},	0,		0444,
-	"reboot",	{Qreboot},	0,		0664,
-	"swap",		{Qswap},	0,		0664,
-	"sysname",	{Qsysname},	0,		0664,
-	"sysstat",	{Qsysstat},	0,		0666,
-	"time",		{Qtime},	NUMSIZE+3*VLNUMSIZE,	0664,
-	"user",		{Quser},	0,		0666,
-	"zero",		{Qzero},	0,		0444,
-};
-
-int
-readnum(ulong off, char *buf, ulong n, ulong val, int size)
-{
-	char tmp[64];
-
-	snprint(tmp, sizeof(tmp), "%*lud", size-1, val);
-	tmp[size-1] = ' ';
-	if(off >= size)
-		return 0;
-	if(off+n > size)
-		n = size-off;
-	memmove(buf, tmp+off, n);
-	return n;
-}
-
-int
-readstr(ulong off, char *buf, ulong n, char *str)
-{
-	int size;
-
-	size = strlen(str);
-	if(off >= size)
-		return 0;
-	if(off+n > size)
-		n = size-off;
-	memmove(buf, str+off, n);
-	return n;
-}
-
-static void
-consinit(void)
-{
-	todinit();
-	randominit();
-	/*
-	 * at 115200 baud, the 1024 char buffer takes 56 ms to process,
-	 * processing it every 22 ms should be fine
-	 */
-	addclock0link(kbdputcclock, 22);
-}
-
-static Chan*
-consattach(char *spec)
-{
-	return devattach('c', spec);
-}
-
-static Walkqid*
-conswalk(Chan *c, Chan *nc, char **name, int nname)
-{
-	return devwalk(c, nc, name,nname, consdir, nelem(consdir), devgen);
-}
-
-static int
-consstat(Chan *c, uchar *dp, int n)
-{
-	return devstat(c, dp, n, consdir, nelem(consdir), devgen);
-}
-
-static Chan*
-consopen(Chan *c, int omode)
-{
-	c->aux = nil;
-	c = devopen(c, omode, consdir, nelem(consdir), devgen);
-	switch((ulong)c->qid.path){
-	case Qconsctl:
-		incref(&kbd.ctl);
-		break;
-
-	case Qkprint:
-		if(tas(&kprintinuse) != 0){
-			c->flag &= ~COPEN;
-			error(Einuse);
-		}
-		if(kprintoq == nil){
-			kprintoq = qopen(8*1024, Qcoalesce, 0, 0);
-			if(kprintoq == nil){
-				c->flag &= ~COPEN;
-				error(Enomem);
-			}
-			qnoblock(kprintoq, 1);
-		}else
-			qreopen(kprintoq);
-		c->iounit = qiomaxatomic;
-		break;
-	}
-	return c;
-}
-
-static void
-consclose(Chan *c)
-{
-	switch((ulong)c->qid.path){
-	/* last close of control file turns off raw */
-	case Qconsctl:
-		if(c->flag&COPEN){
-			if(decref(&kbd.ctl) == 0)
-				kbd.raw = 0;
-		}
-		break;
-
-	/* close of kprint allows other opens */
-	case Qkprint:
-		if(c->flag & COPEN){
-			kprintinuse = 0;
-			qhangup(kprintoq, nil);
-		}
-		break;
-	}
-}
-
-static long
-consread(Chan *c, void *buf, long n, vlong off)
-{
-	ulong l;
-	Mach *mp;
-	char *b, *bp, ch;
-	char tmp[256];		/* must be >= 18*NUMSIZE (Qswap) */
-	int i, k, id, send;
-	vlong offset = off;
-
-	if(n <= 0)
-		return n;
-
-	switch((ulong)c->qid.path){
-	case Qdir:
-		return devdirread(c, buf, n, consdir, nelem(consdir), devgen);
-
-	case Qcons:
-		qlock(&kbd);
-		if(waserror()) {
-			qunlock(&kbd);
-			nexterror();
-		}
-		while(!qcanread(lineq)){
-			if(qread(kbdq, &ch, 1) == 0)
-				continue;
-			send = 0;
-			if(ch == 0){
-				/* flush output on rawoff -> rawon */
-				if(kbd.x > 0)
-					send = !qcanread(kbdq);
-			}else if(kbd.raw){
-				kbd.line[kbd.x++] = ch;
-				send = !qcanread(kbdq);
-			}else{
-				switch(ch){
-				case '\b':
-					if(kbd.x > 0)
-						kbd.x--;
-					break;
-				case 0x15:	/* ^U */
-					kbd.x = 0;
-					break;
-				case '\n':
-				case 0x04:	/* ^D */
-					send = 1;
-				default:
-					if(ch != 0x04)
-						kbd.line[kbd.x++] = ch;
-					break;
-				}
-			}
-			if(send || kbd.x == sizeof kbd.line){
-				qwrite(lineq, kbd.line, kbd.x);
-				kbd.x = 0;
-			}
-		}
-		n = qread(lineq, buf, n);
-		qunlock(&kbd);
-		poperror();
-		return n;
-
-	case Qcputime:
-		k = offset;
-		if(k >= 6*NUMSIZE)
-			return 0;
-		if(k+n > 6*NUMSIZE)
-			n = 6*NUMSIZE - k;
-		/* easiest to format in a separate buffer and copy out */
-		for(i=0; i<6 && NUMSIZE*i<k+n; i++){
-			l = up->time[i];
-			if(i == TReal)
-				l = MACHP(0)->ticks - l;
-			l = TK2MS(l);
-			readnum(0, tmp+NUMSIZE*i, NUMSIZE, l, NUMSIZE);
-		}
-		memmove(buf, tmp+k, n);
-		return n;
-
-	case Qkmesg:
-		/*
-		 * This is unlocked to avoid tying up a process
-		 * that's writing to the buffer.  kmesg.n never 
-		 * gets smaller, so worst case the reader will
-		 * see a slurred buffer.
-		 */
-		if(off >= kmesg.n)
-			n = 0;
-		else{
-			if(off+n > kmesg.n)
-				n = kmesg.n - off;
-			memmove(buf, kmesg.buf+off, n);
-		}
-		return n;
-		
-	case Qkprint:
-		return qread(kprintoq, buf, n);
-
-	case Qpgrpid:
-		return readnum((ulong)offset, buf, n, up->pgrp->pgrpid, NUMSIZE);
-
-	case Qpid:
-		return readnum((ulong)offset, buf, n, up->pid, NUMSIZE);
-
-	case Qppid:
-		return readnum((ulong)offset, buf, n, up->parentpid, NUMSIZE);
-
-	case Qtime:
-		return readtime((ulong)offset, buf, n);
-
-	case Qbintime:
-		return readbintime(buf, n);
-
-	case Qhostowner:
-		return readstr((ulong)offset, buf, n, eve);
-
-	case Qhostdomain:
-		return readstr((ulong)offset, buf, n, hostdomain);
-
-	case Quser:
-		return readstr((ulong)offset, buf, n, up->user);
-
-	case Qnull:
-		return 0;
-
-	case Qsysstat:
-		b = smalloc(conf.nmach*(NUMSIZE*11+1) + 1);	/* +1 for NUL */
-		bp = b;
-		for(id = 0; id < 32; id++) {
-			if(active.machs & (1<<id)) {
-				mp = MACHP(id);
-				readnum(0, bp, NUMSIZE, id, NUMSIZE);
-				bp += NUMSIZE;
-				readnum(0, bp, NUMSIZE, mp->cs, NUMSIZE);
-				bp += NUMSIZE;
-				readnum(0, bp, NUMSIZE, mp->intr, NUMSIZE);
-				bp += NUMSIZE;
-				readnum(0, bp, NUMSIZE, mp->syscall, NUMSIZE);
-				bp += NUMSIZE;
-				readnum(0, bp, NUMSIZE, mp->pfault, NUMSIZE);
-				bp += NUMSIZE;
-				readnum(0, bp, NUMSIZE, mp->tlbfault, NUMSIZE);
-				bp += NUMSIZE;
-				readnum(0, bp, NUMSIZE, mp->tlbpurge, NUMSIZE);
-				bp += NUMSIZE;
-				readnum(0, bp, NUMSIZE, mp->load, NUMSIZE);
-				bp += NUMSIZE;
-				readnum(0, bp, NUMSIZE,
-					(mp->perf.avg_inidle*100)/mp->perf.period,
-					NUMSIZE);
-				bp += NUMSIZE;
-				readnum(0, bp, NUMSIZE,
-					(mp->perf.avg_inintr*100)/mp->perf.period,
-					NUMSIZE);
-				bp += NUMSIZE;
-				*bp++ = '\n';
-			}
-		}
-		if(waserror()){
-			free(b);
-			nexterror();
-		}
-		n = readstr((ulong)offset, buf, n, b);
-		free(b);
-		poperror();
-		return n;
-
-	case Qswap:
-		snprint(tmp, sizeof tmp,
-			"%lud memory\n"
-			"%d pagesize\n"
-			"%lud kernel\n"
-			"%lud/%lud user\n"
-			"%lud/%lud swap\n"
-			"%lud/%lud kernel malloc\n"
-			"%lud/%lud kernel draw\n",
-			conf.npage*BY2PG,
-			BY2PG,
-			conf.npage-conf.upages,
-			palloc.user-palloc.freecount, palloc.user,
-			conf.nswap-swapalloc.free, conf.nswap,
-			mainmem->cursize, mainmem->maxsize,
-			imagmem->cursize, imagmem->maxsize);
-
-		return readstr((ulong)offset, buf, n, tmp);
-
-	case Qsysname:
-		if(sysname == nil)
-			return 0;
-		return readstr((ulong)offset, buf, n, sysname);
-
-	case Qrandom:
-		return randomread(buf, n);
-
-	case Qdrivers:
-		b = malloc(READSTR);
-		if(b == nil)
-			error(Enomem);
-		k = 0;
-		for(i = 0; devtab[i] != nil; i++)
-			k += snprint(b+k, READSTR-k, "#%C %s\n",
-				devtab[i]->dc,  devtab[i]->name);
-		if(waserror()){
-			free(b);
-			nexterror();
-		}
-		n = readstr((ulong)offset, buf, n, b);
-		free(b);
-		poperror();
-		return n;
-
-	case Qzero:
-		memset(buf, 0, n);
-		return n;
-
-	case Qosversion:
-		snprint(tmp, sizeof tmp, "2000");
-		n = readstr((ulong)offset, buf, n, tmp);
-		return n;
-
-	default:
-		print("consread %#llux\n", c->qid.path);
-		error(Egreg);
-	}
-	return -1;		/* never reached */
-}
-
-static long
-conswrite(Chan *c, void *va, long n, vlong off)
-{
-	char buf[256], ch;
-	long l, bp;
-	char *a;
-	Mach *mp;
-	int id, fd;
-	Chan *swc;
-	ulong offset;
-	Cmdbuf *cb;
-	Cmdtab *ct;
-
-	a = va;
-	offset = off;
-
-	switch((ulong)c->qid.path){
-	case Qcons:
-		/*
-		 * Can't page fault in putstrn, so copy the data locally.
-		 */
-		l = n;
-		while(l > 0){
-			bp = l;
-			if(bp > sizeof buf)
-				bp = sizeof buf;
-			memmove(buf, a, bp);
-			putstrn0(buf, bp, 1);
-			a += bp;
-			l -= bp;
-		}
-		break;
-
-	case Qconsctl:
-		if(n >= sizeof(buf))
-			n = sizeof(buf)-1;
-		strncpy(buf, a, n);
-		buf[n] = 0;
-		for(a = buf; a;){
-			if(strncmp(a, "rawon", 5) == 0){
-				kbd.raw = 1;
-				/* clumsy hack - wake up reader */
-				ch = 0;
-				qwrite(kbdq, &ch, 1);			
-			} else if(strncmp(a, "rawoff", 6) == 0){
-				kbd.raw = 0;
-			} else if(strncmp(a, "ctlpon", 6) == 0){
-				kbd.ctlpoff = 0;
-			} else if(strncmp(a, "ctlpoff", 7) == 0){
-				kbd.ctlpoff = 1;
-			}
-			if(a = strchr(a, ' '))
-				a++;
-		}
-		break;
-
-	case Qtime:
-		if(!iseve())
-			error(Eperm);
-		return writetime(a, n);
-
-	case Qbintime:
-		if(!iseve())
-			error(Eperm);
-		return writebintime(a, n);
-
-	case Qhostowner:
-		return hostownerwrite(a, n);
-
-	case Qhostdomain:
-		return hostdomainwrite(a, n);
-
-	case Quser:
-		return userwrite(a, n);
-
-	case Qnull:
-		break;
-
-	case Qreboot:
-		if(!iseve())
-			error(Eperm);
-		cb = parsecmd(a, n);
-
-		if(waserror()) {
-			free(cb);
-			nexterror();
-		}
-		ct = lookupcmd(cb, rebootmsg, nelem(rebootmsg));
-		switch(ct->index) {
-		case CMhalt:
-			reboot(nil, 0, 0);
-			break;
-		case CMreboot:
-			rebootcmd(cb->nf-1, cb->f+1);
-			break;
-		case CMpanic:
-			*(ulong*)0=0;
-			panic("/dev/reboot");
-		}
-		poperror();
-		free(cb);
-		break;
-
-	case Qsysstat:
-		for(id = 0; id < 32; id++) {
-			if(active.machs & (1<<id)) {
-				mp = MACHP(id);
-				mp->cs = 0;
-				mp->intr = 0;
-				mp->syscall = 0;
-				mp->pfault = 0;
-				mp->tlbfault = 0;
-				mp->tlbpurge = 0;
-			}
-		}
-		break;
-
-	case Qswap:
-		if(n >= sizeof buf)
-			error(Egreg);
-		memmove(buf, va, n);	/* so we can NUL-terminate */
-		buf[n] = 0;
-		/* start a pager if not already started */
-		if(strncmp(buf, "start", 5) == 0){
-			kickpager();
-			break;
-		}
-		if(!iseve())
-			error(Eperm);
-		if(buf[0]<'0' || '9'<buf[0])
-			error(Ebadarg);
-		fd = strtoul(buf, 0, 0);
-		swc = fdtochan(fd, -1, 1, 1);
-		setswapchan(swc);
-		break;
-
-	case Qsysname:
-		if(offset != 0)
-			error(Ebadarg);
-		if(n <= 0 || n >= sizeof buf)
-			error(Ebadarg);
-		strncpy(buf, a, n);
-		buf[n] = 0;
-		if(buf[n-1] == '\n')
-			buf[n-1] = 0;
-		kstrdup(&sysname, buf);
-		break;
-
-	default:
-		print("conswrite: %#llux\n", c->qid.path);
-		error(Egreg);
-	}
-	return n;
-}
-
-Dev consdevtab = {
-	'c',
-	"cons",
-
-	devreset,
-	consinit,
-	devshutdown,
-	consattach,
-	conswalk,
-	consstat,
-	consopen,
-	devcreate,
-	consclose,
-	consread,
-	devbread,
-	conswrite,
-	devbwrite,
-	devremove,
-	devwstat,
-};
-
-static	ulong	randn;
-
-static void
-seedrand(void)
-{
-	if(!waserror()){
-		randomread((void*)&randn, sizeof(randn));
-		poperror();
-	}
-}
-
-int
-nrand(int n)
-{
-	if(randn == 0)
-		seedrand();
-	randn = randn*1103515245 + 12345 + MACHP(0)->ticks;
-	return (randn>>16) % n;
-}
-
-int
-rand(void)
-{
-	nrand(1);
-	return randn;
-}
-
-static uvlong uvorder = 0x0001020304050607ULL;
-
-static uchar*
-le2vlong(vlong *to, uchar *f)
-{
-	uchar *t, *o;
-	int i;
-
-	t = (uchar*)to;
-	o = (uchar*)&uvorder;
-	for(i = 0; i < sizeof(vlong); i++)
-		t[o[i]] = f[i];
-	return f+sizeof(vlong);
-}
-
-static uchar*
-vlong2le(uchar *t, vlong from)
-{
-	uchar *f, *o;
-	int i;
-
-	f = (uchar*)&from;
-	o = (uchar*)&uvorder;
-	for(i = 0; i < sizeof(vlong); i++)
-		t[i] = f[o[i]];
-	return t+sizeof(vlong);
-}
-
-static long order = 0x00010203;
-
-static uchar*
-le2long(long *to, uchar *f)
-{
-	uchar *t, *o;
-	int i;
-
-	t = (uchar*)to;
-	o = (uchar*)&order;
-	for(i = 0; i < sizeof(long); i++)
-		t[o[i]] = f[i];
-	return f+sizeof(long);
-}
-
-static uchar*
-long2le(uchar *t, long from)
-{
-	uchar *f, *o;
-	int i;
-
-	f = (uchar*)&from;
-	o = (uchar*)&order;
-	for(i = 0; i < sizeof(long); i++)
-		t[i] = f[o[i]];
-	return t+sizeof(long);
-}
-
-char *Ebadtimectl = "bad time control";
-
-/*
- *  like the old #c/time but with added info.  Return
- *
- *	secs	nanosecs	fastticks	fasthz
- */
-static int
-readtime(ulong off, char *buf, int n)
-{
-	vlong	nsec, ticks;
-	long sec;
-	char str[7*NUMSIZE];
-
-	nsec = todget(&ticks);
-	if(fasthz == 0LL)
-		fastticks((uvlong*)&fasthz);
-	sec = nsec/1000000000ULL;
-	snprint(str, sizeof(str), "%*lud %*llud %*llud %*llud ",
-		NUMSIZE-1, sec,
-		VLNUMSIZE-1, nsec,
-		VLNUMSIZE-1, ticks,
-		VLNUMSIZE-1, fasthz);
-	return readstr(off, buf, n, str);
-}
-
-/*
- *  set the time in seconds
- */
-static int
-writetime(char *buf, int n)
-{
-	char b[13];
-	long i;
-	vlong now;
-
-	if(n >= sizeof(b))
-		error(Ebadtimectl);
-	strncpy(b, buf, n);
-	b[n] = 0;
-	i = strtol(b, 0, 0);
-	if(i <= 0)
-		error(Ebadtimectl);
-	now = i*1000000000LL;
-	todset(now, 0, 0);
-	return n;
-}
-
-/*
- *  read binary time info.  all numbers are little endian.
- *  ticks and nsec are syncronized.
- */
-static int
-readbintime(char *buf, int n)
-{
-	int i;
-	vlong nsec, ticks;
-	uchar *b = (uchar*)buf;
-
-	i = 0;
-	if(fasthz == 0LL)
-		fastticks((uvlong*)&fasthz);
-	nsec = todget(&ticks);
-	if(n >= 3*sizeof(uvlong)){
-		vlong2le(b+2*sizeof(uvlong), fasthz);
-		i += sizeof(uvlong);
-	}
-	if(n >= 2*sizeof(uvlong)){
-		vlong2le(b+sizeof(uvlong), ticks);
-		i += sizeof(uvlong);
-	}
-	if(n >= 8){
-		vlong2le(b, nsec);
-		i += sizeof(vlong);
-	}
-	return i;
-}
-
-/*
- *  set any of the following
- *	- time in nsec
- *	- nsec trim applied over some seconds
- *	- clock frequency
- */
-static int
-writebintime(char *buf, int n)
-{
-	uchar *p;
-	vlong delta;
-	long period;
-
-	n--;
-	p = (uchar*)buf + 1;
-	switch(*buf){
-	case 'n':
-		if(n < sizeof(vlong))
-			error(Ebadtimectl);
-		le2vlong(&delta, p);
-		todset(delta, 0, 0);
-		break;
-	case 'd':
-		if(n < sizeof(vlong)+sizeof(long))
-			error(Ebadtimectl);
-		p = le2vlong(&delta, p);
-		le2long(&period, p);
-		todset(-1, delta, period);
-		break;
-	case 'f':
-		if(n < sizeof(uvlong))
-			error(Ebadtimectl);
-		le2vlong(&fasthz, p);
-		if(fasthz <= 0)
-			error(Ebadtimectl);
-		todsetfreq(fasthz);
-		break;
-	}
-	return n;
-}
--- a/sys/src/9/omap/devuart.c
+++ b/sys/src/9/omap/devuart.c
@@ -225,11 +225,8 @@
 		p->dev = i;
 		if(p->console || p->special){
 			if(uartenable(p) != nil){
-				if(p->console && up){
-					kbdq = p->iq;
+				if(p->console && up)
 					serialoq = p->oq;
-					p->putc = kbdcr2nl;
-				}
 				p->opens++;
 			}
 		}
--- a/sys/src/9/omap/fns.h
+++ b/sys/src/9/omap/fns.h
@@ -54,7 +54,6 @@
 extern int isaconfig(char*, int, ISAConf*);
 extern int isdmadone(int);
 extern int ispow2(uvlong);
-extern void kbdenable(void);
 extern void l2cacheuinv(void);
 extern void l2cacheuwb(void);
 extern void l2cacheuwbinv(void);
--- a/sys/src/9/omap/kbd.c
+++ /dev/null
@@ -1,410 +1,0 @@
-/*
- * simulated keyboard input for omap35 with no keyboard (except via uart or usb)
- *
- * gutted version of ps2 version from ../pc
- */
-#include	"u.h"
-#include	"../port/lib.h"
-#include	"mem.h"
-#include	"dat.h"
-#include	"fns.h"
-#include	"io.h"
-#include	"../port/error.h"
-
-enum {
-	Spec=		0xF800,		/* Unicode private space */
-	PF=		Spec|0x20,	/* num pad function key */
-	View=		Spec|0x00,	/* view (shift window up) */
-	KF=		0xF000,		/* function key (begin Unicode private space) */
-	Shift=		Spec|0x60,
-	Break=		Spec|0x61,
-	Ctrl=		Spec|0x62,
-	Latin=		Spec|0x63,
-	Caps=		Spec|0x64,
-	Num=		Spec|0x65,
-	Middle=		Spec|0x66,
-	Altgr=		Spec|0x67,
-	Kmouse=		Spec|0x100,
-	No=		0x00,		/* peter */
-
-	Home=		KF|13,
-	Up=		KF|14,
-	Pgup=		KF|15,
-	Print=		KF|16,
-	Left=		KF|17,
-	Right=		KF|18,
-	End=		KF|24,
-	Down=		View,
-	Pgdown=		KF|19,
-	Ins=		KF|20,
-	Del=		0x7F,
-	Scroll=		KF|21,
-
-	Nscan=	128,
-
-	Int=	0,			/* kbscans indices */
-	Ext,
-	Nscans,
-};
-
-/*
- * The codes at 0x79 and 0x7b are produced by the PFU Happy Hacking keyboard.
- * A 'standard' keyboard doesn't produce anything above 0x58.
- */
-Rune kbtab[Nscan] = 
-{
-[0x00]	No,	0x1b,	'1',	'2',	'3',	'4',	'5',	'6',
-[0x08]	'7',	'8',	'9',	'0',	'-',	'=',	'\b',	'\t',
-[0x10]	'q',	'w',	'e',	'r',	't',	'y',	'u',	'i',
-[0x18]	'o',	'p',	'[',	']',	'\n',	Ctrl,	'a',	's',
-[0x20]	'd',	'f',	'g',	'h',	'j',	'k',	'l',	';',
-[0x28]	'\'',	'`',	Shift,	'\\',	'z',	'x',	'c',	'v',
-[0x30]	'b',	'n',	'm',	',',	'.',	'/',	Shift,	'*',
-[0x38]	Latin,	' ',	Ctrl,	KF|1,	KF|2,	KF|3,	KF|4,	KF|5,
-[0x40]	KF|6,	KF|7,	KF|8,	KF|9,	KF|10,	Num,	Scroll,	'7',
-[0x48]	'8',	'9',	'-',	'4',	'5',	'6',	'+',	'1',
-[0x50]	'2',	'3',	'0',	'.',	No,	No,	No,	KF|11,
-[0x58]	KF|12,	No,	No,	No,	No,	No,	No,	No,
-[0x60]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x68]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x70]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x78]	No,	View,	No,	Up,	No,	No,	No,	No,
-};
-
-Rune kbtabshift[Nscan] =
-{
-[0x00]	No,	0x1b,	'!',	'@',	'#',	'$',	'%',	'^',
-[0x08]	'&',	'*',	'(',	')',	'_',	'+',	'\b',	'\t',
-[0x10]	'Q',	'W',	'E',	'R',	'T',	'Y',	'U',	'I',
-[0x18]	'O',	'P',	'{',	'}',	'\n',	Ctrl,	'A',	'S',
-[0x20]	'D',	'F',	'G',	'H',	'J',	'K',	'L',	':',
-[0x28]	'"',	'~',	Shift,	'|',	'Z',	'X',	'C',	'V',
-[0x30]	'B',	'N',	'M',	'<',	'>',	'?',	Shift,	'*',
-[0x38]	Latin,	' ',	Ctrl,	KF|1,	KF|2,	KF|3,	KF|4,	KF|5,
-[0x40]	KF|6,	KF|7,	KF|8,	KF|9,	KF|10,	Num,	Scroll,	'7',
-[0x48]	'8',	'9',	'-',	'4',	'5',	'6',	'+',	'1',
-[0x50]	'2',	'3',	'0',	'.',	No,	No,	No,	KF|11,
-[0x58]	KF|12,	No,	No,	No,	No,	No,	No,	No,
-[0x60]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x68]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x70]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x78]	No,	Up,	No,	Up,	No,	No,	No,	No,
-};
-
-Rune kbtabesc1[Nscan] =
-{
-[0x00]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x08]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x10]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x18]	No,	No,	No,	No,	'\n',	Ctrl,	No,	No,
-[0x20]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x28]	No,	No,	Shift,	No,	No,	No,	No,	No,
-[0x30]	No,	No,	No,	No,	No,	'/',	No,	Print,
-[0x38]	Altgr,	No,	No,	No,	No,	No,	No,	No,
-[0x40]	No,	No,	No,	No,	No,	No,	Break,	Home,
-[0x48]	Up,	Pgup,	No,	Left,	No,	Right,	No,	End,
-[0x50]	Down,	Pgdown,	Ins,	Del,	No,	No,	No,	No,
-[0x58]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x60]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x68]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x70]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x78]	No,	Up,	No,	No,	No,	No,	No,	No,
-};
-
-Rune kbtabaltgr[Nscan] =
-{
-[0x00]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x08]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x10]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x18]	No,	No,	No,	No,	'\n',	Ctrl,	No,	No,
-[0x20]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x28]	No,	No,	Shift,	No,	No,	No,	No,	No,
-[0x30]	No,	No,	No,	No,	No,	'/',	No,	Print,
-[0x38]	Altgr,	No,	No,	No,	No,	No,	No,	No,
-[0x40]	No,	No,	No,	No,	No,	No,	Break,	Home,
-[0x48]	Up,	Pgup,	No,	Left,	No,	Right,	No,	End,
-[0x50]	Down,	Pgdown,	Ins,	Del,	No,	No,	No,	No,
-[0x58]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x60]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x68]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x70]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x78]	No,	Up,	No,	No,	No,	No,	No,	No,
-};
-
-Rune kbtabctrl[Nscan] =
-{
-[0x00]	No,	'', 	'', 	'', 	'', 	'', 	'', 	'', 
-[0x08]	'', 	'', 	'', 	'', 	'
', 	'', 	'\b',	'\t',
-[0x10]	'', 	'', 	'', 	'', 	'', 	'', 	'', 	'\t',
-[0x18]	'', 	'', 	'', 	'', 	'\n',	Ctrl,	'', 	'', 
-[0x20]	'', 	'', 	'', 	'\b',	'\n',	'', 	'', 	'', 
-[0x28]	'', 	No, 	Shift,	'', 	'', 	'', 	'', 	'', 
-[0x30]	'', 	'', 	'
', 	'', 	'', 	'', 	Shift,	'\n',
-[0x38]	Latin,	No, 	Ctrl,	'', 	'', 	'', 	'', 	'', 
-[0x40]	'', 	'', 	'', 	'
', 	'', 	'', 	'', 	'', 
-[0x48]	'', 	'', 	'
', 	'', 	'', 	'', 	'', 	'', 
-[0x50]	'', 	'', 	'', 	'', 	No,	No,	No,	'', 
-[0x58]	'', 	No,	No,	No,	No,	No,	No,	No,
-[0x60]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x68]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x70]	No,	No,	No,	No,	No,	No,	No,	No,
-[0x78]	No,	'', 	No,	'\b',	No,	No,	No,	No,
-};
-
-int mouseshifted;
-void (*kbdmouse)(int);
-
-static int kdebug;
-
-typedef struct Kbscan Kbscan;
-struct Kbscan {
-	int	esc1;
-	int	esc2;
-	int	alt;
-	int	altgr;
-	int	caps;
-	int	ctl;
-	int	num;
-	int	shift;
-	int	collecting;
-	int	nk;
-	Rune	kc[5];
-	int	buttons;
-};
-
-Kbscan kbscans[Nscans];	/* kernel and external scan code state */
-
-/*
- * Scan code processing
- */
-void
-kbdputsc(int c, int external)
-{
-	int i, keyup;
-	Kbscan *kbscan;
-
-	if(external)
-		kbscan = &kbscans[Ext];
-	else
-		kbscan = &kbscans[Int];
-
-	if(kdebug)
-		print("sc %x ms %d\n", c, mouseshifted);
-	/*
-	 *  e0's is the first of a 2 character sequence, e1 the first
-	 *  of a 3 character sequence (on the safari)
-	 */
-	if(c == 0xe0){
-		kbscan->esc1 = 1;
-		return;
-	} else if(c == 0xe1){
-		kbscan->esc2 = 2;
-		return;
-	}
-
-	keyup = c & 0x80;
-	c &= 0x7f;
-	if(c > sizeof kbtab){
-		c |= keyup;
-		if(c != 0xFF)	/* these come fairly often: CAPSLOCK U Y */
-			print("unknown key %ux\n", c);
-		return;
-	}
-
-	if(kbscan->esc1){
-		c = kbtabesc1[c];
-		kbscan->esc1 = 0;
-	} else if(kbscan->esc2){
-		kbscan->esc2--;
-		return;
-	} else if(kbscan->shift)
-		c = kbtabshift[c];
-	else if(kbscan->altgr)
-		c = kbtabaltgr[c];
-	else if(kbscan->ctl)
-		c = kbtabctrl[c];
-	else
-		c = kbtab[c];
-
-	if(kbscan->caps && c<='z' && c>='a')
-		c += 'A' - 'a';
-
-	/*
-	 *  keyup only important for shifts
-	 */
-	if(keyup){
-		switch(c){
-		case Latin:
-			kbscan->alt = 0;
-			break;
-		case Shift:
-			kbscan->shift = 0;
-			mouseshifted = 0;
-			if(kdebug)
-				print("shiftclr\n");
-			break;
-		case Ctrl:
-			kbscan->ctl = 0;
-			break;
-		case Altgr:
-			kbscan->altgr = 0;
-			break;
-		case Kmouse|1:
-		case Kmouse|2:
-		case Kmouse|3:
-		case Kmouse|4:
-		case Kmouse|5:
-			kbscan->buttons &= ~(1<<(c-Kmouse-1));
-			if(kbdmouse)
-				kbdmouse(kbscan->buttons);
-			break;
-		}
-		return;
-	}
-
-	/*
-	 *  normal character
-	 */
-	if(!(c & (Spec|KF))){
-		if(kbscan->ctl)
-			if(kbscan->alt && c == Del)
-				exit(0);
-		if(!kbscan->collecting){
-			kbdputc(kbdq, c);
-			return;
-		}
-		kbscan->kc[kbscan->nk++] = c;
-		c = latin1(kbscan->kc, kbscan->nk);
-		if(c < -1)	/* need more keystrokes */
-			return;
-		if(c != -1)	/* valid sequence */
-			kbdputc(kbdq, c);
-		else	/* dump characters */
-			for(i=0; i<kbscan->nk; i++)
-				kbdputc(kbdq, kbscan->kc[i]);
-		kbscan->nk = 0;
-		kbscan->collecting = 0;
-		return;
-	} else {
-		switch(c){
-		case Caps:
-			kbscan->caps ^= 1;
-			return;
-		case Num:
-			kbscan->num ^= 1;
-			return;
-		case Shift:
-			kbscan->shift = 1;
-			if(kdebug)
-				print("shift\n");
-			mouseshifted = 1;
-			return;
-		case Latin:
-			kbscan->alt = 1;
-			/*
-			 * VMware and Qemu use Ctl-Alt as the key combination
-			 * to make the VM give up keyboard and mouse focus.
-			 * This has the unfortunate side effect that when you
-			 * come back into focus, Plan 9 thinks you want to type
-			 * a compose sequence (you just typed alt). 
-			 *
-			 * As a clumsy hack around this, we look for ctl-alt
-			 * and don't treat it as the start of a compose sequence.
-			 */
-			if(!kbscan->ctl){
-				kbscan->collecting = 1;
-				kbscan->nk = 0;
-			}
-			return;
-		case Ctrl:
-			kbscan->ctl = 1;
-			return;
-		case Altgr:
-			kbscan->altgr = 1;
-			return;
-		case Kmouse|1:
-		case Kmouse|2:
-		case Kmouse|3:
-		case Kmouse|4:
-		case Kmouse|5:
-			kbscan->buttons |= 1<<(c-Kmouse-1);
-			if(kbdmouse)
-				kbdmouse(kbscan->buttons);
-			return;
-		case KF|11:
-			print("kbd debug on, F12 turns it off\n");
-			kdebug = 1;
-			break;
-		case KF|12:
-			kdebug = 0;
-			break;
-		}
-	}
-	kbdputc(kbdq, c);
-}
-
-void
-kbdenable(void)
-{
-#ifdef notdef
-	kbdq = qopen(4*1024, 0, 0, 0);
-	if(kbdq == nil)
-		panic("kbdinit");
-	qnoblock(kbdq, 1);
-#endif
-	kbscans[Int].num = 0;
-}
-
-void
-kbdputmap(ushort m, ushort scanc, Rune r)
-{
-	if(scanc >= Nscan)
-		error(Ebadarg);
-	switch(m) {
-	default:
-		error(Ebadarg);
-	case 0:
-		kbtab[scanc] = r;
-		break;
-	case 1:
-		kbtabshift[scanc] = r;
-		break;
-	case 2:
-		kbtabesc1[scanc] = r;
-		break;
-	case 3:
-		kbtabaltgr[scanc] = r;
-		break;
-	case 4:	
-		kbtabctrl[scanc] = r;
-		break;
-	}
-}
-
-int
-kbdgetmap(uint offset, int *t, int *sc, Rune *r)
-{
-	if ((int)offset < 0)
-		error(Ebadarg);
-	*t = offset/Nscan;
-	*sc = offset%Nscan;
-	switch(*t) {
-	default:
-		return 0;
-	case 0:
-		*r = kbtab[*sc];
-		return 1;
-	case 1:
-		*r = kbtabshift[*sc];
-		return 1;
-	case 2:
-		*r = kbtabesc1[*sc];
-		return 1;
-	case 3:
-		*r = kbtabaltgr[*sc];
-		return 1;
-	case 4:
-		*r = kbtabctrl[*sc];
-		return 1;
-	}
-}
--- a/sys/src/9/omap/main.c
+++ b/sys/src/9/omap/main.c
@@ -259,7 +259,7 @@
 
 	delay(250);			/* let uart catch up */
 	printinit();
-	kbdenable();
+//	kbdenable();
 
 	cpuidprint();
 //	chkmissing();
@@ -445,8 +445,6 @@
 	dmatest();		/* needs `up' set, so can't do it earlier */
 	chandevinit();
 	i8250console();		/* might be redundant, but harmless */
-	if(kbdq == nil)
-		panic("init0: nil kbdq");
 	if(serialoq == nil)
 		panic("init0: nil serialoq");
 	normalprint = 1;
--- a/sys/src/9/omap/mkfile
+++ b/sys/src/9/omap/mkfile
@@ -22,7 +22,6 @@
 	dev.$O\
 	edf.$O\
 	fault.$O\
-	latin1.$O\
 	mul64fract.$O\
 	rebootcmd.$O\
 	page.$O\
@@ -50,7 +49,6 @@
 	fpi.$O\
 	fpiarm.$O\
 	fpimem.$O\
-	kbd.$O\
 	main.$O\
 	mmu.$O\
 	random.$O\
@@ -93,6 +91,9 @@
 	{ cp -x $p$CONF s$p$CONF /$objtype } &
 	wait
 	touch $target
+
+rootfs.bz2:
+	rc ../port/mkbootfs
 
 <../boot/bootmkfile
 <../port/portmkfile
--- a/sys/src/9/omap/screen.h
+++ b/sys/src/9/omap/screen.h
@@ -15,6 +15,7 @@
 
 /* devmouse.c */
 extern void mousetrack(int, int, int, int);
+extern void absmousetrack(int, int, int, int);
 extern Point mousexy(void);
 
 extern void	mouseaccelerate(int);
--- a/sys/src/9/omap/uarti8250.c
+++ b/sys/src/9/omap/uarti8250.c
@@ -812,9 +812,7 @@
 
 	if(uartenable(uart) != nil /* && uart->console */){
 		// iprint("i8250console: enabling console uart\n");
-		kbdq = uart->iq;
 		serialoq = uart->oq;
-		uart->putc = kbdcr2nl;
 		uart->opens++;
 		consuart = uart;
 	}
--- a/sys/src/9/pc/mkfile
+++ b/sys/src/9/pc/mkfile
@@ -24,7 +24,6 @@
 	dev.$O\
 	edf.$O\
 	fault.$O\
-	latin1.$O\
 	page.$O\
 	parse.$O\
 	pgrp.$O\
--- a/sys/src/9/port/audioif.h
+++ b/sys/src/9/port/audioif.h
@@ -8,6 +8,8 @@
 	void *ctlr;
 	void *mixer;
 
+	Ref audioopen;
+
 	long (*read)(Audio *, void *, long, vlong);
 	long (*write)(Audio *, void *, long, vlong);
 	void (*close)(Audio *);
--- a/sys/src/9/port/devaudio.c
+++ b/sys/src/9/port/devaudio.c
@@ -49,8 +49,8 @@
 static Audio *audiodevs;
 
 static char Evolume[] = "illegal volume specifier";
+static char Ebusy[] = "device is busy";
 
-
 void
 addaudiocard(char *name, int (*probefn)(Audio *))
 {
@@ -170,6 +170,15 @@
 static Chan*
 audioopen(Chan *c, int omode)
 {
+	Audiochan *ac;
+	Audio *adev;
+
+	ac = c->aux;
+	adev = ac->adev;
+	if(c->qid.path == Qaudio && incref(&adev->audioopen) != 1){
+		decref(&adev->audioopen);
+		error(Ebusy);
+	}
 	return devopen(c, omode, audiodir, nelem(audiodir), devgen);
 }
 
@@ -291,9 +300,11 @@
 
 	ac = c->aux;
 	adev = ac->adev;
-	if(c->qid.path == Qaudio && (c->flag & COPEN))
+	if(c->qid.path == Qaudio && (c->flag & COPEN)){
 		if(adev->close)
 			adev->close(adev);
+		decref(&adev->audioopen);
+	}
 
 	if(ac->owner == c){
 		ac->owner = nil;
--- a/sys/src/9/port/devmouse.c
+++ b/sys/src/9/port/devmouse.c
@@ -72,8 +72,6 @@
 Mouseinfo	mouse;
 Cursorinfo	cursor;
 int		mouseshifted;
-int		kbdbuttons;
-void		(*kbdmouse)(int);
 Cursor		curs;
 
 void	Cursortocursor(Cursor*);
@@ -80,7 +78,6 @@
 int	mousechanged(void*);
 
 static void mouseclock(void);
-static void xkbdmouse(int);
 
 enum{
 	Qdir,
@@ -120,13 +117,6 @@
 	addclock0link(mouseclock, 33);
 }
 
-static void
-mousefromkbd(int buttons)
-{
-	kbdbuttons = buttons;
-	mousetrack(0, 0, 0, TK2MS(MACHP(0)->ticks));
-}
-
 static int
 mousedevgen(Chan *c, char *name, Dirtab *tab, int ntab, int i, Dir *dp)
 {
@@ -147,7 +137,6 @@
 	curs = arrow;
 	Cursortocursor(&arrow);
 	cursoron(1);
-	kbdmouse = mousefromkbd;
 	mousetime = seconds();
 }
 
@@ -603,7 +592,7 @@
 
 	lastb = mouse.buttons;
 	mouse.xy = Pt(x, y);
-	mouse.buttons = b|kbdbuttons;
+	mouse.buttons = b;
 	mouse.redraw = 1;
 	mouse.counter++;
 	mouse.msec = msec;
@@ -642,7 +631,7 @@
 
 	lastb = mouse.buttons;
 	mouse.xy = Pt(x, y);
-	mouse.buttons = b|kbdbuttons;
+	mouse.buttons = b;
 	mouse.redraw = 1;
 	mouse.counter++;
 	mouse.msec = msec;
--- a/sys/src/9/port/latin1.c
+++ /dev/null
@@ -1,76 +1,0 @@
-#include <u.h>
-
-/*
- * The code makes two assumptions: strlen(ld) is 1 or 2; latintab[i].ld can be a
- * prefix of latintab[j].ld only when j<i.
- */
-struct cvlist
-{
-	char	*ld;		/* must be seen before using this conversion */
-	char	*si;		/* options for last input characters */
-	Rune	*so;		/* the corresponding Rune for each si entry */
-} latintab[] = {
-#include "../port/latin1.h"
-	0,	0,		0
-};
-
-/*
- * Given 5 characters k[0]..k[4], find the rune or return -1 for failure.
- */
-long
-unicode(Rune *k)
-{
-	long i, c;
-
-	k++;	/* skip 'X' */
-	c = 0;
-	for(i=0; i<4; i++,k++){
-		c <<= 4;
-		if('0'<=*k && *k<='9')
-			c += *k-'0';
-		else if('a'<=*k && *k<='f')
-			c += 10 + *k-'a';
-		else if('A'<=*k && *k<='F')
-			c += 10 + *k-'A';
-		else
-			return -1;
-	}
-	return c;
-}
-
-/*
- * Given n characters k[0]..k[n-1], find the corresponding rune or return -1 for
- * failure, or something < -1 if n is too small.  In the latter case, the result
- * is minus the required n.
- */
-long
-latin1(Rune *k, int n)
-{
-	struct cvlist *l;
-	int c;
-	char* p;
-
-	if(k[0] == 'X')
-		if(n>=5)
-			return unicode(k);
-		else
-			return -5;
-	for(l=latintab; l->ld!=0; l++)
-		if(k[0] == l->ld[0]){
-			if(n == 1)
-				return -2;
-			if(l->ld[1] == 0)
-				c = k[1];
-			else if(l->ld[1] != k[1])
-				continue;
-			else if(n == 2)
-				return -3;
-			else
-				c = k[2];
-			for(p=l->si; *p!=0; p++)
-				if(*p == c)
-					return l->so[p - l->si];
-			return -1;
-		}
-	return -1;
-}
--- a/sys/src/9/port/portdat.h
+++ b/sys/src/9/port/portdat.h
@@ -766,8 +766,6 @@
 extern	char*	eve;
 extern	char	hostdomain[];
 extern	uchar	initcode[];
-extern	int	kbdbuttons;
-extern	Queue*	kbdq;
 extern	Queue*	kprintoq;
 extern 	Ref	noteidalloc;
 extern	int	nsyscall;
--- a/sys/src/9/port/portfns.h
+++ b/sys/src/9/port/portfns.h
@@ -150,7 +150,6 @@
 void		ksetenv(char*, char*, int);
 void		kstrcpy(char*, char*, int);
 void		kstrdup(char**, char*);
-long		latin1(Rune*, int);
 int		lock(Lock*);
 void		logopen(Log*);
 void		logclose(Log*);
--- a/sys/src/9/port/portmkfile
+++ b/sys/src/9/port/portmkfile
@@ -59,9 +59,6 @@
 errstr.h:	../port/mkerrstr ../port/error.h
 	rc ../port/mkerrstr > errstr.h
 
-../port/latin1.h:	/lib/keyboard
-	aux/mklatinkbd /lib/keyboard > ../port/latin1.h
-
 %.db:		main.$O
 	$CC -s$stem main.c | dbfmt > $stem.db
 
@@ -69,6 +66,7 @@
 devmnt.$O:	/sys/include/fcall.h
 proc.$O:	errstr.h
 devroot.$O:	errstr.h
+devaudio.$O:	../port/audioif.h
 devaoe.$O:	/$objtype/include/ureg.h
 devfs.$O:	/$objtype/include/ureg.h
 devsd.$O:	/$objtype/include/ureg.h
@@ -83,7 +81,6 @@
 devmouse.$O:	screen.h /sys/include/memdraw.h
 devdraw.$O:	screen.h /sys/include/memdraw.h
 screen.$O:	screen.h /sys/include/memdraw.h
-latin1.$O:	../port/latin1.h
 thwack.$O:	../port/thwack.h
 unthwack.$O:	../port/thwack.h
 devsdp.$O:	../port/thwack.h
--- a/sys/src/9/ppc/mkfile
+++ b/sys/src/9/ppc/mkfile
@@ -19,7 +19,6 @@
 	dev.$O\
 	edf.$O\
 	fault.$O\
-	latin1.$O\
 	log.$O\
 	rebootcmd.$O\
 	page.$O\
--- a/sys/src/cmd/python/Modules/_lsprof.c
+++ b/sys/src/cmd/python/Modules/_lsprof.c
@@ -156,9 +156,13 @@
 	return result;
 }
 
-#define CALL_TIMER(pObj)	((pObj)->externalTimer ?		\
-					CallExternalTimer(pObj) :	\
-					hpTimer())
+static PY_LONG_LONG
+CALL_TIMER(ProfilerObject *pObj)
+{
+	if(pObj->externalTimer)
+		return CallExternalTimer(pObj);
+	return hpTimer();
+}
 
 /*** ProfilerObject ***/
 
--- a/sys/src/cmd/python/Modules/bz2module.c
+++ b/sys/src/cmd/python/Modules/bz2module.c
@@ -1007,8 +1007,10 @@
 #if !defined(HAVE_LARGEFILE_SUPPORT)
 	offset = PyInt_AsLong(offobj);
 #else
-	offset = PyLong_Check(offobj) ?
-		PyLong_AsLongLong(offobj) : PyInt_AsLong(offobj);
+	if(PyLong_Check(offobj))
+		offset = PyLong_AsLongLong(offobj);
+	else
+		offset = PyInt_AsLong(offobj);
 #endif
 	if (PyErr_Occurred())
 		return NULL;
--- a/sys/src/cmd/python/Modules/fcntlmodule.c
+++ b/sys/src/cmd/python/Modules/fcntlmodule.c
@@ -339,9 +339,10 @@
 #if !defined(HAVE_LARGEFILE_SUPPORT)
 			l.l_start = PyInt_AsLong(startobj);
 #else
-			l.l_start = PyLong_Check(startobj) ?
-					PyLong_AsLongLong(startobj) :
-					PyInt_AsLong(startobj);
+			if(PyLong_Check(startobj))
+				l.l_start = PyLong_AsLongLong(startobj);
+			else
+				l.l_start = PyInt_AsLong(startobj);
 #endif
 			if (PyErr_Occurred())
 				return NULL;
@@ -350,9 +351,10 @@
 #if !defined(HAVE_LARGEFILE_SUPPORT)
 			l.l_len = PyInt_AsLong(lenobj);
 #else
-			l.l_len = PyLong_Check(lenobj) ?
-					PyLong_AsLongLong(lenobj) :
-					PyInt_AsLong(lenobj);
+			if(PyLong_Check(lenobj))
+				l.l_len = PyLong_AsLongLong(lenobj);
+			else
+				l.l_len = PyInt_AsLong(lenobj);
 #endif
 			if (PyErr_Occurred())
 				return NULL;
--- a/sys/src/cmd/python/Modules/posixmodule.c
+++ b/sys/src/cmd/python/Modules/posixmodule.c
@@ -6053,8 +6053,10 @@
 #if !defined(HAVE_LARGEFILE_SUPPORT)
 	pos = PyInt_AsLong(posobj);
 #else
-	pos = PyLong_Check(posobj) ?
-		PyLong_AsLongLong(posobj) : PyInt_AsLong(posobj);
+	if(PyLong_Check(posobj))
+		pos = PyLong_AsLongLong(posobj);
+	else
+		pos = PyInt_AsLong(posobj);
 #endif
 	if (PyErr_Occurred())
 		return NULL;
@@ -6384,8 +6386,10 @@
 #if !defined(HAVE_LARGEFILE_SUPPORT)
 	length = PyInt_AsLong(lenobj);
 #else
-	length = PyLong_Check(lenobj) ?
-		PyLong_AsLongLong(lenobj) : PyInt_AsLong(lenobj);
+	if(PyLong_Check(lenobj))
+		length = PyLong_AsLongLong(lenobj);
+	else
+		length = PyInt_AsLong(lenobj);
 #endif
 	if (PyErr_Occurred())
 		return NULL;
--- a/sys/src/cmd/python/Modules/testcapi_long.h
+++ b/sys/src/cmd/python/Modules/testcapi_long.h
@@ -25,16 +25,19 @@
 	base = 1;
 	for (i = 0;
 	     i < NBITS + 1;  /* on last, base overflows to 0 */
-	     ++i, base <<= 1)
+	     ++i)
 	{
 		int j;
+
 		for (j = 0; j < 6; ++j) {
 			TYPENAME in, out;
 			unsigned TYPENAME uin, uout;
 
 			/* For 0, 1, 2 use base; for 3, 4, 5 use -base */
-			uin = j < 3 ? base
-				    : (unsigned TYPENAME)(-(TYPENAME)base);
+			if(j < 3)
+				uin = base;
+			else
+				uin = (unsigned TYPENAME)(-(TYPENAME)base);
 
 			/* For 0 & 3, subtract 1.
 			 * For 1 & 4, leave alone.
@@ -71,6 +74,8 @@
 					"signed output != input");
 			UNBIND(pyresult);
 		}
+
+		base <<= 1;
 	}
 
 	/* Overflow tests.  The loop above ensured that all limit cases that
--- a/sys/src/cmd/python/Objects/fileobject.c
+++ b/sys/src/cmd/python/Objects/fileobject.c
@@ -553,8 +553,10 @@
 #if !defined(HAVE_LARGEFILE_SUPPORT)
 	offset = PyInt_AsLong(offobj);
 #else
-	offset = PyLong_Check(offobj) ?
-		PyLong_AsLongLong(offobj) : PyInt_AsLong(offobj);
+	if(PyLong_Check(offobj))
+		offset = PyLong_AsLongLong(offobj);
+	else
+		offset = PyInt_AsLong(offobj);
 #endif
 	if (PyErr_Occurred())
 		return NULL;
@@ -610,9 +612,10 @@
 #if !defined(HAVE_LARGEFILE_SUPPORT)
 		newsize = PyInt_AsLong(newsizeobj);
 #else
-		newsize = PyLong_Check(newsizeobj) ?
-				PyLong_AsLongLong(newsizeobj) :
-				PyInt_AsLong(newsizeobj);
+		if(PyLong_Check(newsizeobj))
+			newsize = PyLong_AsLongLong(newsizeobj);
+		else
+			newsize = PyInt_AsLong(newsizeobj);
 #endif
 		if (PyErr_Occurred())
 			return NULL;
--- a/sys/src/cmd/python/Python/marshal.c
+++ b/sys/src/cmd/python/Python/marshal.c
@@ -971,7 +971,7 @@
 		if (filesize <= SMALL_FILE_LIMIT)
 			pBuf = buf;
 		else if (filesize <= REASONABLE_FILE_LIMIT)
-			pBuf = (char *)PyMem_MALLOC(filesize);
+			pBuf = (char *)PyMem_MALLOC((int)filesize);
 		if (pBuf != NULL) {
 			PyObject* v;
 			size_t n;
--- a/sys/src/cmd/python/plan9.c
+++ b/sys/src/cmd/python/plan9.c
@@ -6,6 +6,8 @@
 
 #if defined(T386)
 #define	FPINVAL	(1<<0)
+#elif defined(Tarm)
+#define FPINVAL (1<<16)
 #else
 Error define FPINVAL for your arch. grep /$cputype/include/u.h
 #endif
--