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*)ℴ
- 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*)ℴ
- 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
--
⑨