From e7d3e20912baa82965108997013710223152772c Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sat, 21 May 2011 00:42:08 +0000 Subject: [PATCH] remove keyboard stuff from other ports, make openssl and python compile on arm --- sys/include/ape/openssl/opensslconf.h | 2 - sys/src/9/alphapc/fns.h | 1 - sys/src/9/alphapc/kbd.c | 456 ------- sys/src/9/alphapc/main.c | 1 - sys/src/9/alphapc/mkfile | 6 +- sys/src/9/alphapc/screen.h | 1 + sys/src/9/bitsy/devµc.c | 49 +- sys/src/9/bitsy/mkfile | 1 - sys/src/9/kw/mkfile | 1 - sys/src/9/mtx/fns.h | 1 - sys/src/9/mtx/kbd.c | 435 ------- sys/src/9/mtx/main.c | 1 - sys/src/9/mtx/mkfile | 2 - sys/src/9/omap/archomap.c | 5 - sys/src/9/omap/beagle | 11 +- sys/src/9/omap/devcons.c | 1354 -------------------- sys/src/9/omap/devuart.c | 5 +- sys/src/9/omap/fns.h | 1 - sys/src/9/omap/kbd.c | 410 ------ sys/src/9/omap/main.c | 4 +- sys/src/9/omap/mkfile | 5 +- sys/src/9/omap/screen.h | 1 + sys/src/9/omap/uarti8250.c | 2 - sys/src/9/pc/mkfile | 1 - sys/src/9/port/audioif.h | 2 + sys/src/9/port/devaudio.c | 15 +- sys/src/9/port/devmouse.c | 15 +- sys/src/9/port/latin1.c | 76 -- sys/src/9/port/portdat.h | 2 - sys/src/9/port/portfns.h | 1 - sys/src/9/port/portmkfile | 5 +- sys/src/9/ppc/mkfile | 1 - sys/src/cmd/python/Modules/_lsprof.c | 10 +- sys/src/cmd/python/Modules/bz2module.c | 6 +- sys/src/cmd/python/Modules/fcntlmodule.c | 14 +- sys/src/cmd/python/Modules/posixmodule.c | 12 +- sys/src/cmd/python/Modules/testcapi_long.h | 11 +- sys/src/cmd/python/Objects/fileobject.c | 13 +- sys/src/cmd/python/Python/marshal.c | 2 +- sys/src/cmd/python/plan9.c | 2 + 40 files changed, 81 insertions(+), 2862 deletions(-) delete mode 100644 sys/src/9/alphapc/kbd.c delete mode 100644 sys/src/9/mtx/kbd.c delete mode 100644 sys/src/9/omap/devcons.c delete mode 100644 sys/src/9/omap/kbd.c delete mode 100644 sys/src/9/port/latin1.c diff --git a/sys/include/ape/openssl/opensslconf.h b/sys/include/ape/openssl/opensslconf.h index b3d30b151..fe01662bd 100644 --- 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) diff --git a/sys/src/9/alphapc/fns.h b/sys/src/9/alphapc/fns.h index 88b0f3a68..05fd83914 100644 --- a/sys/src/9/alphapc/fns.h +++ b/sys/src/9/alphapc/fns.h @@ -54,7 +54,6 @@ void ioinit(void); 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); diff --git a/sys/src/9/alphapc/kbd.c b/sys/src/9/alphapc/kbd.c deleted file mode 100644 index 73ad3e1dd..000000000 --- a/sys/src/9/alphapc/kbd.c +++ /dev/null @@ -1,456 +0,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 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<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); diff --git a/sys/src/9/bitsy/mkfile b/sys/src/9/bitsy/mkfile index 9fde07deb..00e19c138 100644 --- a/sys/src/9/bitsy/mkfile +++ b/sys/src/9/bitsy/mkfile @@ -17,7 +17,6 @@ PORT=\ dev.$O\ edf.$O\ fault.$O\ - latin1.$O\ mul64fract.$O\ rebootcmd.$O\ page.$O\ diff --git a/sys/src/9/kw/mkfile b/sys/src/9/kw/mkfile index 8f5402352..945c13801 100644 --- a/sys/src/9/kw/mkfile +++ b/sys/src/9/kw/mkfile @@ -21,7 +21,6 @@ PORT=\ dev.$O\ edf.$O\ fault.$O\ - latin1.$O\ mul64fract.$O\ rebootcmd.$O\ page.$O\ diff --git a/sys/src/9/mtx/fns.h b/sys/src/9/mtx/fns.h index d88d0d636..b4cc6e02b 100644 --- a/sys/src/9/mtx/fns.h +++ b/sys/src/9/mtx/fns.h @@ -51,7 +51,6 @@ void iofree(int); void ioinit(void); int iprint(char*, ...); int isaconfig(char*, int, ISAConf*); -void kbdinit(void); #define kexit(a) #define kmapinval() void links(void); diff --git a/sys/src/9/mtx/kbd.c b/sys/src/9/mtx/kbd.c deleted file mode 100644 index fe96fc345..000000000 --- a/sys/src/9/mtx/kbd.c +++ /dev/null @@ -1,435 +0,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 - -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*itime[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<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<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'= 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; -} diff --git a/sys/src/9/omap/devuart.c b/sys/src/9/omap/devuart.c index af4fce768..051ad0091 100644 --- a/sys/src/9/omap/devuart.c +++ b/sys/src/9/omap/devuart.c @@ -225,11 +225,8 @@ uartreset(void) 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++; } } diff --git a/sys/src/9/omap/fns.h b/sys/src/9/omap/fns.h index 6fe173108..3f7bbfedc 100644 --- a/sys/src/9/omap/fns.h +++ b/sys/src/9/omap/fns.h @@ -54,7 +54,6 @@ extern void intrsoff(void); 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); diff --git a/sys/src/9/omap/kbd.c b/sys/src/9/omap/kbd.c deleted file mode 100644 index e81b352d2..000000000 --- a/sys/src/9/omap/kbd.c +++ /dev/null @@ -1,410 +0,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; ink; 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; - } -} diff --git a/sys/src/9/omap/main.c b/sys/src/9/omap/main.c index 6f04f765a..b70e0bbcc 100644 --- a/sys/src/9/omap/main.c +++ b/sys/src/9/omap/main.c @@ -259,7 +259,7 @@ wave('l'); delay(250); /* let uart catch up */ printinit(); - kbdenable(); +// kbdenable(); cpuidprint(); // chkmissing(); @@ -445,8 +445,6 @@ init0(void) 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; diff --git a/sys/src/9/omap/mkfile b/sys/src/9/omap/mkfile index de353a776..74d617791 100644 --- a/sys/src/9/omap/mkfile +++ b/sys/src/9/omap/mkfile @@ -22,7 +22,6 @@ PORT=\ dev.$O\ edf.$O\ fault.$O\ - latin1.$O\ mul64fract.$O\ rebootcmd.$O\ page.$O\ @@ -50,7 +49,6 @@ OBJ=\ fpi.$O\ fpiarm.$O\ fpimem.$O\ - kbd.$O\ main.$O\ mmu.$O\ random.$O\ @@ -94,6 +92,9 @@ install:V: /$objtype/$p$CONF wait touch $target +rootfs.bz2: + rc ../port/mkbootfs + <../boot/bootmkfile <../port/portmkfile <|../port/mkbootrules $CONF diff --git a/sys/src/9/omap/screen.h b/sys/src/9/omap/screen.h index ba9b36bd3..6eff3649c 100644 --- a/sys/src/9/omap/screen.h +++ b/sys/src/9/omap/screen.h @@ -15,6 +15,7 @@ extern Cursorinfo cursor; /* devmouse.c */ extern void mousetrack(int, int, int, int); +extern void absmousetrack(int, int, int, int); extern Point mousexy(void); extern void mouseaccelerate(int); diff --git a/sys/src/9/omap/uarti8250.c b/sys/src/9/omap/uarti8250.c index 7642a2685..c69a8cfaa 100644 --- a/sys/src/9/omap/uarti8250.c +++ b/sys/src/9/omap/uarti8250.c @@ -812,9 +812,7 @@ i8250console(void) 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; } diff --git a/sys/src/9/pc/mkfile b/sys/src/9/pc/mkfile index 2170c1268..cb54b7497 100644 --- a/sys/src/9/pc/mkfile +++ b/sys/src/9/pc/mkfile @@ -24,7 +24,6 @@ PORT=\ dev.$O\ edf.$O\ fault.$O\ - latin1.$O\ page.$O\ parse.$O\ pgrp.$O\ diff --git a/sys/src/9/port/audioif.h b/sys/src/9/port/audioif.h index 9deaec039..f8431fe3e 100644 --- a/sys/src/9/port/audioif.h +++ b/sys/src/9/port/audioif.h @@ -8,6 +8,8 @@ struct Audio void *ctlr; void *mixer; + Ref audioopen; + long (*read)(Audio *, void *, long, vlong); long (*write)(Audio *, void *, long, vlong); void (*close)(Audio *); diff --git a/sys/src/9/port/devaudio.c b/sys/src/9/port/devaudio.c index ae49e280f..5759b08a4 100644 --- a/sys/src/9/port/devaudio.c +++ b/sys/src/9/port/devaudio.c @@ -49,7 +49,7 @@ static Audioprobe audioprobes[16]; 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 @@ audioattach(char *spec) 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 @@ audioclose(Chan *c) 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; diff --git a/sys/src/9/port/devmouse.c b/sys/src/9/port/devmouse.c index 24c66ec45..028d8e2b2 100644 --- a/sys/src/9/port/devmouse.c +++ b/sys/src/9/port/devmouse.c @@ -72,15 +72,12 @@ static Cmdtab mousectlmsg[] = Mouseinfo mouse; Cursorinfo cursor; int mouseshifted; -int kbdbuttons; -void (*kbdmouse)(int); Cursor curs; void Cursortocursor(Cursor*); int mousechanged(void*); static void mouseclock(void); -static void xkbdmouse(int); enum{ Qdir, @@ -120,13 +117,6 @@ mousereset(void) 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 @@ mouseinit(void) curs = arrow; Cursortocursor(&arrow); cursoron(1); - kbdmouse = mousefromkbd; mousetime = seconds(); } @@ -603,7 +592,7 @@ mousetrack(int dx, int dy, int b, int msec) 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 @@ absmousetrack(int x, int y, int b, int msec) lastb = mouse.buttons; mouse.xy = Pt(x, y); - mouse.buttons = b|kbdbuttons; + mouse.buttons = b; mouse.redraw = 1; mouse.counter++; mouse.msec = msec; diff --git a/sys/src/9/port/latin1.c b/sys/src/9/port/latin1.c deleted file mode 100644 index 8dcb0d7e4..000000000 --- a/sys/src/9/port/latin1.c +++ /dev/null @@ -1,76 +0,0 @@ -#include - -/* - * 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=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; -} diff --git a/sys/src/9/port/portdat.h b/sys/src/9/port/portdat.h index 6d8a59c0b..bef56c086 100644 --- a/sys/src/9/port/portdat.h +++ b/sys/src/9/port/portdat.h @@ -766,8 +766,6 @@ extern Dev* devtab[]; extern char* eve; extern char hostdomain[]; extern uchar initcode[]; -extern int kbdbuttons; -extern Queue* kbdq; extern Queue* kprintoq; extern Ref noteidalloc; extern int nsyscall; diff --git a/sys/src/9/port/portfns.h b/sys/src/9/port/portfns.h index ca56a6cf0..4dd37938d 100644 --- a/sys/src/9/port/portfns.h +++ b/sys/src/9/port/portfns.h @@ -150,7 +150,6 @@ void (*kproftimer)(ulong); 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*); diff --git a/sys/src/9/port/portmkfile b/sys/src/9/port/portmkfile index 7b0c14053..02f2f29b5 100644 --- a/sys/src/9/port/portmkfile +++ b/sys/src/9/port/portmkfile @@ -59,9 +59,6 @@ $CONF.c: ../port/mkdevc $CONF 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 @@ alloc.$O: /sys/include/pool.h 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 @@ devuart.$O: ../port/netif.h 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 diff --git a/sys/src/9/ppc/mkfile b/sys/src/9/ppc/mkfile index 37b2486c9..3a8024c09 100644 --- a/sys/src/9/ppc/mkfile +++ b/sys/src/9/ppc/mkfile @@ -19,7 +19,6 @@ PORT=\ dev.$O\ edf.$O\ fault.$O\ - latin1.$O\ log.$O\ rebootcmd.$O\ page.$O\ diff --git a/sys/src/cmd/python/Modules/_lsprof.c b/sys/src/cmd/python/Modules/_lsprof.c index d35c894c5..962349829 100644 --- a/sys/src/cmd/python/Modules/_lsprof.c +++ b/sys/src/cmd/python/Modules/_lsprof.c @@ -156,9 +156,13 @@ static PY_LONG_LONG CallExternalTimer(ProfilerObject *pObj) 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 ***/ diff --git a/sys/src/cmd/python/Modules/bz2module.c b/sys/src/cmd/python/Modules/bz2module.c index 9d92cf6bb..dec7a987c 100644 --- a/sys/src/cmd/python/Modules/bz2module.c +++ b/sys/src/cmd/python/Modules/bz2module.c @@ -1007,8 +1007,10 @@ BZ2File_seek(BZ2FileObject *self, PyObject *args) #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; diff --git a/sys/src/cmd/python/Modules/fcntlmodule.c b/sys/src/cmd/python/Modules/fcntlmodule.c index 5198baa5e..0b9a1cbd1 100644 --- a/sys/src/cmd/python/Modules/fcntlmodule.c +++ b/sys/src/cmd/python/Modules/fcntlmodule.c @@ -339,9 +339,10 @@ fcntl_lockf(PyObject *self, PyObject *args) #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 @@ fcntl_lockf(PyObject *self, PyObject *args) #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; diff --git a/sys/src/cmd/python/Modules/posixmodule.c b/sys/src/cmd/python/Modules/posixmodule.c index 958fb63d3..a42d2be21 100644 --- a/sys/src/cmd/python/Modules/posixmodule.c +++ b/sys/src/cmd/python/Modules/posixmodule.c @@ -6053,8 +6053,10 @@ posix_lseek(PyObject *self, PyObject *args) #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 @@ posix_ftruncate(PyObject *self, PyObject *args) #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; diff --git a/sys/src/cmd/python/Modules/testcapi_long.h b/sys/src/cmd/python/Modules/testcapi_long.h index 8ed6b021e..90d218c14 100644 --- a/sys/src/cmd/python/Modules/testcapi_long.h +++ b/sys/src/cmd/python/Modules/testcapi_long.h @@ -25,16 +25,19 @@ TESTNAME(PyObject *error(const char*)) 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 @@ TESTNAME(PyObject *error(const char*)) "signed output != input"); UNBIND(pyresult); } + + base <<= 1; } /* Overflow tests. The loop above ensured that all limit cases that diff --git a/sys/src/cmd/python/Objects/fileobject.c b/sys/src/cmd/python/Objects/fileobject.c index 869ded916..124767ccd 100644 --- a/sys/src/cmd/python/Objects/fileobject.c +++ b/sys/src/cmd/python/Objects/fileobject.c @@ -553,8 +553,10 @@ file_seek(PyFileObject *f, PyObject *args) #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 @@ file_truncate(PyFileObject *f, PyObject *args) #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; diff --git a/sys/src/cmd/python/Python/marshal.c b/sys/src/cmd/python/Python/marshal.c index 776836e55..7940ce18a 100644 --- a/sys/src/cmd/python/Python/marshal.c +++ b/sys/src/cmd/python/Python/marshal.c @@ -971,7 +971,7 @@ PyMarshal_ReadLastObjectFromFile(FILE *fp) 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; diff --git a/sys/src/cmd/python/plan9.c b/sys/src/cmd/python/plan9.c index a19392db4..94228077e 100644 --- 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