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

This commit is contained in:
cinap_lenrek 2011-05-21 00:42:08 +00:00
parent 9adf75a709
commit e7d3e20912
40 changed files with 81 additions and 2862 deletions

View file

@ -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)

View file

@ -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);

View file

@ -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<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);
}

View file

@ -99,7 +99,6 @@ main(void)
printinit();
/* it's now safe to print */
/* dumpopts(); /* DEBUG */
kbdinit();
i8250console();
quotefmtinstall();
print("\nPlan 9\n");

View file

@ -16,7 +16,6 @@ PORT=\
chan.$O\
dev.$O\
fault.$O\
latin1.$O\
log.$O\
edf.$O\
mul64fract.$O\
@ -46,7 +45,6 @@ OBJ=\
fdc37c93x.$O\
fptrap.$O\
i8259.$O\
kbd.$O\
main.$O\
mmu.$O\
random.$O\
@ -78,6 +76,9 @@ $p$CONF: $CONF.c $OBJ $LIB
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 @@ clock.$O: /$objtype/include/ureg.h axp.h
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

View file

@ -7,6 +7,7 @@ struct Cursorinfo {
/* devmouse.c */
extern void mousetrack(int, int, int, int);
extern void absmousetrack(int, int, int, int);
extern Point mousexy(void);
extern void mouseaccelerate(int);

View file

@ -12,7 +12,6 @@ enum{
Qbattery,
Qbuttons,
Qcruft,
Qkbdin,
Qled,
Qversion,
Qpower,
@ -28,34 +27,12 @@ enum{
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,
"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 @@ static struct µcontroller
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 @@ int
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 @@ static long
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);

View file

@ -17,7 +17,6 @@ PORT=\
dev.$O\
edf.$O\
fault.$O\
latin1.$O\
mul64fract.$O\
rebootcmd.$O\
page.$O\

View file

@ -21,7 +21,6 @@ PORT=\
dev.$O\
edf.$O\
fault.$O\
latin1.$O\
mul64fract.$O\
rebootcmd.$O\
page.$O\

View file

@ -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);

View file

@ -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<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();
}

View file

@ -29,7 +29,6 @@ main(void)
mmuinit();
hwintrinit();
clockinit();
kbdinit();
procinit0();
initseg();
timersinit();

View file

@ -17,7 +17,6 @@ PORT=\
dev.$O\
edf.$O\
fault.$O\
latin1.$O\
log.$O\
mul64fract.$O\
rebootcmd.$O\
@ -43,7 +42,6 @@ OBJ=\
inb.$O\
clock.$O\
i8259.$O\
kbd.$O\
main.$O\
mmu.$O\
random.$O\

View file

@ -1281,11 +1281,6 @@ archreboot(void)
}
}
void
kbdinit(void)
{
}
void
lastresortprint(char *buf, long bp)
{

View file

@ -25,8 +25,6 @@ dev
draw screen
dss
kbmap
kbin
mouse
uart
@ -73,10 +71,11 @@ port
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

File diff suppressed because it is too large Load diff

View file

@ -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++;
}
}

View file

@ -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);

View file

@ -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; 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;
}
}

View file

@ -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;

View file

@ -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

View file

@ -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);

View file

@ -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;
}

View file

@ -24,7 +24,6 @@ PORT=\
dev.$O\
edf.$O\
fault.$O\
latin1.$O\
page.$O\
parse.$O\
pgrp.$O\

View file

@ -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 *);

View file

@ -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;

View file

@ -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;

View file

@ -1,76 +0,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;
}

View file

@ -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;

View file

@ -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*);

View file

@ -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

View file

@ -19,7 +19,6 @@ PORT=\
dev.$O\
edf.$O\
fault.$O\
latin1.$O\
log.$O\
rebootcmd.$O\
page.$O\

View file

@ -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 ***/

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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

View file

@ -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;

View file

@ -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;

View file

@ -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