M pc/clock.c => pc/clock.c +0 -34
@@ 94,37 94,3 @@ clock(Ureg *ur)
}
}
}
-
-/*
- * a faster (1 MS) clock tick for a non-interrupting serial port or
- * kernel profiling. m->ticks still increments as usual.
- */
-void
-fclock(Ureg *ur)
-{
- static ulong ticks;
-
- uartintr0(ur); /* poll the serial port */
- if((ticks++ % (FHZ/HZ)) == 0)
- clock(ur);
-}
-
-void
-fclockinit(void)
-{
- int x;
-
- /*
- * set vector for clock interrupts
- */
- setvec(Clockvec, fclock);
-
- /*
- * make clock output a square wave with a 1/FHZ period
- */
- x = splhi();
- outb(Tmode, Load0square);
- outb(T0cntr, (Freq/FHZ)); /* low byte */
- outb(T0cntr, (Freq/FHZ)>>8); /* high byte */
- splx(x);
-}
M pc/devuart.c => pc/devuart.c +7 -5
@@ 36,6 36,7 @@ enum
Loop= (1<<4), /* loop bask */
Lstat= 5, /* line status */
Inready=(1<<0), /* receive buffer full */
+ Overrun=(1<<1), /* we lost an input char */
Outready=(1<<5), /* output buffer full */
Mstat= 6, /* modem status */
Scratch=7, /* scratchpad */
@@ 212,6 213,9 @@ uartintr(Uart *up)
IOQ *cq;
int s, l;
+ /*
+ * the for loop takes care of multiple events per interrupt
+ */
for(;;){
s = uartrdreg(up, Istat);
switch(s){
@@ 229,6 233,9 @@ uartintr(Uart *up)
if(up->delim[ch/8] & (1<<(ch&7)) )
wakeup(&cq->r);
}
+ l = uartrdreg(up, Lstat);
+ if(l & Overrun)
+ screenputc('!');
break;
case 2: /* transmitter empty */
@@ 283,11 290,6 @@ uartenable(Uart *up)
}
/*
- * speed up the clock to poll the uart
- fclockinit();
- */
-
- /*
* set up i/o routines
*/
if(up->oq){
M pc/kbd.c => pc/kbd.c +10 -9
@@ 398,14 398,6 @@ kbdintr0(void)
return 0;
}
- keyup = c&0x80;
- c &= 0x7f;
- if(c > sizeof kbtab){
- print("unknown key %ux\n", c|keyup);
- kbdputc(&kbdq, k1);
- return 0;
- }
-
/*
* e0's is the first of a 2 character sequence
*/
@@ 417,10 409,19 @@ kbdintr0(void)
return 0;
}
+ keyup = c&0x80;
+ c &= 0x7f;
+ if(c > sizeof kbtab){
+ print("unknown key %ux\n", c|keyup);
+ kbdputc(&kbdq, k1);
+ return 0;
+ }
+
if(esc1){
-print("\nescape1 %lux\n", c);
c = kbtabesc1[c];
esc1 = 0;
+ kbdputc(&kbdq, c);
+ return 0;
} else if(esc2){
esc2--;
return 0;
M pc/trap.c => pc/trap.c +7 -2
@@ 191,6 191,12 @@ trap(Ureg *ur)
}
/*
+ * check for a waiting character, the uart is at too low
+ * a priority level to work correctly at 9600 baud.
+ */
+ uartintr0(ur);
+
+ /*
* call the trap routine
*/
(*ivec[v])(ur);
@@ 264,7 270,7 @@ syscall(Ureg *ur)
u->p->pc = ur->pc;
if((ur->cs)&0xffff == KESEL)
panic("recursive system call");
- u->p->insyscall = 0;
+ spllo();
/*
* do something about floating point!!!
@@ 274,7 280,6 @@ syscall(Ureg *ur)
sp = ur->usp;
u->nerrlab = 0;
ret = -1;
- spllo();
if(!waserror()){
if(ax >= sizeof systab/BY2WD){
pprint("bad sys call number %d pc %lux\n", ax, ur->pc);