M boot/aux.c => boot/aux.c +4 -2
@@ 129,12 129,14 @@ outin(char *prompt, char *def, int len)
int n;
char buf[256];
- alarm(60*1000);
+ if(cpuflag)
+ alarm(60*1000);
do{
print("%s[%s]: ", prompt, *def ? def : "no default");
n = read(0, buf, len);
}while(n==0);
- alarm(0);
+ if(cpuflag)
+ alarm(0);
if(n < 0)
fatal("can't read #c/cons or timeout; please reboot");
if(n != 1){
M pc/mmu.c => pc/mmu.c +21 -13
@@ 195,24 195,13 @@ flushmmu(void)
{
int s;
Proc *p;
- Page *pg;
- ulong *top;
if(u == 0)
return;
-
p = u->p;
+ p->newtlb = 1;
s = splhi();
- if(p->mmutop && p->mmuused){
- top = (ulong*)p->mmutop->va;
- for(pg = p->mmuused; pg->next; pg = pg->next)
- top[pg->daddr] = 0;
- top[pg->daddr] = 0;
- pg->next = p->mmufree;
- p->mmufree = p->mmuused;
- p->mmuused = 0;
- }
- mapstack(u->p);
+ mapstack(p);
splx(s);
}
@@ 227,10 216,29 @@ mapstack(Proc *p)
ulong tlbphys;
int i;
Page *pg;
+ ulong *top;
if(p->upage->va != (USERADDR|(p->pid&0xFFFF)) && p->pid != 0)
panic("mapstack %d 0x%lux 0x%lux", p->pid, p->upage->pa, p->upage->va);
+ if(p->newtlb){
+ /*
+ * bin the current second level page tables. newtlb
+ * set means that they are inconsistent with the segment.c
+ * data structures.
+ */
+ if(p->mmutop && p->mmuused){
+ top = (ulong*)p->mmutop->va;
+ for(pg = p->mmuused; pg->next; pg = pg->next)
+ top[pg->daddr] = 0;
+ top[pg->daddr] = 0;
+ pg->next = p->mmufree;
+ p->mmufree = p->mmuused;
+ p->mmuused = 0;
+ }
+ p->newtlb = 0;
+ }
+
/* map in u area */
upt[0] = PPN(p->upage->pa) | PTEVALID | PTEKERNEL | PTEWRITE;
M port/devcons.c => port/devcons.c +5 -0
@@ 331,6 331,7 @@ enum{
Qconsctl,
Qcputime,
Qcrypt,
+ Qhz,
Qkey,
Qklog,
Qlights,
@@ 355,6 356,7 @@ Dirtab consdir[]={
"consctl", {Qconsctl}, 0, 0220,
"cputime", {Qcputime}, 6*NUMSIZE, 0444,
"crypt", {Qcrypt}, 0, 0666,
+ "hz", {Qhz}, NUMSIZE, 0666,
"key", {Qkey}, DESKEYLEN, 0622,
"klog", {Qklog}, 0, 0444,
"lights", {Qlights}, 0, 0220,
@@ 647,6 649,9 @@ consread(Chan *c, void *buf, long n, ulong offset)
case Qmsec:
return readnum(offset, buf, n, TK2MS(MACHP(0)->ticks), NUMSIZE);
+ case Qhz:
+ return readnum(offset, buf, n, HZ, NUMSIZE);
+
case Qsysstat:
j = 0;
xbuf[0] = 0;
M port/devscc.c => port/devscc.c +41 -0
@@ 31,6 31,7 @@ enum
Rx7bits= 1<<6,
Rx6bits= 2<<6,
Rx8bits= 3<<6,
+ Rxbitmask= 3<<6,
/* wr 4 */
ParEven= 3<<0,
@@ 52,6 53,7 @@ enum
Tx7bits= 1<<5,
Tx6bits= 2<<5,
Tx8bits= 3<<5,
+ Txbitmask= 3<<5,
/* wr 9 */
IntEna= 1<<3,
@@ 187,6 189,40 @@ sccparity(SCC *sp, char type)
}
/*
+ * set bits/character, default 8
+ */
+void
+sccbits(SCC *sp, int n)
+{
+ int val;
+ int rbits, tbits;
+
+ switch(n){
+ case 5:
+ rbits = Rx5bits;
+ tbits = Tx5bits;
+ break;
+ case 6:
+ rbits = Rx6bits;
+ tbits = Tx6bits;
+ break;
+ case 7:
+ rbits = Rx7bits;
+ tbits = Tx7bits;
+ break;
+ case 8:
+ default:
+ rbits = Rx8bits;
+ tbits = Tx8bits;
+ break;
+ }
+ sp->sticky[3] = (sp->sticky[3]&~Rxbitmask) | rbits;
+ sccwrreg(sp, 3, 0);
+ sp->sticky[5] = (sp->sticky[5]&~Txbitmask) | tbits;
+ sccwrreg(sp, 5, 0);
+}
+
+/*
* toggle DTR
*/
void
@@ 530,6 566,11 @@ sccoput(Queue *q, Block *bp)
case 'd':
sccdtr(sp, n);
break;
+ case 'L':
+ case 'l':
+ sccbits(sp, n);
+ break;
+
case 'P':
case 'p':
sccparity(sp, *(bp->rptr+1));
M port/portdat.h => port/portdat.h +1 -0
@@ 561,6 561,7 @@ struct Proc
ulong twhen;
Rendez *trend;
Proc *tlink;
+ int (*tfn)(void*);
/*
* machine specific MMU goo
M port/proc.c => port/proc.c +11 -1
@@ 313,6 313,15 @@ sleep(Rendez *r, int (*f)(void*), void *arg)
}
}
+int
+tfn(void *arg)
+{
+ Proc *p;
+
+ p = u->p;
+ return MACHP(0)->ticks >= p->twhen || (*p->tfn)(arg);
+}
+
void
tsleep(Rendez *r, int (*fn)(void*), void *arg, int ms)
{
@@ 335,10 344,11 @@ tsleep(Rendez *r, int (*fn)(void*), void *arg, int ms)
p->trend = r;
p->twhen = when;
p->tlink = *i;
+ p->tfn = fn;
*i = p;
unlock(&talarm);
- sleep(r, fn, arg);
+ sleep(r, tfn, arg);
p->twhen = 0;
}