--- researchv9/sys/sundev/kbdld.c 2018/04/24 17:21:59 1.1 +++ researchv9/sys/sundev/kbdld.c 2018/04/24 17:30:59 1.1.1.2 @@ -23,6 +23,7 @@ extern int nkeytables; extern struct keyboard *keytables[]; extern char keystringtab[16][KTAB_STRLEN]; +#define BUSY 02 #define TIMEOUT 04 struct kbdld { @@ -165,14 +166,25 @@ register struct kbdld *k; kbdstart(k) register struct kbdld *k; { - register s; + int kbdtocons(); + + if (k->cons_q==NULL) + return; + if ((k->c_state & (BUSY|TIMEOUT|TTSTOP))==0 && k->cons_q->count) { + k->c_state |= BUSY; + softcall(kbdtocons, (caddr_t)k); + } +} + +kbdtocons(k) +register struct kbdld *k; +{ register struct block *bp; register u_char *cp; if (k->cons_q==NULL) return; - s = spl1(); - while ((k->c_state & (TIMEOUT|TTSTOP))==0 && k->cons_q->count) { + while ((k->c_state & TTSTOP)==0 && k->cons_q->count) { bp = getq(k->cons_q); switch (bp->type) { @@ -186,17 +198,17 @@ register struct kbdld *k; break; case M_DELAY: - timeout(kbdtime, (caddr_t)k, (int)*bp->rptr); k->c_state |= TIMEOUT; + k->c_state &= ~BUSY; + timeout(kbdtime, (caddr_t)k, (int)*bp->rptr); freeb(bp); - splx(s); return; default: freeb(bp); break; } } - splx(s); + k->c_state &= ~BUSY; } kbdldin(q, bp)