From 31e6bc5be21461c321f8e07e452eaae4c89e802b Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 22 Aug 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-08-22 --- pc/clock.c | 34 ---------------------------------- pc/devuart.c | 12 +++++++----- pc/kbd.c | 19 ++++++++++--------- pc/trap.c | 9 +++++++-- 4 files changed, 24 insertions(+), 50 deletions(-) diff --git a/pc/clock.c b/pc/clock.c index 2c9aa7ce432cff499d27a4c14dca2ebf79a8a27e..1e03c516f11752f3876d16bccf4dfa7e74181804 100644 --- a/pc/clock.c +++ b/pc/clock.c @@ -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); -} diff --git a/pc/devuart.c b/pc/devuart.c index 0d31c6fcfea7d103c7e68fd4bf2ec6cb471df21e..e83e6f88e2481ea8377a502da7065143c276c57e 100644 --- a/pc/devuart.c +++ b/pc/devuart.c @@ -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 */ @@ -282,11 +289,6 @@ uartenable(Uart *up) print("can't turn on serial port power\n"); } - /* - * speed up the clock to poll the uart - fclockinit(); - */ - /* * set up i/o routines */ diff --git a/pc/kbd.c b/pc/kbd.c index ee8e37f3501204698894594d3d01e811eb976645..964bf98083b7a9575ba2f47ea388cd59fb3aa5b5 100644 --- a/pc/kbd.c +++ b/pc/kbd.c @@ -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; diff --git a/pc/trap.c b/pc/trap.c index 409c93c17a09c695c640d0281ced8755e557a749..3344347bf421d09ed18818f0afbe308726dbaf22 100644 --- a/pc/trap.c +++ b/pc/trap.c @@ -190,6 +190,12 @@ trap(Ureg *ur) outb(Int0ctl, EOI); } + /* + * 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 */ @@ -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);