## diffname port/devcons.c 1990/0227 ## diff -e /dev/null /n/bootesdump/1990/0227/sys/src/9/mips/devcons.c 0a #include "u.h" #include "lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "io.h" #include "errno.h" #include "devtab.h" static struct { Lock; uchar buf[4000]; uchar *in; uchar *out; int printing; int c; }printq; typedef struct IOQ IOQ; #define NQ 4096 struct IOQ{ union{ Lock; QLock; }; uchar buf[NQ]; uchar *in; uchar *out; int state; Rendez r; }; IOQ kbdq; /* qlock to getc; interrupt putc's */ IOQ lineq; /* lock to getc; interrupt putc's */ void printinit(void) { printq.in = printq.buf; printq.out = printq.buf; lock(&printq); /* allocate lock */ unlock(&printq); kbdq.in = kbdq.buf; kbdq.out = kbdq.buf; lineq.in = lineq.buf; lineq.out = lineq.buf; qlock(&kbdq); /* allocate qlock */ qunlock(&kbdq); lock(&lineq); /* allocate lock */ unlock(&lineq); duartinit(); } /* * Put a string on the console. * n bytes of s are guaranteed to fit in the buffer and is ready to print. * Must be called splhi() and with printq locked. */ void puts(char *s, int n) { if(!printq.printing){ printq.printing = 1; printq.c = *s++; n--; } memcpy(printq.in, s, n); printq.in += n; if(printq.in >= printq.buf+sizeof(printq.buf)) printq.in = printq.buf; } /* * Print a string on the console. This is the high level routine * with a queue to the interrupt handler. BUG: There is no check against * overflow. */ void putstrn(char *str, int n) { int s, c, m; char *t; s = splhi(); lock(&printq); while(n > 0){ if(*str == '\n') puts("\r", 1); m = printq.buf+sizeof(printq.buf) - printq.in; if(n < m) m = n; t = memchr(str+1, '\n', m-1); if(t) if(t-str < m) m = t - str; puts(str, m); n -= m; str += m; } unlock(&printq); splx(s); } int cangetc(IOQ *q) { return q->in != q->out; } int isbrkc(IOQ *q) { uchar *p; for(p=q->out; p!=q->in; ){ if(*p==0x04 || *p=='\n') return 1; p++; if(p >= q->buf+sizeof(q->buf)) p = q->buf; } return 0; } int getc(IOQ *q) { int c; if(q->in == q->out) return -1; c = *q->out++; if(q->out == q->buf+sizeof(q->buf)) q->out = q->buf; return c; } int sprint(char *s, char *fmt, ...) { char *out; out = donprint(s, s+PRINTSIZE, fmt, (&fmt+1)); return out-s; } int print(char *fmt, ...) { char buf[PRINTSIZE]; int n; n = donprint(buf, buf+sizeof(buf), fmt, (&fmt+1)) - buf; putstrn(buf, n); return n; } void panic(char *fmt, ...) { char buf[PRINTSIZE]; int n; strcpy(buf, "panic: "); n = donprint(buf+7, buf+sizeof(buf), fmt, (&fmt+1)) - buf; buf[n] = '\n'; putstrn(buf, n+1); exit(); } int pprint(char *fmt, ...) { char buf[2*PRINTSIZE]; Chan *c; int n; c = u->fd[2]; if(c==0 || (c->mode!=OWRITE && c->mode!=ORDWR)) return; n = sprint(buf, "%s %d: ", u->p->text, u->p->pid); n = donprint(buf+n, buf+sizeof(buf), fmt, (&fmt+1)) - buf; qlock(c); if(waserror()){ qunlock(c); return; } (*devtab[c->type].write)(c, buf, n); c->offset += n; qunlock(c); return n; } void prflush(void) { while(printq.printing) delay(100); } /* * Get character to print at interrupt time. * Always called splhi from proc 0. */ int conschar(void) { uchar *p; int c; lock(&printq); p = printq.out; if(p == printq.in){ printq.printing = 0; c = -1; }else{ c = *p++; if(p >= printq.buf+sizeof(printq.buf)) p = printq.buf; printq.out = p; } unlock(&printq); return c; } void echo(int c) { char ch; /* * ^t hack BUG */ if(c == 0x14) DEBUG(); else if(c == 0x0c) LANCEDEBUG(); else if(c == 0x02) LANCEPRDEBQ(); if(c == 0x15) putstrn("^U\n", 3); else{ ch = c; putstrn(&ch, 1); } } /* * Put character into read queue at interrupt time. * Always called splhi from proc 0. */ void kbdchar(int c) { if(c == '\r') c = '\n'; echo(c); *kbdq.in++ = c; if(kbdq.in == kbdq.buf+sizeof(kbdq.buf)) kbdq.in = kbdq.buf; if(c=='\n' || c==0x04) wakeup(&kbdq.r); } void printslave(void) { int c; c = printq.c; if(c){ printq.c = 0; duartxmit(c); } } int consactive(void) { return printq.in != printq.out; } /* * I/O interface */ enum{ Qdir, Qcons, Qcputime, Qnull, Qpgrpid, Qpid, Qppid, Qtime, Quser, }; Dirtab consdir[]={ "cons", Qcons, 0, 0600, "cputime", Qcputime, 72, 0600, "null", Qnull, 0, 0600, "pgrpid", Qpgrpid, 12, 0600, "pid", Qpid, 12, 0600, "ppid", Qppid, 12, 0600, "time", Qtime, 12, 0600, "user", Quser, 0, 0600, }; #define NCONS (sizeof consdir/sizeof(Dirtab)) ulong boottime; /* seconds since epoch at boot */ long seconds(void) { return boottime + MACHP(0)->ticks*MS2HZ/1000; } int readnum(ulong off, char *buf, ulong n, ulong val, int size) { char tmp[64]; Op op = (Op){ tmp, tmp+sizeof(tmp), &val, size-1, 0, FUNSIGN|FLONG }; numbconv(&op, 10); tmp[size-1] = ' '; off %= size; if(off+n > size) n = size-off; memcpy(buf, tmp+off, n); return n; } int readstr(ulong off, char *buf, ulong n, char *str) { int size; size = strlen(str); off %= size; if(off+n > size) n = size-off; memcpy(buf, str+off, n); return n; } void consreset(void) { } void consinit(void) { } Chan* consattach(char *spec) { return devattach('c', spec); } Chan* consclone(Chan *c, Chan *nc) { return devclone(c, nc); } int conswalk(Chan *c, char *name) { return devwalk(c, name, consdir, NCONS, devgen); } void consstat(Chan *c, char *dp) { devstat(c, dp, consdir, NCONS, devgen); } Chan* consopen(Chan *c, int omode) { if(c->qid==Quser && omode==(OWRITE|OTRUNC)){ /* truncate? */ if(strcmp(u->p->pgrp->user, "bootes") == 0) /* BUG */ u->p->pgrp->user[0] = 0; else error(0, Eperm); } return devopen(c, omode, consdir, NCONS, devgen); } void conscreate(Chan *c, char *name, int omode, ulong perm) { error(0, Eperm); } void consclose(Chan *c) { } long consread(Chan *c, void *buf, long n) { int ch, i, j, k; ulong l; uchar *out; char *cbuf = buf; char *user; int userlen; char tmp[6*NUMSIZE]; if(n <= 0) return n; switch(c->qid&~CHDIR){ case Qdir: return devdirread(c, buf, n, consdir, NCONS, devgen); case Qcons: qlock(&kbdq); while(!cangetc(&lineq)){ sleep(&kbdq.r, (int(*)(void*))isbrkc, &kbdq); do{ ch = getc(&kbdq); switch(ch){ case '\b': if(lineq.in != lineq.out){ if(lineq.in == lineq.buf) lineq.in = lineq.buf+sizeof(lineq.buf); lineq.in--; } break; case 0x15: lineq.in = lineq.out; break; default: *lineq.in++ = ch; if(lineq.in == lineq.buf+sizeof(lineq.buf)) lineq.in = lineq.buf; } }while(ch!='\n' && ch!=0x04); } i = 0; while(n>0){ ch = getc(&lineq); if(ch == 0x04 || ch == -1) break; i++; *cbuf++ = ch; --n; } qunlock(&kbdq); return i; case Qcputime: k = c->offset % sizeof tmp; if(k+n > sizeof tmp) n = sizeof tmp - k; /* easiest to format in a separate buffer and copy out */ for(i=0; i<6 && NUMSIZE*ip->time[i]; if(i == TReal) l = MACHP(0)->ticks - l; l *= MS2HZ; readnum(0, tmp+NUMSIZE*i, NUMSIZE, l, NUMSIZE); } memcpy(buf, tmp+k, n); return n; case Qpgrpid: return readnum(c->offset, buf, n, u->p->pgrp->pgrpid, NUMSIZE); case Qpid: return readnum(c->offset, buf, n, u->p->pid, NUMSIZE); case Qppid: return readnum(c->offset, buf, n, u->p->parentpid, NUMSIZE); case Qtime: return readnum(c->offset, buf, n, boottime+MACHP(0)->ticks/(1000/MS2HZ), 12); case Quser: return readstr(c->offset, buf, n, u->p->pgrp->user); case Qnull: return 0; default: panic("consread %lux\n", c->qid); return 0; } } long conswrite(Chan *c, void *va, long n) { char cbuf[64]; char buf[256]; long l, m; char *a = va; switch(c->qid){ case Qcons: /* * Damn. Can't page fault in putstrn, so copy the data locally. */ l = n; while(l > 0){ m = l; if(m > sizeof buf) m = sizeof buf; memcpy(buf, a, m); putstrn(a, m); a += m; l -= m; } break; case Qtime: if(n<=0 || boottime!=0) /* only one write please */ return 0; if(n >= sizeof cbuf) n = sizeof cbuf - 1; memcpy(cbuf, a, n); cbuf[n-1] = 0; boottime = strtoul(a, 0, 0); break; case Quser: if(u->p->pgrp->user[0]) /* trying to overwrite /dev/user */ error(0, Eperm); if(c->offset >= NAMELEN-1) return 0; if(c->offset+n >= NAMELEN-1) n = NAMELEN-1 - c->offset; memcpy(u->p->pgrp->user+c->offset, a, n); u->p->pgrp->user[c->offset+n] = 0; break; case Qcputime: case Qpgrpid: case Qpid: case Qppid: error(0, Eperm); case Qnull: break; default: error(0, Egreg); } return n; } void consremove(Chan *c) { error(0, Eperm); } void conswstat(Chan *c, char *dp) { error(0, Eperm); } void conserrstr(Error *e, char *buf) { rooterrstr(e, buf); } void consuserstr(Error *e, char *buf) { strcpy(buf, u->p->pgrp->user); } . ## diffname port/devcons.c 1990/03042 ## diff -e /n/bootesdump/1990/0227/sys/src/9/mips/devcons.c /n/bootesdump/1990/03042/sys/src/9/mips/devcons.c 241,244d ## diffname port/devcons.c 1990/03091 ## diff -e /n/bootesdump/1990/03042/sys/src/9/mips/devcons.c /n/bootesdump/1990/03091/sys/src/9/mips/devcons.c 235a . 147,150c return donprint(s, s+PRINTSIZE, fmt, (&fmt+1)) - s; . ## diffname port/devcons.c 1990/0312 ## diff -e /n/bootesdump/1990/03091/sys/src/9/mips/devcons.c /n/bootesdump/1990/0312/sys/src/9/mips/devcons.c 458c k = c->offset; if(k >= sizeof tmp) return 0; . 339c if(off >= size) return 0; . 326c if(off >= size) return 0; . ## diffname port/devcons.c 1990/0321 ## diff -e /n/bootesdump/1990/0312/sys/src/9/mips/devcons.c /n/bootesdump/1990/0321/sys/src/9/mips/devcons.c 193a poperror(); . 189c return 0; . 183c return 0; . ## diffname port/devcons.c 1990/0504 ## diff -e /n/bootesdump/1990/0321/sys/src/9/mips/devcons.c /n/bootesdump/1990/0504/sys/src/9/mips/devcons.c 241a if(c == 0x16) dumpqueues(); . ## diffname port/devcons.c 1990/06111 ## diff -e /n/bootesdump/1990/0504/sys/src/9/mips/devcons.c /n/bootesdump/1990/06111/sys/src/9/mips/devcons.c 185c n = doprint(buf+n, buf+sizeof(buf), fmt, (&fmt+1)) - buf; . 168c n = doprint(buf+7, buf+sizeof(buf), fmt, (&fmt+1)) - buf; . 156c n = doprint(buf, buf+sizeof(buf), fmt, (&fmt+1)) - buf; . 147c return doprint(s, s+PRINTSIZE, fmt, (&fmt+1)) - s; . ## diffname port/devcons.c 1990/0614 ## diff -e /n/bootesdump/1990/06111/sys/src/9/mips/devcons.c /n/bootesdump/1990/0614/sys/src/9/mips/devcons.c 489c return readnum(c->offset, buf, n, boottime+TK2MS(MACHP(0)->ticks), 12); . 473c l = TK2MS(l); . 318c return boottime + TK2MS(MACHP(0)->ticks); . ## diffname port/devcons.c 1990/0617 ## diff -e /n/bootesdump/1990/0614/sys/src/9/mips/devcons.c /n/bootesdump/1990/0617/sys/src/9/mips/devcons.c 489c return readnum(c->offset, buf, n, boottime+TK2SEC(MACHP(0)->ticks), 12); . 427a if(waserror()){ qunlock(&kbdq); nexterror(); } . ## diffname port/devcons.c 1990/0620 ## diff -e /n/bootesdump/1990/0617/sys/src/9/mips/devcons.c /n/bootesdump/1990/0620/sys/src/9/mips/devcons.c 318c return boottime + TK2SEC(MACHP(0)->ticks); . ## diffname port/devcons.c 1990/0629 ## diff -e /n/bootesdump/1990/0620/sys/src/9/mips/devcons.c /n/bootesdump/1990/0629/sys/src/9/mips/devcons.c 243c urpdump(); . ## diffname port/devcons.c 1990/0707 ## diff -e /n/bootesdump/1990/0629/sys/src/9/mips/devcons.c /n/bootesdump/1990/0707/sys/src/9/mips/devcons.c 243c dumpqueues(); . ## diffname port/devcons.c 1990/0718 ## diff -e /n/bootesdump/1990/0707/sys/src/9/mips/devcons.c /n/bootesdump/1990/0718/sys/src/9/mips/devcons.c 91a syslog(str, n); . ## diffname port/devcons.c 1990/0720 ## diff -e /n/bootesdump/1990/0718/sys/src/9/mips/devcons.c /n/bootesdump/1990/0720/sys/src/9/mips/devcons.c 589a } /* * crash info */ void sysloginit(void) { Syslog *s; char *p; s = SYSLOG; if(s->magic!=SYSLOGMAGIC || s->next>=&s->buf[sizeof(s->buf)] || s->nextbuf){ s->next = s->buf; s->magic = SYSLOGMAGIC; } } void syslog(char *p, int n) { int i; Syslog *s; char *end; s = SYSLOG; end = &s->buf[sizeof(s->buf)]; while(n-- > 0){ *s->next++ = *p++; if(s->next >= end) s->next = s->buf; } } long readlog(ulong off, char *buf, ulong n) { Syslog *s; int i; char *p; char *end; s = SYSLOG; /* past end */ if(off >= sizeof(s->buf)) return 0; /* trim length */ if(off + n >= sizeof(s->buf)) n = sizeof(s->buf) - off; /* point to start of area to be read */ end = &s->buf[sizeof(s->buf)]; p = s->next + off; if(p > end) p -= sizeof(s->buf); for(i = 0; i < n; i++){ *buf++ = *p++; if(p >= end) p = s->buf; } return n; . 498a case Qlog: return readlog(c->offset, buf, n); . 303a "log", Qlog, sizeof(SYSLOG->buf), 0600, . 292a Qlog, . ## diffname port/devcons.c 1990/0907 ## diff -e /n/bootesdump/1990/0720/sys/src/9/mips/devcons.c /n/bootesdump/1990/0907/sys/src/9/mips/devcons.c 171a dumpstack(); . ## diffname port/devcons.c 1990/0912 ## diff -e /n/bootesdump/1990/0907/sys/src/9/mips/devcons.c /n/bootesdump/1990/0912/sys/src/9/mips/devcons.c 660c return a-buf; . 655,656c /* skip offset */ while(off-- > 0){ if(p == s->next) return 0; p++; } /* copy out */ while(n-- > 0){ if(p == s->next) break; *a++ = *p++; . 651,653c p = s->start; . 645,648d 637a char *a = buf; . 635d 628a if(restart){ s->start = s->next + 1; if(s->start >= end) s->start = s->buf; } wbflush(); . 627a if(s->next == s->start) restart = 1; . 623a restart = 0; . 618c int restart; . 609c || s->start>=&s->buf[sizeof(s->buf)] || s->nextbuf){ s->start = s->buf; . 600a #define SYSLOGMAGIC 0x23456789 #define SYSLOG ((Syslog *)(UNCACHED | KZERO | 0x1B00)) typedef struct Syslog Syslog; struct Syslog { ulong magic; char *start; char *next; char buf[BY2PG - 3*BY2WD]; }; . 599c * kernel based system log, passed between crashes . 306c "log", Qlog, BY2PG-8, 0600, . ## diffname port/devcons.c 1990/0928 ## diff -e /n/bootesdump/1990/0912/sys/src/9/mips/devcons.c /n/bootesdump/1990/0928/sys/src/9/mips/devcons.c 624a print("start/next is %lux/%lux was %lux/%lux\n", s->start, s->next, start, next); . 619,620c next = s->next; start = s->start; if(s->magic!=SYSLOGMAGIC || next>=&s->buf[sizeof(s->buf)] || start>=&s->buf[sizeof(s->buf)] || nextbuf){ . 616c char *start, *next; . 601,611d 172a s = SYSLOG; print("start/next is %lux/%lux\n", s->start, s->next); . 166a Syslog *s; . 57a sysloginit(); /* must be at the end of printinit */ . 38a #define SYSLOGMAGIC 0x23456789 #define SYSLOG ((Syslog *)(UNCACHED | KZERO | 0x1B00)) typedef struct Syslog Syslog; struct Syslog { ulong magic; char *start; char *next; char buf[2*BY2PG - 3*BY2WD]; }; . ## diffname port/devcons.c 1990/1018 ## diff -e /n/bootesdump/1990/0928/sys/src/9/mips/devcons.c /n/bootesdump/1990/1018/sys/src/9/mips/devcons.c 686,694c wbflush(); . 679,684c x = splhi(); lock(&printq); for(p = s->buf; p < end; p++) *p = *p; unlock(&printq); splx(x); . 677d 675c while(n > 0){ if(start + n > end) m = end - start; else m = n; memcpy(p, start, m); start += m; p += m; n -= m; if(start >= end) start = s->buf; } return p-buf; } /* * Read and write every byte of the log. This seems to ensure that * on reboot, the bytes will really be in memory. I don't understand -- presotto */ void flushsyslog(void) { Syslog *s; char *p, *end; int x; s = SYSLOG; . 673a if(off + n > m) n = m - off; start += off; if(start > end) start -= sizeof(s->buf); . 671,672c if(s->wrapped){ start = s->next; m = sizeof(s->buf); } else { start = s->buf; m = s->next - start; } if(off > m) . 669a end = &s->buf[sizeof(s->buf)]; . 668a n = len; p = buf; sysloginit(); . 667c char *start; int n, m; char *p; . 665d 662c readlog(ulong off, char *buf, ulong len) . 653,657d 650,651c } . 645,648c while(n){ if(s->next + n > end) m = end - s->next; else m = n; memcpy(s->next, p, m); s->next += m; p += m; n -= m; if(s->next >= end){ s->wrapped = 1; . 642a sysloginit(); . 641a int m; . 639d 632,633d 624,628c if(s->magic!=SYSLOGMAGIC || s->next>=&s->buf[sizeof(s->buf)] || s->nextbuf){ s->wrapped = 0; . 621c int i; . 323a /* "panic", Qpanic, 0, 0666, /**/ . 311a /* Qpanic, /**/ . 187,188d 180d 70d 47c char buf[2*1024]; . 45c int wrapped; . 39,40c #define SYSLOGMAGIC 0xdeadbeaf #define SYSLOG ((Syslog *)(UNCACHED | 0x1B00)) . ## diffname port/devcons.c 1990/11161 ## diff -e /n/bootesdump/1990/1018/sys/src/9/mips/devcons.c /n/bootesdump/1990/11161/sys/src/9/mips/devcons.c 581a case Qvmereset: if(strcmp(u->p->pgrp->user, "bootes") != 0) error(0, Eperm); vmereset(); break; . 326a "vmereset", Qvmereset, 0, 0600, . 313a Qvmereset, . ## diffname port/devcons.c 1990/11211 ## diff -e /n/bootesdump/1990/11161/sys/src/9/mips/devcons.c /n/bootesdump/1990/11211/sys/src/9/mips/devcons.c 606,618c error(Eperm); . 600c error(Eperm); . 592c error(Egreg); . 587c error(Eperm); . 580c error(Eperm); . 567c error(Eperm); . 538c switch(c->qid.path){ . 442c switch(c->qid.path & ~CHDIR){ . 421c error(Eperm); . 413c error(Eperm); . 408c if(c->qid.path==Quser && omode==(OWRITE|OTRUNC)){ . 318,328c "cons", {Qcons}, 0, 0600, "cputime", {Qcputime}, 72, 0600, "log", {Qlog}, BY2PG-8, 0600, "null", {Qnull}, 0, 0600, /* "panic", {Qpanic}, 0, 0666, /**/ "pgrpid", {Qpgrpid}, 12, 0600, "pid", {Qpid}, 12, 0600, "ppid", {Qppid}, 12, 0600, "time", {Qtime}, 12, 0600, "user", {Quser}, 0, 0600, "vmereset", {Qvmereset}, 0, 0600, . ## diffname port/devcons.c 1990/1231 ## diff -e /n/bootesdump/1990/11211/sys/src/9/mips/devcons.c /n/bootesdump/1990/1231/sys/src/9/mips/devcons.c 257a if(c == 0xe) nonettoggle(); if(c == 0xc) lancetoggle(); . ## diffname port/devcons.c 1991/0318 ## diff -e /n/bootesdump/1991/0201/sys/src/9/mips/devcons.c /n/bootesdump/1991/0318/sys/src/9/power/devcons.c 694c memmove(p, start, m); . 645c memmove(s->next, p, m); . 576c memmove(u->p->pgrp->user+c->offset, a, n); . 564c memmove(cbuf, a, n); . 552c memmove(buf, a, m); . 504c memmove(buf, tmp+k, n); . 371c memmove(buf, str+off, n); . 357c memmove(buf, tmp+off, n); . 85c memmove(printq.in, s, n); . ## diffname port/devcons.c 1991/0327 ## diff -e /n/bootesdump/1991/0318/sys/src/9/power/devcons.c /n/bootesdump/1991/0327/sys/src/9/power/devcons.c 274a if(c == 0) /* NULs cause trouble */ return; . 251a if(c == 0x10) panic("^p"); . ## diffname port/devcons.c 1991/0403 ## diff -e /n/bootesdump/1991/0327/sys/src/9/power/devcons.c /n/bootesdump/1991/0403/sys/src/9/power/devcons.c 252c if(c == 0x18) . ## diffname port/devcons.c 1991/0411 ## diff -e /n/bootesdump/1991/0403/sys/src/9/power/devcons.c /n/bootesdump/1991/0411/sys/src/9/power/devcons.c 578,581c if(offset+n >= NAMELEN-1) n = NAMELEN-1 - offset; memmove(u->p->pgrp->user+offset, a, n); u->p->pgrp->user[offset+n] = 0; . 576c if(offset >= NAMELEN-1) . 539c conswrite(Chan *c, void *va, long n, ulong offset) . 527c return readlog(offset, buf, n); . 524c return readstr(offset, buf, n, u->p->pgrp->user); . 521c return readnum(offset, buf, n, boottime+TK2SEC(MACHP(0)->ticks), 12); . 518c return readnum(offset, buf, n, u->p->parentpid, NUMSIZE); . 515c return readnum(offset, buf, n, u->p->pid, NUMSIZE); . 512c return readnum(offset, buf, n, u->p->pgrp->pgrpid, NUMSIZE); . 495c k = offset; . 438c consread(Chan *c, void *buf, long n, ulong offset) . 207c qunlock(&c->wrl); . 205c (*devtab[c->type].write)(c, buf, n, c->offset); . 202c qunlock(&c->wrl); . 200c qlock(&c->wrl); . ## diffname port/devcons.c 1991/0419 ## diff -e /n/bootesdump/1991/0411/sys/src/9/power/devcons.c /n/bootesdump/1991/0419/sys/src/9/power/devcons.c 406a Chan* consclwalk(Chan *c, char *name) { return devclwalk(c, name); } . ## diffname port/devcons.c 1991/0421 ## diff -e /n/bootesdump/1991/0419/sys/src/9/power/devcons.c /n/bootesdump/1991/0421/sys/src/9/power/devcons.c 252c if(c == 0x10) . ## diffname port/devcons.c 1991/0425 ## diff -e /n/bootesdump/1991/0421/sys/src/9/power/devcons.c /n/bootesdump/1991/0425/sys/src/9/power/devcons.c 604a break; . 603a case Qsysstat: for(id = 0; id < 32; id++) { if(active.machs & (1<cs = 0; mp->intr = 0; mp->syscall = 0; mp->pfault = 0; mp->tlbfault = 0; mp->tlbpurge = 0; mp->spinlock = 0; } } . 550a Mach *mp; . 549a int id; . 534a case Qsysstat: j = 0; for(id = 0; id < 32; id++) { if(active.machs & (1<cs, mp->intr, mp->syscall, mp->pfault, mp->tlbfault, mp->tlbpurge, mp->spinlock); } } return readstr(offset, buf, n, xbuf); . 452c char tmp[6*NUMSIZE], xbuf[512]; Mach *mp; . 446c int ch, i, j, k, id; . 336a "sysstat", {Qsysstat}, 0, 0600, . 322a Qsysstat, . ## diffname port/devcons.c 1991/0427 ## diff -e /n/bootesdump/1991/0425/sys/src/9/power/devcons.c /n/bootesdump/1991/0427/sys/src/9/power/devcons.c 409,414d ## diffname port/devcons.c 1991/0607 ## diff -e /n/bootesdump/1991/0427/sys/src/9/power/devcons.c /n/bootesdump/1991/0607/sys/src/9/power/devcons.c 646,761d 629a . 628d 614a case Qlights: conslights(a, n); break; . 610,613c case Qnoise: consnoise(a, n); . 563a case Qrcons: . 561a int id; . 559d 552a void conslights(char *a, int n) { int l; char line[128]; char *lp; int c; lp = line; while(n--){ *lp++ = c = *a++; if(c=='\n' || n==0 || lp==&line[sizeof(line)-1]) break; } *lp = 0; lights(strtoul(line, 0, 0)); } void consnoise(char *a, int n) { int freq; int duration; char line[128]; char *lp; int c; lp = line; while(n--){ *lp++ = c = *a++; if(c=='\n' || n==0 || lp==&line[sizeof(line)-1]){ *lp = 0; freq = strtoul(line, &lp, 0); while(*lp==' ' || *lp=='\t') lp++; duration = strtoul(lp, &lp, 0); buzz(freq, duration); lp = line; } } } . 544,545d 542d 539c mp->tlbfault, mp->tlbpurge, m->spinlock); . 531a case Qklog: qlock(&klogq); if(waserror()){ qunlock(&klogq); nexterror(); } while(!cangetc(&klogq)) sleep(&klogq.r, cangetc, &klogq); for(i=0; iticks), NUMSIZE); . 529,530c case Qnull: return 0; . 525a case Qclock: k = offset; if(k >= 2*NUMSIZE) return 0; if(k+n > 2*NUMSIZE) n = 2*NUMSIZE - k; readnum(0, tmp, NUMSIZE, MACHP(0)->ticks, NUMSIZE); readnum(0, tmp+NUMSIZE, NUMSIZE, HZ, NUMSIZE); memmove(buf, tmp+k, n); return n; . 488c if(ch==-1 || (raw.ref==0 && ch==0x04)) . 486c while(n > 0){ . 483c unlock(&lineq); }while(raw.ref==0 && ch!='\n' && ch!=0x04); . 479,481c *lineq.in = ch; if(lineq.in >= lineq.buf+sizeof(lineq.buf)-1) lineq.in = lineq.buf; else lineq.in++; . 477a Default: . 466a if(raw.ref){ unlock(&lineq); goto Default; } . 465a lock(&lineq); . 464c sleep(&kbdq.r, isbrkc, &kbdq); . 456a case Qrcons: . 448c char tmp[6*NUMSIZE], xbuf[1024]; . 438a . 436a if(c->qid.path==Qrcons && (c->flag&COPEN)) decref(&raw); . 418,423c int ch; switch(c->qid.path){ case Quser: if(omode==(OWRITE|OTRUNC)){ /* truncate? */ if(strcmp(u->p->pgrp->user, "bootes") == 0) /* BUG */ u->p->pgrp->user[0] = 0; else error(Eperm); } break; case Qrcons: if(incref(&raw) == 1){ lock(&lineq); while((ch=getc(&kbdq)) != -1){ *lineq.in++ = ch; if(lineq.in == lineq.buf+sizeof(lineq.buf)) lineq.in = lineq.buf; } unlock(&lineq); } break; . 327,338c "cons", {Qcons}, 0, 0600, "cputime", {Qcputime}, 6*NUMSIZE, 0600, "lights", {Qlights}, 0, 0600, "noise", {Qnoise}, 0, 0600, "null", {Qnull}, 0, 0600, "pgrpid", {Qpgrpid}, NUMSIZE, 0600, "pid", {Qpid}, NUMSIZE, 0600, "ppid", {Qppid}, NUMSIZE, 0600, "rcons", {Qrcons}, 0, 0600, "time", {Qtime}, NUMSIZE, 0600, "user", {Quser}, 0, 0600, "klog", {Qklog}, 0, 0400, "msec", {Qmsec}, NUMSIZE, 0400, "clock", {Qclock}, 2*NUMSIZE, 0400, "sysstat", {Qsysstat}, 0, 0600, . 322c Qklog, Qmsec, Qclock, . 319a Qrcons, . 316d 314c Qlights, Qnoise, . 298a if(++kbdq.count&1) kbdputc(&kbdq, kbdq.c); . 294,297c void kbdclock(void) { if(kbdq.repeat == 0) return; if(kbdq.repeat==1 && ++kbdq.count>HZ){ kbdq.repeat = 2; kbdq.count = 0; return; . 292c kbdq.repeat = rep; kbdq.count = 0; } . 290c kbdrepeat(int rep) . 286a return 0; . 285c if(raw.ref || ch=='\n' || ch==0x04) . 277,282c echo(ch); kbdq.c = ch; *kbdq.in++ = ch; . 274,275c int kbdputc(IOQ *q, int ch) . 258,263d 254,255c /* * ^t hack BUG */ if(ctrlt == 2){ ctrlt = 0; switch(c){ case 0x14: break; /* pass it on */ case 'm': mntdump(); return; case 'p': DEBUG(); return; case 'q': dumpqueues(); return; case 'r': exit(); break; } }else if(c == 0x14){ ctrlt++; return; } ctrlt = 0; if(raw.ref) return; . 250c * ^p hack . 247a static int ctrlt; . 219,243d 215,216c while(printq.in != printq.out) ; . 173a int kprint(char *fmt, ...) { char buf[PRINTSIZE]; int n; n = doprint(buf, buf+sizeof(buf), fmt, (&fmt+1)) - buf; klogputs(buf, n); return n; } . 145,157d 134a if(raw.ref) return 1; . 130c isbrkc(KIOQ *q) . 126c int s, m; uchar *nextin; s = splhi(); lock(&klogq); while(n){ m = &klogq.buf[NQ] - klogq.in; if(m > n) m = n; memmove(klogq.in, str, m); n -= m; str += m; nextin = klogq.in + m; if(nextin >= &klogq.buf[NQ]) klogq.in = klogq.buf; else klogq.in = nextin; } unlock(&klogq); splx(s); wakeup(&klogq.r); . 123,124c /* * Print a string in the kernel log. Ignore overflow. */ void klogputs(char *str, long n) . 119,120d 115c if(printq.puts) (*printq.puts)(&printq, str, m); screenputs(str, m); . 106,110c if(printq.puts && *str=='\n') (*printq.puts)(&printq, "\r", 1); m = n; . 102,104d 92,94c * Print a string on the console. Convert \n to \r\n . 80,88c initq(&printq); initq(&lineq); initq(&kbdq); kbdq.putc = kbdputc; initq(&klogq); initq(&mouseq); mouseq.putc = mouseputc; . 78c printinit(void) . 73,75c * init the queues and set the output routine . 36,71d 23,34c Ref raw; /* whether kbd i/o is raw (rcons is open) */ . 21c IOQ lineq; /* lock to getc; interrupt putc's */ IOQ printq; IOQ mouseq; KIOQ kbdq; . 11,19c struct { IOQ; /* lock to klogputs */ QLock; /* qlock to getc */ } klogq; . ## diffname port/devcons.c 1991/0608 ## diff -e /n/bootesdump/1991/0608/sys/src/9/power/devcons.c /n/bootesdump/1991/0608/sys/src/9/port/devcons.c 204c procdump(); . 191a . 190c if(c==0x10 && conf.cntrlp) . 148c if(conf.cntrlp) exit(); else for(;;); . 29a printq.puts = 0; . ## diffname port/devcons.c 1991/0614 ## diff -e /n/bootesdump/1991/0608/sys/src/9/port/devcons.c /n/bootesdump/1991/0614/sys/src/9/port/devcons.c 499a poperror(); . ## diffname port/devcons.c 1991/0620 ## diff -e /n/bootesdump/1991/0614/sys/src/9/port/devcons.c /n/bootesdump/1991/0620/sys/src/9/port/devcons.c 406a if(conf.cntrlp) error(Eperm); . ## diffname port/devcons.c 1991/0705 ## diff -e /n/bootesdump/1991/0620/sys/src/9/port/devcons.c /n/bootesdump/1991/0705/sys/src/9/port/devcons.c 711a case Qswap: if(n >= sizeof buf) error(Egreg); memmove(buf, va, n); /* so we can NUL-terminate */ buf[n] = 0; fd = strtoul(buf, 0, 0); swc = fdtochan(fd, -1); setswapchan(swc); return n; . 640c int id, fd; Chan *swc; . 583a case Qswap: sprint(xbuf, "%d/%d memory %d/%d swap\n", palloc.user-palloc.freecount, palloc.user, conf.nswap-swapalloc.free, conf.nswap); return readstr(offset, buf, n, xbuf); . 314a "swap", {Qswap}, 0, 0666, . 296a Qswap, . 162c c = u->p->fgrp->fd[2]; . ## diffname port/devcons.c 1991/0717 ## diff -e /n/bootesdump/1991/0705/sys/src/9/port/devcons.c /n/bootesdump/1991/0717/sys/src/9/port/devcons.c 729a kickpager(); . ## diffname port/devcons.c 1991/0720 ## diff -e /n/bootesdump/1991/0717/sys/src/9/port/devcons.c /n/bootesdump/1991/0720/sys/src/9/port/devcons.c 730d 420a case Qswap: kickpager(); /* start a pager if not already started */ break; . 161a if(u->p->fgrp == 0) return 0; . ## diffname port/devcons.c 1991/0723 ## diff -e /n/bootesdump/1991/0720/sys/src/9/port/devcons.c /n/bootesdump/1991/0723/sys/src/9/port/devcons.c 143a print("panic: %lux m=%lux\n", &fmt, m); . 14c }klogq; . ## diffname port/devcons.c 1991/0727 ## diff -e /n/bootesdump/1991/0723/sys/src/9/port/devcons.c /n/bootesdump/1991/0727/sys/src/9/port/devcons.c 237a * turn '\r' into '\n' before putting it into the queue */ int kbdcr2nl(IOQ *q, int ch) { if(ch == '\r') ch = '\n'; return kbdputc(q, ch); } /* . ## diffname port/devcons.c 1991/0807 ## diff -e /n/bootesdump/1991/0727/sys/src/9/port/devcons.c /n/bootesdump/1991/0807/sys/src/9/port/devcons.c 144d ## diffname port/devcons.c 1991/0808 ## diff -e /n/bootesdump/1991/0807/sys/src/9/port/devcons.c /n/bootesdump/1991/0808/sys/src/9/port/devcons.c 61a unlock(&fuck); splx(s); . 47a loop: s = splhi(); if(!canlock(&fuck)){ splx(s); goto loop; } . 46a static Lock fuck; . ## diffname port/devcons.c 1991/0809 ## diff -e /n/bootesdump/1991/0808/sys/src/9/port/devcons.c /n/bootesdump/1991/0809/sys/src/9/port/devcons.c 69,70d 56,67c t = memchr(str, '\n', n); if(t){ m = t - str; memmove(buf, str, m); buf[m] = '\r'; buf[m+1] = '\n'; (*printq.puts)(&printq, buf, m+2); str = t + 1; n -= m + 1; } else { (*printq.puts)(&printq, str, n); break; } . 49,54c /* * if there's an attached bit mapped display, * put the message there. screenputs is defined * as a null macro for systems that have no such * display. */ screenputs(str, n); /* * if there's a serial line being used as a console, * put the message there. Tack a carriage return * before new lines. */ if(printq.puts == 0) return; . 47d 45c char buf[PRINTSIZE+2]; int m; . 40c * Print a string on the console. Convert \n to \r\n for serial * line consoles. Locking of the queues is left up to the screen * or uart code. Multi-line messages to serial consoles may get * interspersed with other messages. . ## diffname port/devcons.c 1991/0911 ## diff -e /n/bootesdump/1991/0809/sys/src/9/port/devcons.c /n/bootesdump/1991/0911/sys/src/9/port/devcons.c 164c strcpy(buf, "inconceivable: "); . ## diffname port/devcons.c 1991/0913 ## diff -e /n/bootesdump/1991/0911/sys/src/9/port/devcons.c /n/bootesdump/1991/0913/sys/src/9/port/devcons.c 628a case Qlights: errors("write only"); . ## diffname port/devcons.c 1991/0920 ## diff -e /n/bootesdump/1991/0913/sys/src/9/port/devcons.c /n/bootesdump/1991/0920/sys/src/9/port/devcons.c 165c n = doprint(buf+strlen(buf), buf+sizeof(buf), fmt, (&fmt+1)) - buf; . ## diffname port/devcons.c 1991/1011 ## diff -e /n/bootesdump/1991/0920/sys/src/9/port/devcons.c /n/bootesdump/1991/1011/sys/src/9/port/devcons.c 767c swc = fdtochan(fd, -1, 1); . 164c strcpy(buf, "panic: "); . ## diffname port/devcons.c 1991/1022 ## diff -e /n/bootesdump/1991/1011/sys/src/9/port/devcons.c /n/bootesdump/1991/1022/sys/src/9/port/devcons.c 227a case 'e': envdump(); return; . ## diffname port/devcons.c 1991/1102 ## diff -e /n/bootesdump/1991/1022/sys/src/9/port/devcons.c /n/bootesdump/1991/1102/sys/src/9/port/devcons.c 790a void setterm(char *f) { char buf[2*NAMELEN]; sprint(buf, f, conffile); ksetenv("terminal", buf); } . ## diffname port/devcons.c 1991/1105 ## diff -e /n/bootesdump/1991/1102/sys/src/9/port/devcons.c /n/bootesdump/1991/1105/sys/src/9/port/devcons.c 728,729c memmove(u->p->user+offset, a, n); u->p->user[offset+n] = 0; . 722c if(u->p->user[0]) /* trying to overwrite /dev/user */ . 589c return readstr(offset, buf, n, u->p->user); . 439,440c if(strcmp(u->p->user, "bootes") == 0) /* BUG */ u->p->user[0] = 0; . ## diffname port/devcons.c 1991/1108 ## diff -e /n/bootesdump/1991/1105/sys/src/9/port/devcons.c /n/bootesdump/1991/1108/sys/src/9/port/devcons.c 228,230d ## diffname port/devcons.c 1991/1109 ## diff -e /n/bootesdump/1991/1108/sys/src/9/port/devcons.c /n/bootesdump/1991/1109/sys/src/9/port/devcons.c 435,436c if(strcmp(u->p->user, eve) == 0) . 22a char eve[NAMELEN] = "bootes"; . 21c Ref raw; /* whether kbd i/o is raw (rcons is open) */ . ## diffname port/devcons.c 1991/1112 ## diff -e /n/bootesdump/1991/1109/sys/src/9/port/devcons.c /n/bootesdump/1991/1112/sys/src/9/port/devcons.c 757d 720,721d 619c mp->tlbfault, mp->tlbpurge, mp->load); . 435,442d 337,351c "cons", {Qcons}, 0, 0666, "cputime", {Qcputime}, 6*NUMSIZE, 0666, "lights", {Qlights}, 0, 0666, "noise", {Qnoise}, 0, 0666, "null", {Qnull}, 0, 0666, "pgrpid", {Qpgrpid}, NUMSIZE, 0666, "pid", {Qpid}, NUMSIZE, 0666, "ppid", {Qppid}, NUMSIZE, 0666, "rcons", {Qrcons}, 0, 0666, "time", {Qtime}, NUMSIZE, 0666, "user", {Quser}, 0, 0644, "klog", {Qklog}, 0, 0444, "msec", {Qmsec}, NUMSIZE, 0444, "clock", {Qclock}, 2*NUMSIZE, 0444, "sysstat", {Qsysstat}, 0, 0444, . ## diffname port/devcons.c 1991/1113 ## diff -e /n/bootesdump/1991/1112/sys/src/9/port/devcons.c /n/bootesdump/1991/1113/sys/src/9/port/devcons.c 623a case Qnoise: return 0; . 605a xbuf[0] = 0; . 478c char tmp[6*NUMSIZE], xbuf[512]; . ## diffname port/devcons.c 1991/1115 ## diff -e /n/bootesdump/1991/1113/sys/src/9/port/devcons.c /n/bootesdump/1991/1115/sys/src/9/port/devcons.c 778a USED(c); . 772a USED(c); . 457a USED(c, name, omode, perm); . 275a USED(q); . ## diffname port/devcons.c 1991/1116 ## diff -e /n/bootesdump/1991/1115/sys/src/9/port/devcons.c /n/bootesdump/1991/1116/sys/src/9/port/devcons.c 696,702c bp = l; if(bp > sizeof buf) bp = sizeof buf; memmove(buf, a, bp); putstrn(a, bp); a += bp; l -= bp; . 682c long l, bp; . ## diffname port/devcons.c 1991/1127 ## diff -e /n/bootesdump/1991/1116/sys/src/9/port/devcons.c /n/bootesdump/1991/1127/sys/src/9/port/devcons.c 783a } /* * Rand is huge and not worth it here. Be small. Borrowed from the white book. */ ulong randn; void srand(char *s) { randn = MACHP(0)->ticks * boottime; while(s && *s) randn = (randn << 1) ^ *s++; } int nrand(int n) { randn = randn*1103515245 + 12345; return (randn>>16) % n; . 782c USED(c, dp); . 766a print("conswrite: %d\n", c->qid.path); . 725,729c case Qchal: if(offset != 0) error(Ebadarg); if(n != 8+NAMELEN+KEYLEN) error(Ebadarg); decrypt(evekey, a, n); if(memcmp(u->p->pgrp->crypt->chal, a, 8) != 0) errors("authentication failure"); strncpy(u->p->user, a+8, NAMELEN); u->p->user[NAMELEN-1] = '\0'; memmove(u->p->pgrp->crypt->key, a+NAMELEN+KEYLEN, KEYLEN); break; . 717,722c if(offset != 0 || n >= NAMELEN-1) error(Ebadarg); if(n==strlen("none") && strncmp(a, "none", n)==0 || n==strlen(u->p->user) && strncmp(a, u->p->user, n)==0 || strcmp(u->p->user, eve)==0){ memmove(u->p->user, a, n); u->p->user[n] = '\0'; }else error(Eperm); if(!conf.cntrlp && strcmp(u->p->user, "none") != 0) memmove(eve, u->p->user, NAMELEN); . 715a case Qcrypt: cb = c->aux; if(!cb){ cb = c->aux = allocb(128); cb->type = 'E'; } if(n < 8){ if(n != 1 || a[0] != 'E' && a[0] != 'D') error(Ebadarg); cb->type = a[0]; return 1; } if(n > cb->lim - cb->base) n = cb->lim - cb->base; memmove(cb->base, a, n); cb->wptr = cb->base + n; if(cb->type == 'E') encrypt(u->p->pgrp->crypt->key, cb->base, n); else decrypt(u->p->pgrp->crypt->key, cb->base, n); break; case Qkey: if(n != KEYLEN) error(Ebadarg); memmove(u->p->pgrp->crypt->key, a, KEYLEN); if(strcmp(u->p->user, eve) == 0) memmove(evekey, a, KEYLEN); break; . 683a Block *cb; . 630,631c print("consread %lux\n", c->qid); error(Egreg); . 625,628d 579a case Qcrypt: cb = c->aux; if(!cb) return 0; if(n > cb->wptr - cb->base) n = cb->wptr - cb->base; memmove(buf, cb->base, n); return n; case Qchal: if(offset != 0 || n != 8) error(Ebadarg); chal = u->p->pgrp->crypt->chal; chal[0] = 0; for(i=1; i<8; i++) chal[i] = nrand(256); memmove(buf, chal, 8); encrypt(evekey, buf, 8); chal[0] = 1; return n; . 479a Block *cb; . 478c char *user, *chal; . 470d 467a if(c->qid.path == Qcrypt && c->aux) freeb(c->aux); c->aux = 0; . 452a c->aux = 0; . 350,352c "sysstat", {Qsysstat}, 0, 0666, . 347,348c "user", {Quser}, 0, 0666, "chal", {Qchal}, 8, 0666, "crypt", {Qcrypt}, 0, 0666, "key", {Qkey}, KEYLEN, 0222, . 343,345c "pgrpid", {Qpgrpid}, NUMSIZE, 0444, "pid", {Qpid}, NUMSIZE, 0444, "ppid", {Qppid}, NUMSIZE, 0444, . 339,341c "cputime", {Qcputime}, 6*NUMSIZE, 0444, "time", {Qtime}, NUMSIZE, 0666, "clock", {Qclock}, 2*NUMSIZE, 0444, "msec", {Qmsec}, NUMSIZE, 0444, "lights", {Qlights}, 0, 0222, "noise", {Qnoise}, 0, 0222, . 334a Qcrypt, Qkey, Qchal, . 23a char evekey[KEYLEN]; . ## diffname port/devcons.c 1991/1206 ## diff -e /n/bootesdump/1991/1127/sys/src/9/port/devcons.c /n/bootesdump/1991/1206/sys/src/9/port/devcons.c 859c * Rand is huge and not worth it here. Be small. * Borrowed from the white book. . 736c if(n<=0 || boottime!=0) /* write once file */ . 721c * Can't page fault in putstrn, so copy the data locally. . 315,317d 271,272c * Put character into read queue at interrupt time. * Always called splhi from processor 0. . 260c * turn '\r' into '\n' before putting it into the queue . ## diffname port/devcons.c 1991/1207 ## diff -e /n/bootesdump/1991/1206/sys/src/9/port/devcons.c /n/bootesdump/1991/1207/sys/src/9/port/devcons.c 796c memmove(u->p->pgrp->crypt->key, a+NAMELEN+DESKEYLEN, DESKEYLEN); . 789c if(n != 8+NAMELEN+DESKEYLEN) . 769c memmove(evekey, a, DESKEYLEN); . 767c memmove(u->p->pgrp->crypt->key, a, DESKEYLEN); . 765c if(n != DESKEYLEN) . 354c "key", {Qkey}, DESKEYLEN, 0222, . 24c char evekey[DESKEYLEN]; . ## diffname port/devcons.c 1991/1211 ## diff -e /n/bootesdump/1991/1207/sys/src/9/port/devcons.c /n/bootesdump/1991/1211/sys/src/9/port/devcons.c 441c if(strcmp(u->p->user, eve) != 0) . 357c "swap", {Qswap}, 0, 0664, . 350c "rcons", {Qrcons}, 0, 0660, . 344,345c "lights", {Qlights}, 0, 0220, "noise", {Qnoise}, 0, 0220, . 341c "time", {Qtime}, NUMSIZE, 0664, . 339c "cons", {Qcons}, 0, 0660, . ## diffname port/devcons.c 1991/1220 ## diff -e /n/bootesdump/1991/1211/sys/src/9/port/devcons.c /n/bootesdump/1991/1220/sys/src/9/port/devcons.c 782c if(!conf.cntrlp && strcmp(eve, "bootes") == 0) . ## diffname port/devcons.c 1991/1223 ## diff -e /n/bootesdump/1991/1220/sys/src/9/port/devcons.c /n/bootesdump/1991/1223/sys/src/9/port/devcons.c 278,283c r = ch; n = runetochar(buf, &r); if(n == 0) return 0; echo(r, buf, n); kbdq.c = r; for(i=0; i= sizeof(buf)) n = sizeof(buf)-1; strncpy(buf, a, n); buf[n] = 0; for(a = buf; a;){ if(strncmp(a, "rawon", 5) == 0){ lock(&lineq); while((ch=getc(&kbdq)) != -1){ *lineq.in++ = ch; if(lineq.in == lineq.buf+sizeof(lineq.buf)) lineq.in = lineq.buf; } unlock(&lineq); lock(&ctl); raw = 1; unlock(&ctl); } else if(strncmp(a, "rawoff", 6) == 0){ lock(&ctl); raw = 0; unlock(&ctl); } if(a = strchr(a, ' ')) a++; . 722d 718c int id, fd, ch; . 545c if(ch==-1 || (raw==0 && ch==0x04)) . 540c }while(raw==0 && ch!='\n' && ch!=0x04); . 516c if(raw){ . 504d 478,479c /* last close of control file turns off raw */ if(c->qid.path==Qconsctl && (c->flag&COPEN)){ lock(&ctl); if(--ctl.ref == 0) raw = 0; unlock(&ctl); } . 450,458c incref(&ctl); . 447c case Qconsctl: . 444,445d 357d 346a "consctl", {Qconsctl}, 0, 0220, . 332d 324a Qconsctl, . 290c if(raw || r=='\n' || r==0x04) . 248c if(raw) . 122c if(raw) . 21c static Ref ctl; /* number of opens to the control file */ static int raw; /* true if raw has been requested on a ctl file */ . ## diffname port/devcons.c 1992/0111 ## diff -e /n/bootesdump/1991/1224/sys/src/9/port/devcons.c /n/bootesdump/1992/0111/sys/src/9/port/devcons.c 821c error(Eauth); . 7c #include "../port/error.h" . ## diffname port/devcons.c 1992/0114 ## diff -e /n/bootesdump/1992/0111/sys/src/9/port/devcons.c /n/bootesdump/1992/0114/sys/src/9/port/devcons.c 821c error(Eperm); . ## diffname port/devcons.c 1992/0129 ## diff -e /n/bootesdump/1992/0114/sys/src/9/port/devcons.c /n/bootesdump/1992/0129/sys/src/9/port/devcons.c 824c memmove(u->p->pgrp->crypt->key, a+8+NAMELEN, DESKEYLEN); . ## diffname port/devcons.c 1992/0213 ## diff -e /n/bootesdump/1992/0129/sys/src/9/port/devcons.c /n/bootesdump/1992/0213/sys/src/9/port/devcons.c 852a if(conf.cntrlp && strcmp(u->p->user, eve) != 0) error(Eperm); . ## diffname port/devcons.c 1992/0226 ## diff -e /n/bootesdump/1992/0213/sys/src/9/port/devcons.c /n/bootesdump/1992/0226/sys/src/9/port/devcons.c 852a kickpager(); /* start a pager if not already started */ . 451,453d ## diffname port/devcons.c 1992/0228 ## diff -e /n/bootesdump/1992/0226/sys/src/9/port/devcons.c /n/bootesdump/1992/0228/sys/src/9/port/devcons.c 856a if(buf[0]<'0' && '9'p->user, eve) != 0) error(Eperm); if(buf[0]<'0' || '9'ticks; . 892,900d ## diffname port/devcons.c 1992/0317 ## diff -e /n/bootesdump/1992/0312/sys/src/9/port/devcons.c /n/bootesdump/1992/0317/sys/src/9/port/devcons.c 382c Op op = { tmp, tmp+sizeof(tmp), &val, size-1, 0, FUNSIGN|FLONG }; . ## diffname port/devcons.c 1992/0318 ## diff -e /n/bootesdump/1992/0317/sys/src/9/port/devcons.c /n/bootesdump/1992/0318/sys/src/9/port/devcons.c 605c chal[0] = RXstick; . 600c chal[0] = RXschal; . 382c Op op = (Op){ tmp, tmp+sizeof(tmp), &val, size-1, 0, FUNSIGN|FLONG }; . ## diffname port/devcons.c 1992/0319 ## diff -e /n/bootesdump/1992/0318/sys/src/9/port/devcons.c /n/bootesdump/1992/0319/sys/src/9/port/devcons.c 242a case 't': tcpdump(); break; . ## diffname port/devcons.c 1992/0320 ## diff -e /n/bootesdump/1992/0319/sys/src/9/port/devcons.c /n/bootesdump/1992/0320/sys/src/9/port/devcons.c 243,245d ## diffname port/devcons.c 1992/0321 ## diff -e /n/bootesdump/1992/0320/sys/src/9/port/devcons.c /n/bootesdump/1992/0321/sys/src/9/port/devcons.c 864a break; case Qsysname: if(offset != 0) error(Ebadarg); if(n <= 0 || n >= NAMELEN) error(Ebadarg); strncpy(sysname, a, n); sysname[n] = 0; if(sysname[n-1] == '\n') sysname[n-1] = 0; . 652a case Qsysname: return readstr(offset, buf, n, sysname); . 364a "sysname", {Qsysname}, 0, 0664, . 343a Qsysname, . 25a char sysname[NAMELEN]; . 2c #include "../port/lib.h" . ## diffname port/devcons.c 1992/0323 ## diff -e /n/bootesdump/1992/0321/sys/src/9/port/devcons.c /n/bootesdump/1992/0323/sys/src/9/port/devcons.c 608a return n; case Qkey: if(offset!=0 || n!=DESKEYLEN) error(Ebadarg); if(strcmp(u->p->user, eve)!=0 || conf.cntrlp==0) error(Eperm); memmove(buf, evekey, DESKEYLEN); . 600c if(offset!=0 || n!=8) . 364c "key", {Qkey}, DESKEYLEN, 0622, . ## diffname port/devcons.c 1992/0409 ## diff -e /n/bootesdump/1992/0323/sys/src/9/port/devcons.c /n/bootesdump/1992/0409/sys/src/9/port/devcons.c 18d 15a IOQ mouseq; . ## diffname port/devcons.c 1992/0411 ## diff -e /n/bootesdump/1992/0409/sys/src/9/port/devcons.c /n/bootesdump/1992/0411/sys/src/9/port/devcons.c 231a case 'd': consdebug(); return; . ## diffname port/devcons.c 1992/0428 ## diff -e /n/bootesdump/1992/0411/sys/src/9/port/devcons.c /n/bootesdump/1992/0428/sys/src/9/port/devcons.c 571a case Qnoteid: return readnum(offset, buf, n, u->p->noteid, NUMSIZE); . 371a "sysname", {Qsysname}, 0, 0664, "sysstat", {Qsysstat}, 0, 0666, "time", {Qtime}, NUMSIZE, 0664, "user", {Quser}, 0, 0666, . 364,370d 359a "noteid", {Qnoteid}, NUMSIZE, 0444, . 358a "msec", {Qmsec}, NUMSIZE, 0444, . 355,357c "crypt", {Qcrypt}, 0, 0666, "key", {Qkey}, DESKEYLEN, 0622, "klog", {Qklog}, 0, 0444, . 351a "chal", {Qchal}, 8, 0666, "clock", {Qclock}, 2*NUMSIZE, 0444, . 348a Qsysstat, Qtime, Quser, . 345,347d 338,343d 333a Qnoteid, . 332a Qmsec, . 331a Qcrypt, Qdir, Qkey, Qklog, . 328c Qchal, Qclock, . ## diffname port/devcons.c 1992/0506 ## diff -e /n/bootesdump/1992/0428/sys/src/9/port/devcons.c /n/bootesdump/1992/0506/sys/src/9/port/devcons.c 334d 327a Qdir, . ## diffname port/devcons.c 1992/0520 ## diff -e /n/bootesdump/1992/0506/sys/src/9/port/devcons.c /n/bootesdump/1992/0520/sys/src/9/port/devcons.c 679a return -1; /* never reached */ . ## diffname port/devcons.c 1992/0522 ## diff -e /n/bootesdump/1992/0520/sys/src/9/port/devcons.c /n/bootesdump/1992/0522/sys/src/9/port/devcons.c 788c boottime = strtoul(a, 0, 0)-TK2SEC(MACHP(0)->ticks); . ## diffname port/devcons.c 1992/0602 ## diff -e /n/bootesdump/1992/0522/sys/src/9/port/devcons.c /n/bootesdump/1992/0602/sys/src/9/port/devcons.c 519d 516,517c if(raw) . ## diffname port/devcons.c 1992/0603 ## diff -e /n/bootesdump/1992/0602/sys/src/9/port/devcons.c /n/bootesdump/1992/0603/sys/src/9/port/devcons.c 610c for(i=1; ip->user, eve) != 0) . 830c if(!cpuserver && strcmp(eve, "bootes")==0) . 823,828c strncpy(buf, a, NAMELEN); if(strcmp(buf, "none")==0 || strcmp(buf, u->p->user)==0 || strcmp(u->p->user, eve)==0) memmove(u->p->user, buf, NAMELEN); else . 821c if(offset!=0 || n>=NAMELEN-1) . 619c if(strcmp(u->p->user, eve)!=0 || !cpuserver) . 220c if(r==0x10 && cpuserver) . 174c if(cpuserver) . ## diffname port/devcons.c 1992/0812 ## diff -e /n/bootesdump/1992/0725/sys/src/9/port/devcons.c /n/bootesdump/1992/0812/sys/src/9/port/devcons.c 244c exit(0); . 221c exit(0); . 174,177c exit(1); . ## diffname port/devcons.c 1992/0814 ## diff -e /n/bootesdump/1992/0812/sys/src/9/port/devcons.c /n/bootesdump/1992/0814/sys/src/9/port/devcons.c 668c return readstr(offset, buf, n, tmp); . 664c sprint(tmp, "%d/%d memory %d/%d swap\n", . 661c n = readstr(offset, buf, n, b); free(b); return n; . 656,658c readnum(0, bp, NUMSIZE, id, NUMSIZE); bp += NUMSIZE; readnum(0, bp, NUMSIZE, mp->cs, NUMSIZE); bp += NUMSIZE; readnum(0, bp, NUMSIZE, mp->intr, NUMSIZE); bp += NUMSIZE; readnum(0, bp, NUMSIZE, mp->syscall, NUMSIZE); bp += NUMSIZE; readnum(0, bp, NUMSIZE, mp->pfault, NUMSIZE); bp += NUMSIZE; readnum(0, bp, NUMSIZE, mp->tlbfault, NUMSIZE); bp += NUMSIZE; readnum(0, bp, NUMSIZE, mp->tlbpurge, NUMSIZE); bp += NUMSIZE; readnum(0, bp, NUMSIZE, mp->load, NUMSIZE); bp += NUMSIZE; *bp++ = '\n'; . 651,652c b = smalloc(conf.nmach*(NUMSIZE*8+1) + 1); /* +1 for NUL */ bp = b; . 492c char tmp[128]; /* must be >= 6*NUMSIZE */ . 490c char *chal, *b, *bp; . 487c int ch, i, k, id; . ## diffname port/devcons.c 1992/0825 ## diff -e /n/bootesdump/1992/0814/sys/src/9/port/devcons.c /n/bootesdump/1992/0825/sys/src/9/port/devcons.c 935,938d 899c swc = fdtochan(fd, -1, 1, 0); . 891c kickpager(); . 889a /* start a pager if not already started */ . 198,199c unlock(c); . 196a lock(c); . 191,195c . ## diffname port/devcons.c 1992/0826 ## diff -e /n/bootesdump/1992/0825/sys/src/9/port/devcons.c /n/bootesdump/1992/0826/sys/src/9/port/devcons.c 820c decrypt(u->p->pgrp->crypt->key, &cb[1], n); . 813,818c if(n > MAXCRYPT) n = MAXCRYPT; memset(&cb[1], 0, MAXCRYPT); memmove(&cb[1], a, n); if(cb[0] == 'E') encrypt(u->p->pgrp->crypt->key, &cb[1], n); . 810c cb[0] = a[0]; . 804,805c /* first byte determines whether encrypting or decrypting */ cb = c->aux = smalloc(MAXCRYPT+1); cb[0] = 'E'; . 741,742c char *a = va, *cb; . 594,596c if(n > MAXCRYPT) n = MAXCRYPT; memmove(buf, &cb[1], n); . 488,489c char *chal, *b, *bp, *cb; . 478c free(c->aux); . ## diffname port/devcons.c 1992/1008 ## diff -e /n/bootesdump/1992/0826/sys/src/9/port/devcons.c /n/bootesdump/1992/1008/sys/src/9/port/devcons.c 839a memset(u->p->pgrp->crypt->key, 0, DESKEYLEN); . ## diffname port/devcons.c 1992/1009 ## diff -e /n/bootesdump/1992/1008/sys/src/9/port/devcons.c /n/bootesdump/1992/1009/sys/src/9/port/devcons.c 840d ## diffname port/devcons.c 1992/1024 ## diff -e /n/bootesdump/1992/1009/sys/src/9/port/devcons.c /n/bootesdump/1992/1024/sys/src/9/port/devcons.c 388c numbconv(&val, &fconv); . 386c Fconv fconv = (Fconv){ tmp, tmp+sizeof(tmp), size-1, 0, 0, 'd' }; . ## diffname port/devcons.c 1993/0120 ## diff -e /n/bootesdump/1992/1024/sys/src/9/port/devcons.c /n/bootesdump/1993/0120/sys/src/9/port/devcons.c 172a xsummary(); . ## diffname port/devcons.c 1993/0121 ## diff -e /n/bootesdump/1993/0120/sys/src/9/port/devcons.c /n/bootesdump/1993/0121/sys/src/9/port/devcons.c 173d ## diffname port/devcons.c 1993/0204 ## diff -e /n/bootesdump/1993/0121/sys/src/9/port/devcons.c /n/bootesdump/1993/0204/sys/src/9/port/devcons.c 386c Fconv fconv = (Fconv){ tmp, tmp+sizeof(tmp), size-1, 0, 0, 'u' }; . ## diffname port/devcons.c 1993/0216 ## diff -e /n/bootesdump/1993/0204/sys/src/9/port/devcons.c /n/bootesdump/1993/0216/sys/src/9/port/devcons.c 197c poperror(); . 188a /* Can't afford to take an error in notify */ if(waserror()) return 0; . 187c if(c == 0 || (c->mode!=OWRITE && c->mode!=ORDWR)) . ## diffname port/devcons.c 1993/0330 ## diff -e /n/bootesdump/1993/0216/sys/src/9/port/devcons.c /n/bootesdump/1993/0330/sys/src/9/port/devcons.c 849,860c case Qauth: return authwrite(c, a, n); case Qauthcheck: return authcheck(c, a, n); . 836,847c return userwrite(a, n); . 834a case Qhostowner: return hostownerwrite(a, n); case Qhostdomain: return hostdomainwrite(a, n); . 828,833c return keywrite(a, n); . 804,826d 745c char *a = va; . 622a case Qhostdomain: return readstr(offset, buf, n, hostdomain); . 615,621c case Qhostowner: return readstr(offset, buf, n, eve); . 603,613c case Qauth: return authread(c, cbuf, n); . 594,601c case Qkey: return keyread(buf, n, offset); . 493c char *b, *bp; . 482,484d 476,480c switch(c->qid.path){ case Qconsctl: if(c->flag&COPEN){ lock(&ctl); if(--ctl.ref == 0) raw = 0; unlock(&ctl); } case Qauth: case Qauthcheck: authclose(c); . 461d 456c if(!iseve()) . 453a c->aux = 0; . 374c "user", {Quser}, NAMELEN, 0664, . 358c "hostdomain", {Qhostdomain}, DOMLEN, 0622, "hostowner", {Qhostowner}, NAMELEN, 0622, . 353c "authenticate", {Qauth}, 0, 0666, "authcheck", {Qauthcheck}, 0, 0666, . 335a Qhostdomain, Qhostowner, . 333d 328c Qauth, Qauthcheck, . 202c . 189,193d 187c if(c==0 || (c->mode!=OWRITE && c->mode!=ORDWR)) . 24,25d ## diffname port/devcons.c 1993/0401 ## diff -e /n/bootesdump/1993/0330/sys/src/9/port/devcons.c /n/bootesdump/1993/0401/sys/src/9/port/devcons.c 190a poperror(); . 189a if(waserror()) return 0; . ## diffname port/devcons.c 1993/0402 ## diff -e /n/bootesdump/1993/0401/sys/src/9/port/devcons.c /n/bootesdump/1993/0402/sys/src/9/port/devcons.c 357,358c "hostdomain", {Qhostdomain}, DOMLEN, 0664, "hostowner", {Qhostowner}, NAMELEN, 0664, . ## diffname port/devcons.c 1993/0404 ## diff -e /n/bootesdump/1993/0402/sys/src/9/port/devcons.c /n/bootesdump/1993/0404/sys/src/9/port/devcons.c 374c "user", {Quser}, NAMELEN, 0666, . ## diffname port/devcons.c 1993/0408 ## diff -e /n/bootesdump/1993/0404/sys/src/9/port/devcons.c /n/bootesdump/1993/0408/sys/src/9/port/devcons.c 558,559c if(k+n > 6*NUMSIZE) n = 6*NUMSIZE - k; . 556c if(k >= 6*NUMSIZE) . ## diffname port/devcons.c 1993/0428 ## diff -e /n/bootesdump/1993/0408/sys/src/9/port/devcons.c /n/bootesdump/1993/0428/sys/src/9/port/devcons.c 806a case Qauthent: return authentwrite(c, a, n); . 602a case Qauthent: return authentread(c, cbuf, n); . 486a break; . 485a case Qauthent: . 483a break; . 352a "authenticator", {Qauthent}, 0, 0666, . 325a Qauthent, . ## diffname port/devcons.c 1993/0501 ## diff -e /n/bootesdump/1993/0428/sys/src/9/port/devcons.c /n/fornaxdump/1993/0501/sys/src/brazil/port/devcons.c 854c if(cpuserver && !iseve()) . 816,818d 618c return readstr(offset, buf, n, up->user); . 608,610d 586c return readnum(offset, buf, n, up->parentpid, NUMSIZE); . 583c return readnum(offset, buf, n, up->pid, NUMSIZE); . 580c return readnum(offset, buf, n, up->noteid, NUMSIZE); . 577c return readnum(offset, buf, n, up->pgrp->pgrpid, NUMSIZE); . 567c l = up->time[i]; . 491d 489d 486d 354d 326d 187c n = sprint(buf, "%s %d: ", up->text, up->pid); . 184c c = up->fgrp->fd[2]; . 181c if(up->fgrp == 0) . 21,22c static Ref ctl; /* number of opens to the control file */ static int raw; /* true if ctl file is raw */ . ## diffname port/devcons.c 1993/0502 ## diff -e /n/fornaxdump/1993/0501/sys/src/brazil/port/devcons.c /n/fornaxdump/1993/0502/sys/src/brazil/port/devcons.c 549a #endif asdf . 511a return getline((char*)buf, n); #ifdef asdf . ## diffname port/devcons.c 1993/0506 ## diff -e /n/fornaxdump/1993/0502/sys/src/brazil/port/devcons.c /n/fornaxdump/1993/0506/sys/src/brazil/port/devcons.c 552d 512,513d ## diffname port/devcons.c 1993/0601 ## diff -e /n/fornaxdump/1993/0506/sys/src/brazil/port/devcons.c /n/fornaxdump/1993/0601/sys/src/brazil/port/devcons.c 771,773c kbd.raw = 0; . 766,769c kbd.raw = 1; qunlock(&kbd); . 760,764c qlock(&kbd); if(kbd.x){ qwrite(kbdq, kbd.line, kbd.x, 1); kbd.x = 0; . 733c int id, fd; . 616,630c return qread(klogq, buf, n); . 550,552c n = qread(lineq, buf, n); qunlock(&kbd); return n; . 546,548c case 0x15: kbd.x = 0; break; default: kbd.line[kbd.x++] = ch; break; } if(kbd.x == sizeof(kbd.line) || ch == '\n' || ch == 0x04){ if(ch == 0x04) kbd.x--; qwrite(lineq, kbd.line, kbd.x, 1); } . 512,544c while(!qcanread(lineq)){ qread(kbdq, &kbd.line[kbd.x], 1); ch = kbd.line[kbd.x]; if(kbd.raw){ i = splhi(); qproduce(lineq, &kbd.line[kbd.x], 1); splx(i); continue; } switch(ch){ case '\b': if(kbd.x) kbd.x--; . 509c qunlock(&kbd); . 507c qlock(&kbd); . 479,482c qlock(&kbd); if(--kbd.ctl == 0) kbd.raw = 0; qunlock(&kbd); . 459c qlock(&kbd); kbd.ctl++; qunlock(&kbd); . 319c return qlen(printq) > 0; . 312,313c if(++kbd.count&1) kbdputc(kbdq, kbd.c); . 307,309c if(kbd.repeat==1 && ++kbd.count>HZ){ kbd.repeat = 2; kbd.count = 0; . 305c if(kbd.repeat == 0) . 298,299c kbd.repeat = rep; kbd.count = 0; . 284,291c qproduce(kbdq, buf, n); . 274c int n; . 272c kbdputc(Queue *q, int ch) . 269a * * Called at interrupt time to process a character. . 260c kbdcr2nl(Queue *q, int ch) . 257c * Called by a uart interrupt for console input. * * turn '\r' into '\n' before putting it into the queue. . 249a /* * finally, the actual echoing */ . 248c if(kbd.raw) . 205c while(qlen(printq) > 0) ; . 157c qwrite(klogq, buf, n, 1); . 117,133d 87,115d 81c qwrite(printq, str, n, 1); . 77c qwrite(printq, buf, m+2, 1); . 68c if(printq == 0) . 32,39c klogq = qopen(32*1024, 0, 0, 0); lineq = qopen(2*1024, 0, 0, 0); . 26,28d 23a char c; int count; int repeat; } kbd; . 21,22c int raw; /* true if we shouldn't process input */ int ctl; /* number of opens to the control file */ int x; /* index into line */ char line[1024]; /* current input line */ . 16,19c static struct { QLock; . 11,14c Queue *mouseq; Queue *kbdq; /* unprocessed console input */ Queue *lineq; /* processed console input */ Queue *printq; /* console output */ Queue *klogq; . ## diffname port/devcons.c 1993/0725 ## diff -e /n/fornaxdump/1993/0601/sys/src/brazil/port/devcons.c /n/fornaxdump/1993/0725/sys/src/brazil/port/devcons.c 699a kbd.x = 0; . 496a poperror(); . 492a kbd.x = 0; . 489c if(kbd.x == sizeof(kbd.line) || eol){ . 484a case '\n': case 0x04: eol = 1; . 476a eol = 0; . 454a char *b, *bp; char tmp[128]; /* must be >= 6*NUMSIZE */ char *cbuf = buf; int ch, i, k, id, eol; . 451,453d 449d ## diffname port/devcons.c 1993/0731 ## diff -e /n/fornaxdump/1993/0725/sys/src/brazil/port/devcons.c /n/fornaxdump/1993/0731/sys/src/brazil/port/devcons.c 739a case Qauthent: return authentwrite(c, a, n); . 553a case Qauthent: return authentread(c, cbuf, n); . 441a case Qauthent: . 306a "authenticator", {Qauthent}, 0, 0666, . 279a Qauthent, . ## diffname port/devcons.c 1993/0806 ## diff -e /n/fornaxdump/1993/0731/sys/src/brazil/port/devcons.c /n/fornaxdump/1993/0806/sys/src/brazil/port/devcons.c 99a . 79c } else { . 71c if(t) { . 69c while(n > 0) { . 52a char buf[PRINTSIZE+2]; . 50d ## diffname port/devcons.c 1993/0807 ## diff -e /n/fornaxdump/1993/0806/sys/src/brazil/port/devcons.c /n/fornaxdump/1993/0807/sys/src/brazil/port/devcons.c 231,232d 64,65c * put the message there. . ## diffname port/devcons.c 1993/0819 ## diff -e /n/fornaxdump/1993/0807/sys/src/brazil/port/devcons.c /n/fornaxdump/1993/0819/sys/src/brazil/port/devcons.c 183a ixsummary(); . ## diffname port/devcons.c 1993/0829 ## diff -e /n/fornaxdump/1993/0819/sys/src/brazil/port/devcons.c /n/fornaxdump/1993/0829/sys/src/brazil/port/devcons.c 125a prflush(); . ## diffname port/devcons.c 1993/0905 ## diff -e /n/fornaxdump/1993/0829/sys/src/brazil/port/devcons.c /n/fornaxdump/1993/0905/sys/src/brazil/port/devcons.c 161c while(consactive()) ; . 124a iprint("%s\n", buf); . ## diffname port/devcons.c 1993/0906 ## diff -e /n/fornaxdump/1993/0905/sys/src/brazil/port/devcons.c /n/fornaxdump/1993/0906/sys/src/brazil/port/devcons.c 125d ## diffname port/devcons.c 1993/0910 ## diff -e /n/fornaxdump/1993/0906/sys/src/brazil/port/devcons.c /n/fornaxdump/1993/0910/sys/src/brazil/port/devcons.c 614,616c k = 0; for(i = 0; i < NCOLOR; i++) k += palloc.freecol[i]; sprint(tmp, "%d/%d memory %d/%d swap\n", palloc.user-k, palloc.user, conf.nswap-swapalloc.free, conf.nswap); . ## diffname port/devcons.c 1993/1005 ## diff -e /n/fornaxdump/1993/0910/sys/src/brazil/port/devcons.c /n/fornaxdump/1993/1005/sys/src/brazil/port/devcons.c 212,215c if(r == '\n'){ if(printq) qproduce(printq, "\r", 1); } else if(r == 0x15){ buf = "^U\n"; n = 3; } screenputs(buf, n); if(printq) qproduce(printq, buf, n); . ## diffname port/devcons.c 1993/1006 ## diff -e /n/fornaxdump/1993/1005/sys/src/brazil/port/devcons.c /n/fornaxdump/1993/1006/sys/src/brazil/port/devcons.c 188,190d ## diffname port/devcons.c 1993/1016 ## diff -e /n/fornaxdump/1993/1006/sys/src/brazil/port/devcons.c /n/fornaxdump/1993/1016/sys/src/brazil/port/devcons.c 198,200c break; case 3: if(r > '0' && r <= '9') { pid = (pid*10)+(r-'0'); return; } print("PID %d\n", pid); p = proctab(0); ep = p+conf.nproc; for(; p < ep; p++) { if(p->pid == pid) { top = (ulong)p->kstack + KSTACK; for(l=(ulong)p->sched.sp; l < top; l += BY2WD) { v = *(ulong*)l; if(KTZERO < v && v < (ulong)&etext) { print("%lux=%lux\n", l, v); delay(100); } } } } break; . 179c switch(ctrlt) { case 0: if(r == 0x14){ ctrlt = 1; return; } break; case 1: if(r > '0' && r <= '9') { ctrlt = 3; pid = r-'0'; return; } ctrlt = 2; return; case 2: . 168c static int ctrlt, pid; ulong l, v, top; extern ulong etext; Proc *p, *ep; . ## diffname port/devcons.c 1993/1031 ## diff -e /n/fornaxdump/1993/1016/sys/src/brazil/port/devcons.c /n/fornaxdump/1993/1031/sys/src/brazil/port/devcons.c 484a break; . ## diffname port/devcons.c 1993/1119 ## diff -e /n/fornaxdump/1993/1031/sys/src/brazil/port/devcons.c /n/fornaxdump/1993/1119/sys/src/brazil/port/devcons.c 316c if(printq) return qlen(printq) > 0; return 0; . ## diffname port/devcons.c 1993/1120 ## diff -e /n/fornaxdump/1993/1119/sys/src/brazil/port/devcons.c /n/fornaxdump/1993/1120/sys/src/brazil/port/devcons.c 657,661c sprint(tmp, "%d/%d memory %d/%d swap\n", palloc.user-palloc.freecount, . ## diffname port/devcons.c 1993/1217 ## diff -e /n/fornaxdump/1993/1120/sys/src/brazil/port/devcons.c /n/fornaxdump/1993/1217/sys/src/brazil/port/devcons.c 214a case 'q': print("%lux\n", *(ulong*)0xe0000004); print("%lux\n", *(ulong*)0x80000420); print("%lux\n", *(ulong*)0x80000424); for(pid = 0; pid < 30; pid++) print(":%lux\n", ((ulong*)0xbfc00000)[pid]); . ## diffname port/devcons.c 1993/1228 ## diff -e /n/fornaxdump/1993/1217/sys/src/brazil/port/devcons.c /n/fornaxdump/1993/1228/sys/src/brazil/port/devcons.c 579,581d 372d 344d ## diffname port/devcons.c 1994/0208 ## diff -e /n/fornaxdump/1993/1228/sys/src/brazil/port/devcons.c /n/fornaxdump/1994/0208/sys/src/brazil/port/devcons.c 737c putstrn0(a, bp, 1); . 86a void putstrn(char *str, int n) { putstrn0(str, n, 0); } . 79,81c } else { if(usewrite) qwrite(printq, str, n, 0); else { x = splhi(); qproduce(printq, str, n); splx(x); } . 76c if(usewrite) qwrite(printq, buf, m+2, 0); else { x = splhi(); qproduce(printq, buf, m+2); splx(x); } . 50c int m, x; . 47,48c static void putstrn0(char *str, int n, int usewrite) . ## diffname port/devcons.c 1994/0219 ## diff -e /n/fornaxdump/1994/0208/sys/src/brazil/port/devcons.c /n/fornaxdump/1994/0219/sys/src/brazil/port/devcons.c 144a . ## diffname port/devcons.c 1994/0224 ## diff -e /n/fornaxdump/1994/0219/sys/src/brazil/port/devcons.c /n/fornaxdump/1994/0224/sys/src/brazil/port/devcons.c 142a spllo(); . ## diffname port/devcons.c 1994/0305 ## diff -e /n/fornaxdump/1994/0224/sys/src/brazil/port/devcons.c /n/fornaxdump/1994/0305/sys/src/brazil/port/devcons.c 148a . ## diffname port/devcons.c 1994/0313 ## diff -e /n/fornaxdump/1994/0305/sys/src/brazil/port/devcons.c /n/fornaxdump/1994/0313/sys/src/brazil/port/devcons.c 242,263c } else if(r == 0x14){ ctrlt++; return; . 235,240d 225a case 'b': bitdebug(); break; . 202,217c if(ctrlt == 2){ . ## diffname port/devcons.c 1994/0316 ## diff -e /n/fornaxdump/1994/0313/sys/src/brazil/port/devcons.c /n/fornaxdump/1994/0316/sys/src/brazil/port/devcons.c 191d 189d ## diffname port/devcons.c 1994/0319 ## diff -e /n/fornaxdump/1994/0316/sys/src/brazil/port/devcons.c /n/fornaxdump/1994/0319/sys/src/brazil/port/devcons.c 209,211d ## diffname port/devcons.c 1994/0413 ## diff -e /n/fornaxdump/1994/0319/sys/src/brazil/port/devcons.c /n/fornaxdump/1994/0413/sys/src/brazil/port/devcons.c 122a fprint(int fd, char *fmt, ...) /* needed so we can use user-level libg */ { char buf[PRINTSIZE]; int n; USED(fd); n = doprint(buf, buf+sizeof(buf), fmt, (&fmt+1)) - buf; putstrn(buf, n); return n; } int . ## diffname port/devcons.c 1994/0624 ## diff -e /n/fornaxdump/1994/0413/sys/src/brazil/port/devcons.c /n/fornaxdump/1994/0624/sys/src/brazil/port/devcons.c 6d ## diffname port/devcons.c 1994/0813 ## diff -e /n/fornaxdump/1994/0624/sys/src/brazil/port/devcons.c /n/fornaxdump/1994/0813/sys/src/brazil/port/devcons.c 216a case 's': dumpstack(); break; . ## diffname port/devcons.c 1994/0902 ## diff -e /n/fornaxdump/1994/0813/sys/src/brazil/port/devcons.c /n/fornaxdump/1994/0902/sys/src/brazil/port/devcons.c 746c qwrite(kbdq, kbd.line, kbd.x); . 543c qwrite(lineq, kbd.line, kbd.x); . 141c qwrite(klogq, buf, n); . 86c qwrite(printq, str, n); . 76c qwrite(printq, buf, m+2); . 37a qnoblock(lineq, 1); . 36a qnoblock(klogq, 1); . ## diffname port/devcons.c 1994/1124 ## diff -e /n/fornaxdump/1994/0902/sys/src/brazil/port/devcons.c /n/fornaxdump/1994/1124/sys/src/brazil/port/devcons.c 521,523c qiwrite(lineq, &kbd.line[kbd.x], 1); . 257c qiwrite(printq, buf, n); . 250c qiwrite(printq, "\r", 1); . 89,93c else qiwrite(printq, str, n); . 79,83c else qiwrite(printq, buf, m+2); . 51c int m; . ## diffname port/devcons.c 1995/0104 ## diff -e /n/fornaxdump/1994/1124/sys/src/brazil/port/devcons.c /n/fornaxdump/1995/0104/sys/src/brazil/port/devcons.c 606,608d 357d 330d 130,140d 36,37d 14d ## diffname port/devcons.c 1995/0108 ## diff -e /n/fornaxdump/1995/0104/sys/src/brazil/port/devcons.c /n/fornaxdump/1995/0108/sys/src/brazil/port/devcons.c 825a } long consbwrite(Chan *c, Block *bp, ulong offset) { return devbwrite(c, bp, offset); . 642a Block* consbread(Chan *c, long n, ulong offset) { return devbread(c, n, offset); } . ## diffname port/devcons.c 1995/0112 ## diff -e /n/fornaxdump/1995/0108/sys/src/brazil/port/devcons.c /n/fornaxdump/1995/0112/sys/src/brazil/port/devcons.c 734a } else if(strncmp(a, "ctlpon", 6) == 0){ kbd.ctlpoff = 0; } else if(strncmp(a, "ctlpoff", 7) == 0){ kbd.ctlpoff = 1; . 188c if(r==0x10 && cpuserver && !kbd.ctlpoff) . 26a int ctlpoff; . ## diffname port/devcons.c 1995/0117 ## diff -e /n/fornaxdump/1995/0112/sys/src/brazil/port/devcons.c /n/fornaxdump/1995/0117/sys/src/brazil/port/devcons.c 97a snprint(char *s, int n, char *fmt, ...) { return doprint(s, s+n, fmt, (&fmt+1)) - s; } int . ## diffname port/devcons.c 1995/0319 ## diff -e /n/fornaxdump/1995/0117/sys/src/brazil/port/devcons.c /n/fornaxdump/1995/0319/sys/src/brazil/port/devcons.c 218a case 'k': if(!cpuserver) killbig(); break; . ## diffname port/devcons.c 1995/0804 ## diff -e /n/fornaxdump/1995/0319/sys/src/brazil/port/devcons.c /n/fornaxdump/1995/0804/sys/src/brazil/port/devcons.c 865d 863c conswstat(Chan*, char*) . 858d 856c consremove(Chan*) . 460d 458c conscreate(Chan*, char*, int, ulong) . 275d 269c kbdputc(Queue*, int ch) . 127d 122c fprint(int, char *fmt, ...) /* needed so we can use user-level libg */ . ## diffname port/devcons.c 1995/0815 ## diff -e /n/fornaxdump/1995/0804/sys/src/brazil/port/devcons.c /n/fornaxdump/1995/0815/sys/src/brazil/port/devcons.c 278a kbd.c = r; . 24c Rune c; . ## diffname port/devcons.c 1995/0910 ## diff -e /n/fornaxdump/1995/0815/sys/src/brazil/port/devcons.c /n/fornaxdump/1995/0910/sys/src/brazil/port/devcons.c 880a } static struct { QLock; Rendez r; uchar buf[4096]; uchar *ep; uchar *rp; uchar *wp; uchar next; uchar bits; uchar wakeme; } rb; ulong randomcount; void randomreset(void) { rb.ep = rb.buf + sizeof(rb.buf); rb.rp = rb.wp = rb.buf; } /* * produce random bits in a circular buffer */ void randomclock(void) { int i; uchar *p; i = rb.rp - rb.wp; if(i == 1 || i == (1 - sizeof(rb.buf))) return; rb.bits = (rb.bits<<2) ^ randomcount; rb.next += 2; if(rb.next != 8) return; rb.next = 0; *rb.wp ^= rb.bits; p = rb.wp+1; if(p == rb.ep) p = rb.buf; rb.wp = p; if(rb.wakeme) wakeup(&rb.r); } static int notempty(void*) { return rb.wp != rb.rp; } /* * consume random bytes from a circular buffer */ static ulong randomread(uchar *p, ulong n) { int i, sofar; uchar *e; if(waserror()){ qunlock(&rb); nexterror(); } qlock(&rb); for(sofar = 0; sofar < n; sofar += i){ i = rb.wp - rb.rp; if(i == 0){ rb.wakeme = 1; sleep(&rb.r, notempty, 0); rb.wakeme = 0; continue; } if(i < 0) i = rb.ep - rb.rp; if(i > n) i = n; memmove(p + sofar, rb.rp, i); e = rb.rp + i; if(e == rb.ep) e = rb.buf; rb.rp = e; } qunlock(&rb); poperror(); return n; . 644a case Qrandom: return randomread(buf, n); . 408a randomreset(); . 358a "random", {Qrandom}, 0, 0664, . 332a Qrandom, . 32a static ulong randomread(uchar*, ulong); static void randomreset(void); . 30d ## diffname port/devcons.c 1995/0913 ## diff -e /n/fornaxdump/1995/0910/sys/src/brazil/port/devcons.c /n/fornaxdump/1995/0913/sys/src/brazil/port/devcons.c 982a wakeup(&rb.producer); . 967c sleep(&rb.consumer, rbnotempty, 0); . 943c rbnotempty(void*) . 939c wakeup(&rb.consumer); . 926a randomcount = 0; . 925a if(!rbnotfull(0)) return; . 922,923c if(randomcount == 0) . 919d 910a kproc("genrandom", genrandom, 0); . 908a up->basepri = PriNormal; up->priority = up->basepri; for(;;){ if(!rbnotfull(0)) sleep(&rb.producer, rbnotfull, 0); randomcount++; } } void randominit(void) { . 907c genrandom(void*) . 905a static int rbnotfull(void*) { int i; i = rb.rp - rb.wp; return i != 1 && i != (1 - sizeof(rb.buf)); } . 894c Rendez producer; Rendez consumer; . 418a randominit(); . 413d 33c static void randominit(void); . ## diffname port/devcons.c 1995/0914 ## diff -e /n/fornaxdump/1995/0913/sys/src/brazil/port/devcons.c /n/fornaxdump/1995/0914/sys/src/brazil/port/devcons.c 958c *rb.wp ^= rb.bits ^ *rb.rp; . 952a . ## diffname port/devcons.c 1995/1023 ## diff -e /n/fornaxdump/1995/0914/sys/src/brazil/port/devcons.c /n/fornaxdump/1995/1023/sys/src/brazil/port/devcons.c 998,1006c *p++ = *rb.rp; if(rb.rp+1 == rb.ep) rb.rp = rb.buf; else rb.rp = rb.rp+1; . 993a wakeup(&rb.producer); . 990,992c for(e = p + n; p < e; ){ if(rb.wp == rb.rp){ . 981d 964a *rb.wp ^= rb.bits; if(rb.wp+1 == rb.ep) rb.wp = rb.buf; else rb.wp = rb.wp+1; . 959,963d 957d 951,955c rb.next++; if(rb.next != 8/2) . 948,949c rb.bits = (rb.bits<<2) ^ rb.randomcount; rb.randomcount = 0; . 943,945c if(rb.randomcount == 0 || !rbnotfull(0)) . 925d 922a for(;;) if(++rb.randomcount > 1000000) break; . 905d 893a ulong randomcount; . ## diffname port/devcons.c 1995/1030 ## diff -e /n/fornaxdump/1995/1023/sys/src/brazil/port/devcons.c /n/fornaxdump/1995/1030/sys/src/brazil/port/devcons.c 219a case 'q': scheddump(); break; . ## diffname port/devcons.c 1995/1121 ## diff -e /n/fornaxdump/1995/1030/sys/src/brazil/port/devcons.c /n/fornaxdump/1995/1121/sys/src/brazil/port/devcons.c 934c static void . ## diffname port/devcons.c 1996/0119 ## diff -e /n/fornaxdump/1995/1121/sys/src/brazil/port/devcons.c /n/fornaxdump/1996/0119/sys/src/brazil/port/devcons.c 196,197c if(r==0x10 && cpuserver && !kbd.ctlpoff){ lock(&active); active.exiting = 1; unlock(&active); } . ## diffname port/devcons.c 1996/0214 ## diff -e /n/fornaxdump/1996/0119/sys/src/brazil/port/devcons.c /n/fornaxdump/1996/0214/sys/src/brazil/port/devcons.c 392c snprint(tmp, sizeof(tmp), "%*.0ud", size-1, val); . 390d 166c va_start(arg, fmt); n = doprint(buf+n, buf+sizeof(buf), fmt, arg) - buf; va_end(arg); . 156a va_list arg; . 142c va_start(arg, fmt); n = doprint(buf+strlen(buf), buf+sizeof(buf), fmt, arg) - buf; va_end(arg); . 138a va_list arg; . 129c va_start(arg, fmt); n = doprint(buf, buf+sizeof(buf), fmt, arg) - buf; va_end(arg); . 126a va_list arg; . 117c va_start(arg, fmt); n = doprint(buf, buf+sizeof(buf), fmt, arg) - buf; va_end(arg); . 114a va_list arg; . 108c va_list arg; int n; va_start(arg, fmt); n = doprint(s, s+PRINTSIZE, fmt, arg) - s; va_end(arg); return n; . 102c va_list arg; va_start(arg, fmt); n = doprint(s, s+n, fmt, arg) - s; va_end(arg); return n; . ## diffname port/devcons.c 1996/0223 ## diff -e /n/fornaxdump/1996/0214/sys/src/brazil/port/devcons.c /n/fornaxdump/1996/0223/sys/src/brazil/port/devcons.c 8d ## diffname port/devcons.c 1996/03071 ## diff -e /n/fornaxdump/1996/0223/sys/src/brazil/port/devcons.c /n/fornaxdump/1996/03071/sys/src/brazil/port/devcons.c 828a break; case Qreboot: if(!iseve()) error(Eperm); if(strncmp(a, "reboot", 6) == 0) exit(0); . 390a "reboot", {Qreboot}, 0, 0664, . 363a Qreboot, . ## diffname port/devcons.c 1996/1029 ## diff -e /n/fornaxdump/1996/03071/sys/src/brazil/port/devcons.c /n/fornaxdump/1996/1029/sys/src/brazil/port/devcons.c 941a int nrand(int n) { rb.randn ^= rb.bits; rb.randn = rb.randn*1103515245 + 12345 + MACHP(0)->ticks; return (rb.randn>>16) % n; } . 939a ushort bits; ulong randn; . 938d 909,917d ## diffname port/devcons.c 1996/1031 ## diff -e /n/fornaxdump/1996/1029/sys/src/brazil/port/devcons.c /n/fornaxdump/1996/1031/sys/src/brazil/port/devcons.c 937d 933a static void seednrand(void) { randomread((uchar*)&rb.randn, sizeof(rb.randn)); } . 452a static int seeded; if(!seeded){ seednrand(); seeded = 1; } . 31,32c static ulong randomread(uchar*, ulong); static void randominit(void); static void seednrand(void); . ## diffname port/devcons.c 1997/0123 ## diff -e /n/fornaxdump/1996/1031/sys/src/brazil/port/devcons.c /n/fornaxdump/1997/0123/sys/src/brazil/port/devcons.c 138c fprint(int, char *fmt, ...) . ## diffname port/devcons.c 1997/0204 ## diff -e /n/fornaxdump/1997/0123/sys/src/brazil/port/devcons.c /n/emeliedump/1997/0204/sys/src/brazil/port/devcons.c 799c if(n<=0 || (boottime != 0 && !iseve())) /* write once file */ . ## diffname port/devcons.c 1997/0205 ## diff -e /n/emeliedump/1997/0204/sys/src/brazil/port/devcons.c /n/emeliedump/1997/0205/sys/src/brazil/port/devcons.c 607c return readnum(offset, buf, n, rtctime(), 12); . ## diffname port/devcons.c 1997/0327 ## diff -e /n/emeliedump/1997/0205/sys/src/brazil/port/devcons.c /n/emeliedump/1997/0327/sys/src/brazil/port/devcons.c 1025c uchar *e, *p; p = xp; . 1023c randomread(void *xp, ulong n) . 1013,1018d 980a addclock0link(randomclock); . 962a static int rbnotempty(void*) { return rb.wp != rb.rp; } . 944c randomread((void*)&rb.randn, sizeof(rb.randn)); . 930a ulong randomcount; . 928d 924a Dev consdevtab = { devreset, consinit, consattach, devclone, conswalk, consstat, consopen, devcreate, consclose, consread, devbread, conswrite, devbwrite, devremove, devwstat, }; . 905,916d 898,903d 832,839d 696,743c static long . 545c while(!qcanread(lineq)) { . 541c if(waserror()) { . 537c return devdirread(c, buf, n, consdir, nelem(consdir), devgen); . 523c static long . 497,503c static void . 494c return devopen(c, omode, consdir, nelem(consdir), devgen); . 481c static Chan* . 478c devstat(c, dp, consdir, nelem(consdir), devgen); . 475c static void . 472c return devwalk(c, name, consdir, nelem(consdir), devgen); . 463,469c static int . 451c static Chan* . 440,445c static void . 401,402d 387d 385d 359d 357d 336,343d 241c if(consdebug != nil) consdebug(); . 204,210d 193c devtab[c->type]->write(c, buf, n, c->offset); . 178c char buf[2*PRINTSIZE]; . 175c int n; . 157a va_list arg; char buf[PRINTSIZE]; . 155,156d 142a va_list arg; char buf[PRINTSIZE]; . 140,141d 138c fprint(int, char *fmt, ...) /* needed so we can use user-level libg */ . 127a va_list arg; char buf[PRINTSIZE]; . 125,126d 114a va_list arg; . 113d 41a int consactive(void) { if(printq) return qlen(printq) > 0; return 0; } void prflush(void) { while(consactive()) ; } . 31c static ulong randomread(void*, ulong); . 9,12c Queue* kbdq; /* unprocessed console input */ Queue* lineq; /* processed console input */ Queue* printq; /* console output */ . 7a void (*consdebug)(void); . ## diffname port/devcons.c 1997/0408 ## diff -e /n/emeliedump/1997/0327/sys/src/brazil/port/devcons.c /n/emeliedump/1997/0408/sys/src/brazil/port/devcons.c 830a 'c', "cons", . ## diffname port/devcons.c 1997/0410 ## diff -e /n/emeliedump/1997/0408/sys/src/brazil/port/devcons.c /n/emeliedump/1997/0410/sys/src/brazil/port/devcons.c 665a case Qdrivers: b = malloc(MBS); if(b == nil) error(Enomem); n = 0; for(i = 0; devtab[i] != nil; i++) n += snprint(b+n, MBS-n, "#%C %s\n", devtab[i]->dc, devtab[i]->name); n = readstr(offset, buf, n, b); free(b); return n; . 397a enum { MBS = 1024, }; . 379a "drivers", {Qdrivers}, 0, 0644, . 372c static Dirtab consdir[]={ . 353a Qdrivers, . ## diffname port/devcons.c 1997/0413 ## diff -e /n/emeliedump/1997/0410/sys/src/brazil/port/devcons.c /n/emeliedump/1997/0413/sys/src/brazil/port/devcons.c 961a } static void randominit(void) { addclock0link(randomclock); rb.ep = rb.buf + sizeof(rb.buf); rb.rp = rb.wp = rb.buf; kproc("genrandom", genrandom, 0); . 940c static void . 928,936d ## diffname port/devcons.c 1997/0417 ## diff -e /n/emeliedump/1997/0413/sys/src/brazil/port/devcons.c /n/emeliedump/1997/0417/sys/src/brazil/port/devcons.c 680c n += snprint(b+n, READSTR-n, "#%C %s\n", devtab[i]->dc, devtab[i]->name); . 675c b = malloc(READSTR); . 400,404d ## diffname port/devcons.c 1997/0614 ## diff -e /n/emeliedump/1997/0417/sys/src/brazil/port/devcons.c /n/emeliedump/1997/0614/sys/src/brazil/port/devcons.c 983c rb.randn = rb.randn*1103515245 + 12345 + *rb.rp; *p++ = rb.randn; . ## diffname port/devcons.c 1997/0616 ## diff -e /n/emeliedump/1997/0614/sys/src/brazil/port/devcons.c /n/emeliedump/1997/0616/sys/src/brazil/port/devcons.c 983,984c /* * beating clocks will be precictable if * they are synchronized. Use a cheap pseudo * random number generator to obscure any cycles. */ x = rb.randn*1103515245 ^ *rb.rp; *p++ = rb.randn = x; . 965a ulong x; . ## diffname port/devcons.c 1997/0820 ## diff -e /n/emeliedump/1997/0616/sys/src/brazil/port/devcons.c /n/emeliedump/1997/0820/sys/src/brazil/port/devcons.c 555d 532,553c n = qread(lineq, buf, n); . 525,530c if(kbd.raw) { if(qcanread(lineq)) n = qread(lineq, buf, n); else n = qread(kbdq, buf, n); } else { while(!qcanread(lineq)) { qread(kbdq, &kbd.line[kbd.x], 1); ch = kbd.line[kbd.x]; if(kbd.raw){ qiwrite(lineq, kbd.line, kbd.x+1); kbd.x = 0; continue; } eol = 0; switch(ch){ case '\b': if(kbd.x) kbd.x--; break; case 0x15: kbd.x = 0; break; case '\n': case 0x04: eol = 1; default: kbd.line[kbd.x++] = ch; break; } if(kbd.x == sizeof(kbd.line) || eol){ if(ch == 0x04) kbd.x--; qwrite(lineq, kbd.line, kbd.x); kbd.x = 0; } . ## diffname port/devcons.c 1997/0821 ## diff -e /n/emeliedump/1997/0820/sys/src/brazil/port/devcons.c /n/emeliedump/1997/0821/sys/src/brazil/port/devcons.c 528,529c else { /* read as much as possible */ do { i = qread(kbdq, cbuf, n); cbuf += i; n -= i; } while (n>0 && qcanread(kbdq)); n = cbuf - (char*)buf; } . ## diffname port/devcons.c 1997/0831 ## diff -e /n/emeliedump/1997/0821/sys/src/brazil/port/devcons.c /n/emeliedump/1997/0831/sys/src/brazil/port/devcons.c 795a } . 794c if(strncmp(a, "reboot", 6) == 0){ print("conswrite: reboot\n"); . ## diffname port/devcons.c 1997/1101 ## diff -e /n/emeliedump/1997/0831/sys/src/brazil/port/devcons.c /n/emeliedump/1997/1101/sys/src/brazil/port/devcons.c 246a poolsummary(); . 152,166d 3a #include "pool.h" . ## diffname port/devcons.c 1997/1105 ## diff -e /n/emeliedump/1997/1101/sys/src/brazil/port/devcons.c /n/emeliedump/1997/1105/sys/src/brazil/port/devcons.c 39a if(lineq == nil) panic("printinit"); . ## diffname port/devcons.c 1998/0319 ## diff -e /n/emeliedump/1997/1105/sys/src/brazil/port/devcons.c /n/emeliedump/1998/0319/sys/src/brazil/port/devcons.c 700a ulong offset = off; . 692c conswrite(Chan *c, void *va, long n, vlong off) . 500a ulong offset = off; . 493c consread(Chan *c, void *buf, long n, vlong off) . ## diffname port/devcons.c 1998/0403 ## diff -e /n/emeliedump/1998/0319/sys/src/brazil/port/devcons.c /n/emeliedump/1998/0403/sys/src/brazil/port/devcons.c 820c swc = fdtochan(fd, -1, 1, 1); . ## diffname port/devcons.c 1998/0422 ## diff -e /n/emeliedump/1998/0403/sys/src/brazil/port/devcons.c /n/emeliedump/1998/0422/sys/src/brazil/port/devcons.c 610a case Qauthcheck: return authcheckread(c, cbuf, n); . ## diffname port/devcons.c 1998/0512 ## diff -e /n/emeliedump/1998/0422/sys/src/brazil/port/devcons.c /n/emeliedump/1998/0512/sys/src/brazil/port/devcons.c 104c else . ## diffname port/devcons.c 1998/0610 ## diff -e /n/emeliedump/1998/0512/sys/src/brazil/port/devcons.c /n/emeliedump/1998/0610/sys/src/brazil/port/devcons.c 928a if(anyhigher()) sched(); . 927c if(++rb.randomcount > 100000) . ## diffname port/devcons.c 1998/0617 ## diff -e /n/emeliedump/1998/0610/sys/src/brazil/port/devcons.c /n/emeliedump/1998/0617/sys/src/brazil/port/devcons.c 1015a return n; } static long qtimer(long n, vlong offset) { /* block until time ≥ offset; * add n to offset * return increment to offset (i.e., n) */ vlong time, rathole; for (;;) { rathole = µoffset/1000; time = offset/1000 - (rathole + TK2MS(MACHP(0)->ticks)); if (time <= 0) break; tsleep(&up->sleep, return0, 0, (long)time); } . 837a case Qtimer: error(Eperm); . 684c n = readstr((ulong)offset, buf, n, b); . 672c return readstr((ulong)offset, buf, n, sysname); . 669c return readstr((ulong)offset, buf, n, tmp); . 660c n = readstr((ulong)offset, buf, n, b); . 633c return readnum((ulong)offset, buf, n, HZ, NUMSIZE); . 630c return readnum((ulong)offset, buf, n, TK2MS(MACHP(0)->ticks), NUMSIZE); . 624c return readstr((ulong)offset, buf, n, up->user); . 621c return readstr((ulong)offset, buf, n, hostdomain); . 618c return readstr((ulong)offset, buf, n, eve); . 593a case Qtimer: return qtimer(n, offset); . 592c return readnum((ulong)offset, buf, n, rtctime(), 12); . 589c return readnum((ulong)offset, buf, n, up->parentpid, NUMSIZE); . 586c return readnum((ulong)offset, buf, n, up->pid, NUMSIZE); . 583c return readnum((ulong)offset, buf, n, up->pgrp->pgrpid, NUMSIZE); . 506a consdir[qtimerentry].length = µoffset + (vlong)1000*TK2MS(MACHP(0)->ticks); . 501c vlong offset = off; . 452a if (c->qid.path == Qtimer) consdir[qtimerentry].length = µoffset + (vlong)1000*TK2MS(MACHP(0)->ticks); . 429a if (qtimerentry < 0) { while (consdir[++qtimerentry].qid.path != Qtimer) ; µoffset = (vlong)1000000*rtctime() - (vlong)1000*TK2MS(MACHP(0)->ticks); } . 385a "timer", {Qtimer}, 0, 0444, . 358a Qtimer, . 35a int qtimerentry = -1; vlong µoffset; . 34a static long qtimer(long, vlong); . ## diffname port/devcons.c 1998/0618 ## diff -e /n/emeliedump/1998/0617/sys/src/brazil/port/devcons.c /n/emeliedump/1998/0618/sys/src/brazil/port/devcons.c 860a break; . ## diffname port/devcons.c 1998/0702 ## diff -e /n/emeliedump/1998/0618/sys/src/brazil/port/devcons.c /n/emeliedump/1998/0702/sys/src/brazil/port/devcons.c 906c uchar buf[1024]; . ## diffname port/devcons.c 1998/0710 ## diff -e /n/emeliedump/1998/0702/sys/src/brazil/port/devcons.c /n/emeliedump/1998/0710/sys/src/brazil/port/devcons.c 622a memmove(buf, tmp+k, n); return n; case Qfastclock: ticks = fastticks(&fasthz); k = offset; if(k >= 4*NUMSIZE) return 0; if(k+n > 4*NUMSIZE) n = 4*NUMSIZE - k; readvlnum(0, tmp, 2*NUMSIZE, ticks, 2*NUMSIZE); readvlnum(0, tmp+2*NUMSIZE, 2*NUMSIZE, fasthz, 2*NUMSIZE); . 517a uvlong ticks, fasthz; . 403a readvlnum(ulong off, char *buf, ulong n, uvlong val, int size) { char tmp[64]; snprint(tmp, sizeof(tmp), "%*.0ulld", size-1, val); tmp[size-1] = ' '; if(off >= size) return 0; if(off+n > size) n = size-off; memmove(buf, tmp+off, n); return n; } int . 375a "fastclock", {Qfastclock}, 4*NUMSIZE, 0444, . 347a Qfastclock, . ## diffname port/devcons.c 1998/0731 ## diff -e /n/emeliedump/1998/0710/sys/src/brazil/port/devcons.c /n/emeliedump/1998/0731/sys/src/brazil/port/devcons.c 1076c qtimer(long n, vlong offset) { . 959a int rand(void) { nrand(1); return rb.randn; } . 955a if(rb.randn == 0) seedrand(); . 948c seedrand(void) . 465,470d 34c static void seedrand(void); . ## diffname port/devcons.c 1998/0808 ## diff -e /n/emeliedump/1998/0731/sys/src/brazil/port/devcons.c /n/emeliedump/1998/0808/sys/src/brazil/port/devcons.c 1076,1093d 884,887d 624,626d 535,536d 477,479d 453,459d 393,394c "user", {Quser}, NAMELEN, 0666, . 364d 246a splx(x); . 245a x = spllo(); . 214a int x; . 37,39d 35d ## diffname port/devcons.c 1998/0811 ## diff -e /n/emeliedump/1998/0808/sys/src/brazil/port/devcons.c /n/emeliedump/1998/0811/sys/src/brazil/port/devcons.c 717c print("consread %lux\n", c->qid.path); . ## diffname port/devcons.c 1998/0825 ## diff -e /n/emeliedump/1998/0811/sys/src/brazil/port/devcons.c /n/emeliedump/1998/0825/sys/src/brazil/port/devcons.c 867c print("conswrite: %lud\n", c->qid.path); . 693c sprint(tmp, "%lud/%lud memory %lud/%lud swap\n", . 422c snprint(tmp, sizeof(tmp), "%*.0lud", size-1, val); . 189c n = sprint(buf, "%s %lud: ", up->text, up->pid); . ## diffname port/devcons.c 1998/0829 ## diff -e /n/emeliedump/1998/0825/sys/src/brazil/port/devcons.c /n/emeliedump/1998/0829/sys/src/brazil/port/devcons.c 967,968c if(anyhigher()) sched(); . 903c struct Rb . ## diffname port/devcons.c 1998/0912 ## diff -e /n/emeliedump/1998/0829/sys/src/brazil/port/devcons.c /n/emeliedump/1998/0912/sys/src/brazil/port/devcons.c 4d ## diffname port/devcons.c 1999/0110 ## diff -e /n/emeliedump/1998/0912/sys/src/brazil/port/devcons.c /n/emeliedump/1999/0110/sys/src/brazil/port/devcons.c 235a pagersummary(); . ## diffname port/devcons.c 1999/0130 ## diff -e /n/emeliedump/1999/0110/sys/src/brazil/port/devcons.c /n/emeliedump/1999/0130/sys/src/brazil/port/devcons.c 375c "fastclock", {Qfastclock}, 4*NUMSIZE, 0664, . ## diffname port/devcons.c 1999/0205 ## diff -e /n/emeliedump/1999/0130/sys/src/brazil/port/devcons.c /n/emeliedump/1999/0205/sys/src/brazil/port/devcons.c 780c if(n<=0 || !iseve()) . 607c return readnum((ulong)offset, buf, n, boottime+TK2SEC(MACHP(0)->ticks), 12); . ## diffname port/devcons.c 1999/0218 ## diff -e /n/emeliedump/1999/0205/sys/src/brazil/port/devcons.c /n/emeliedump/1999/0218/sys/src/brazil/port/devcons.c 784,786c strncpy(cbuf, a, n); cbuf[n] = 0; nsec = strtol(cbuf, 0, 0); nsec *= 1000000000LL; settod(nsec, 0, 0); break; case Qfastclock: if(n<=0 || !iseve()) return 0; if(n >= sizeof(cbuf)) n = sizeof(cbuf)-1; strncpy(cbuf, a, n); cbuf[n] = 0; f = strtovl(cbuf, 0, 0); if(f <= 0L) error(Ebadarg); tod.hz = f; break; case Qnsec: if(n<=0 || !iseve()) return 0; if(n >= sizeof cbuf) n = sizeof cbuf - 1; strncpy(cbuf, a, n); cbuf[n] = 0; nsec = strtovl(cbuf, &a, 0); delta = strtovl(a, &a, 0); n = strtol(a, &a, 0); settod(nsec, delta, n); . 733a vlong f, nsec, delta; . 659a case Qtime: x = gettod(); x /= 1000000000LL; i = x; return readnum((ulong)offset, buf, n, i, NUMSIZE); . 658c x = gettod(); x /= 1000000LL; i = x; return readnum((ulong)offset, buf, n, i, NUMSIZE); . 656a case Qnsec: x = gettod(); return readvlnum((ulong)offset, buf, n, x, 2*NUMSIZE); . 629c readvlnum(0, tmp+2*NUMSIZE, 2*NUMSIZE, tod.hz, 2*NUMSIZE); . 621c if(tod.hz == 0L) ticks = fastticks((uvlong*)&tod.hz); else ticks = fastticks(nil); . 606,608d 515,516c vlong offset = off, x; uvlong ticks; . 399c vlong x; int i; x = gettod(); x /= 1000000000LL; i = x; return i; . 395a struct { Lock; vlong hz; /* frequency of fast clock */ vlong last; /* last reading of fast clock */ vlong off; /* offset from epoch to last */ vlong lastns; /* last return value from gettod */ vlong bias; /* current bias */ vlong delta; /* amount to add to bias each slow clock tick */ int n; /* number of times to add in delta */ int i; /* number of times we've added in delta */ } tod; void settod(vlong now, vlong delta, int n) { ilock(&tod); tod.last = fastticks(nil); tod.off = now; tod.delta = delta; tod.n = n; tod.i = 0; iunlock(&tod); } // largest vlong devided by 10, 100, ... static vlong vlmax[9] = { 9223372036LL, 92233720368LL, 922337203685LL, 9223372036854LL, 92233720368547LL, 922337203685477LL, 9223372036854775LL, 92233720368547758LL, 922337203685477580LL, }; static vlong vlmult[9] = { 1000000000LL, 100000000LL, 10000000LL, 1000000LL, 100000LL, 10000LL, 1000LL, 100LL, 10LL, }; vlong gettod(void) { vlong x; int i; ilock(&tod); if(tod.hz == 0) x = fastticks((uvlong*)&tod.hz); else x = fastticks(nil); x -= tod.last; /* convert to nanoseconds */ for(i = 0; i < 9; i++) if(x < vlmax[i]){ x *= vlmult[i]; break; } x /= tod.hz; if(i > 0) x *= vlmult[9-i]; /* convert to epoch */ x += tod.off; /* add in bias */ x += tod.bias; if(x < tod.lastns) x = tod.lastns; tod.lastns = x; iunlock(&tod); return x; } void fixtod(void) { ilock(&tod); if(tod.n > tod.i) tod.bias += tod.delta; iunlock(&tod); } . 380a "nsec", {Qnsec}, NUMSIZE, 0664, . 352a Qnsec, . ## diffname port/devcons.c 1999/0219 ## diff -e /n/emeliedump/1999/0218/sys/src/brazil/port/devcons.c /n/emeliedump/1999/0219/sys/src/brazil/port/devcons.c 931c todset(nsec, delta, n); . 918c fasthz = f; todsetfreq(f); . 905c todset(nsec, 0, 0); . 771c x = todget(); . 765c x = todget(); . 761c x = todget(); . 732c readvlnum(0, tmp+2*NUMSIZE, 2*NUMSIZE, fasthz, 2*NUMSIZE); . 721,722c if(fasthz == 0L) ticks = fastticks((uvlong*)&fasthz); . 551a todinit(); . 396,504d 29a vlong fasthz; . ## diffname port/devcons.c 1999/0228 ## diff -e /n/emeliedump/1999/0219/sys/src/brazil/port/devcons.c /n/emeliedump/1999/0228/sys/src/brazil/port/devcons.c 402c i = 0; if(val > bilbil){ y = val/bilbil; i += sprint(num+i, "%lud", y); val -= y*bilbil; y = val/billion; i += sprint(num+i, "%9.9lud", y); val -= y*billion; y = val; sprint(num+i, "%9.9lud", y); } else if(val > billion){ y = val/billion; i += sprint(num+i, "%lud", y); val -= y*billion; y = val; sprint(num+i, "%9.9lud", y); } else { y = val; sprint(num+i, "%lud", y); } snprint(tmp, sizeof(tmp), "%*s", size-1, num); . 400a char num[64]; ulong y; int i; . 396a uvlong billion = 1000000000ULL; uvlong bilbil = 1000000000ULL*1000000000ULL; // // this routine is a hack till we get 64 bit ops faster // . ## diffname port/devcons.c 1999/0509 ## diff -e /n/emeliedump/1999/0228/sys/src/brazil/port/devcons.c /n/emeliedump/1999/0509/sys/src/brazil/port/devcons.c 656a case Qtiming: k = 0; if(n >= 3*8){ ticks = fastticks((uvlong*)&fasthz); vlong2le(cbuf+16, fasthz); vlong2le(cbuf+8, ticks); k += 2*8; } else if(n >= 2*8){ ticks = fastticks(nil); vlong2le(cbuf+8, ticks); k += 8; } if(n >= 8){ ticks = todget(); vlong2le(cbuf, ticks); k += 8; } return k; . 530a uvlong order = 0x0001020304050607ULL; void vlong2le(char *t, vlong from) { uchar *f, *o; int i; f = (uchar*)&from; o = (uchar*)ℴ for(i = 0; i < 8; i++) t[i] = f[o[i]]; } . 393a "timing", {Qtiming}, 3*8, 0664, . 342a Qtiming, . ## diffname port/devcons.c 1999/0531 ## diff -e /n/emeliedump/1999/0509/sys/src/brazil/port/devcons.c /n/emeliedump/1999/0531/sys/src/brazil/port/devcons.c 730c x = todget(nil); . 724c x = todget(nil); . 720c x = todget(nil); . 688,689c vlong2le(cbuf, nsec); . 681,684d 679a k += 8; } if(n >= 2*8){ . 678d 676a nsec = todget(&ticks); . 558c vlong ticks, nsec; . ## diffname port/devcons.c 1999/0710 ## diff -e /n/emeliedump/1999/0531/sys/src/brazil/port/devcons.c /n/emeliedump/1999/0710/sys/src/brazil/port/devcons.c 967a case Qzero: return n; . 886,887c nsec = strtoll(cbuf, &a, 0); delta = strtoll(a, &a, 0); . 872c f = strtoll(cbuf, 0, 0); . 788a case Qzero: memset(buf, 0, n); return n; . 396a "zero", {Qzero}, 0, 0666, . 366a Qzero, . 236c mallocsummary(); . ## diffname port/devcons.c 1999/0711 ## diff -e /n/emeliedump/1999/0710/sys/src/brazil/port/devcons.c /n/emeliedump/1999/0711/sys/src/brazil/port/devcons.c 1165a return n; } static uvlong uvorder = 0x0001020304050607ULL; static uchar* le2vlong(vlong *to, uchar *f) { uchar *t, *o; int i; t = (uchar*)to; o = (uchar*)&uvorder; for(i = 0; i < sizeof(vlong); i++) t[o[i]] = f[i]; return f+sizeof(vlong); } static uchar* vlong2le(uchar *t, vlong from) { uchar *f, *o; int i; f = (uchar*)&from; o = (uchar*)&uvorder; for(i = 0; i < sizeof(vlong); i++) t[i] = f[o[i]]; return t+sizeof(vlong); } static long order = 0x00010203; static uchar* le2long(long *to, uchar *f) { uchar *t, *o; int i; t = (uchar*)to; o = (uchar*)ℴ for(i = 0; i < sizeof(long); i++) t[o[i]] = f[i]; return f+sizeof(long); } static uchar* long2le(uchar *t, long from) { uchar *f, *o; int i; f = (uchar*)&from; o = (uchar*)ℴ for(i = 0; i < sizeof(long); i++) t[i] = f[o[i]]; return t+sizeof(long); } char *Ebadtimectl = "bad time control"; /* * like the old #c/time but with added info. Return * * secs nanosecs fastticks fasthz */ static int readtime(ulong off, char *buf, int n) { vlong nsec, ticks; long sec; char str[7*NUMSIZE+4]; // extra 4 bytes are null plus doprint // reserving space for a frigging UTF // char nsec = todget(&ticks); if(fasthz == 0LL) fastticks((uvlong*)&fasthz); sec = nsec/1000000000ULL; snprint(str, sizeof(str), "%*.0lud %*.0llud %*.0llud %*.0llud ", NUMSIZE-1, sec, 2*NUMSIZE-1, nsec, 2*NUMSIZE-1, ticks, 2*NUMSIZE-1, fasthz); return readstr(off, buf, n, str); } /* * set the time in seconds */ static int writetime(char *buf, int n) { char b[13]; long i; vlong now; if(n >= sizeof(b)) error(Ebadtimectl); strncpy(b, buf, n); b[n] = 0; i = strtol(b, 0, 0); if(i <= 0) error(Ebadtimectl); now = i*1000000000LL; todset(now, 0, 0); return n; } /* * read binary time info. all numbers are little endian. * ticks and nsec are syncronized. */ static int readbintime(char *buf, int n) { int i; vlong nsec, ticks; uchar *b = (uchar*)buf; i = 0; if(fasthz == 0LL) fastticks((uvlong*)&fasthz); nsec = todget(&ticks); if(n >= 3*sizeof(uvlong)){ vlong2le(b+2*sizeof(uvlong), fasthz); i += sizeof(uvlong); } if(n >= 2*sizeof(uvlong)){ vlong2le(b+sizeof(uvlong), ticks); i += sizeof(uvlong); } if(n >= 8){ vlong2le(b, nsec); i += sizeof(vlong); } return i; } /* * set any of the following * - time in nsec * - nsec trim applied over some seconds * - clock frequency */ static int writebintime(char *buf, int n) { uchar *p; vlong delta; long period; n--; p = (uchar*)buf + 1; switch(*buf){ case 'n': if(n < sizeof(vlong)) error(Ebadtimectl); le2vlong(&delta, p); todset(delta, 0, 0); break; case 'd': if(n < sizeof(vlong)+sizeof(long)) error(Ebadtimectl); p = le2vlong(&delta, p); le2long(&period, p); todset(-1, delta, period); break; case 'f': if(n < sizeof(uvlong)) error(Ebadtimectl); le2vlong(&fasthz, p); todsetfreq(fasthz); break; } . 885,897d 871,883c case Qbintime: if(!iseve()) error(Eperm); return writebintime(a, n); . 860,869c if(!iseve()) error(Eperm); return writetime(a, n); . 813d 805d 719,737d 667,694d 661,665c case Qbintime: return readbintime(buf, n); . 650,659c case Qtime: return readtime((ulong)offset, buf, n); . 559,560c vlong offset = off; . 535,549d 408,445d 401,406d 398c "zero", {Qzero}, 0, 0666, . 395,396c "time", {Qtime}, 7*NUMSIZE, 0664, . 384,385d 382d 379d 374c "bintime", {Qbintime}, 24, 0664, . 354,355d 349,350d 343,344c Qbintime, . 34a static int readtime(ulong, char*, int); static int readbintime(char*, int); static int writetime(char*, int); static int writebintime(char*, int); . ## diffname port/devcons.c 1999/0712 ## diff -e /n/emeliedump/1999/0711/sys/src/brazil/port/devcons.c /n/emeliedump/1999/0712/sys/src/brazil/port/devcons.c 922c if(++rb.randomcount > 0) . ## diffname port/devcons.c 1999/0713 ## diff -e /n/emeliedump/1999/0712/sys/src/brazil/port/devcons.c /n/emeliedump/1999/0713/sys/src/brazil/port/devcons.c 922c if(++rb.randomcount > 100000) . ## diffname port/devcons.c 1999/0714 ## diff -e /n/emeliedump/1999/0713/sys/src/brazil/port/devcons.c /n/emeliedump/1999/0714/sys/src/brazil/port/devcons.c 819,821d 392c "zero", {Qzero}, 0, 0444, . ## diffname port/devcons.c 1999/0720 ## diff -e /n/emeliedump/1999/0714/sys/src/brazil/port/devcons.c /n/emeliedump/1999/0720/sys/src/brazil/port/devcons.c 773a if(strncmp(a, "panic", 5) == 0) panic("/dev/reboot"); . ## diffname port/devcons.c 1999/0728 ## diff -e /n/emeliedump/1999/0720/sys/src/brazil/port/devcons.c /n/emeliedump/1999/0728/sys/src/brazil/port/devcons.c 1091,1093c VLNUMSIZE-1, nsec, VLNUMSIZE-1, ticks, VLNUMSIZE-1, fasthz); . 390c "time", {Qtime}, NUMSIZE+3*VLNUMSIZE, 0664, . 368a enum { VLNUMSIZE= 22, }; . ## diffname port/devcons.c 1999/0820 ## diff -e /n/emeliedump/1999/0728/sys/src/brazil/port/devcons.c /n/emeliedump/1999/0820/sys/src/brazil/port/devcons.c 245a return; case 'D': consdebug = rdb; . 158a int iprint(char *fmt, ...) { int n, s; va_list arg; char buf[PRINTSIZE]; s = splhi(); va_start(arg, fmt); n = doprint(buf, buf+sizeof(buf), fmt, arg) - buf; va_end(arg); serialputs(buf, n); splx(s); return n; } . ## diffname port/devcons.c 1999/0825 ## diff -e /n/emeliedump/1999/0820/sys/src/brazil/port/devcons.c /n/emeliedump/1999/0825/sys/src/brazil/port/devcons.c 195a void _assert(char *fmt) { panic("assert failed: %s", fmt); } . ## diffname port/devcons.c 1999/1005 ## diff -e /n/emeliedump/1999/0825/sys/src/brazil/port/devcons.c /n/emeliedump/1999/1005/sys/src/brazil/port/devcons.c 411a "newkernel", {Qnewkernel}, 0, 0000, /* stupid hack -rsc */ . 380a Qnewkernel, . 270,272d 210c if(up == nil || up->fgrp == nil) . 187a serialputs(buf, n+1); rdb(); . 182a splhi(); . 170a // screenputs(buf, n); . 150a if(noprint) return -1; . 143a int noprint; . 8c void (*consdebug)(void) = rdb; . ## diffname port/devcons.c 1999/1016 ## diff -e /n/emeliedump/1999/1005/sys/src/brazil/port/devcons.c /n/emeliedump/1999/1016/sys/src/brazil/port/devcons.c 276,277c if(consdebug == nil) consdebug = rdb; else consdebug = nil; print("consdebug now 0x%lx\n", consdebug); return; case 'D': if(consdebug == nil) consdebug = rdb; consdebug(); . 196c if(consdebug) consdebug(); . 8c void (*consdebug)(void) = nil; . ## diffname port/devcons.c 2000/0120 ## diff -e /n/emeliedump/1999/1016/sys/src/brazil/port/devcons.c /n/emeliedump/2000/0120/sys/src/9/port/devcons.c 821a if(strncmp(a, "malloc", 6) == 0){ /* rsc bug */ a = malloc(2); strcpy(a, "hi"); free(a); a = malloc(2); strcpy(a, "helo"); free(a); panic("not reached conswrite"); } . ## diffname port/devcons.c 2000/0316 ## diff -e /n/emeliedump/2000/0120/sys/src/9/port/devcons.c /n/emeliedump/2000/0316/sys/src/9/port/devcons.c 428d 396d ## diffname port/devcons.c 2000/0522 ## diff -e /n/emeliedump/2000/0316/sys/src/9/port/devcons.c /n/emeliedump/2000/0522/sys/src/9/port/devcons.c 281c print("consdebug now 0x%p\n", consdebug); . ## diffname port/devcons.c 2000/0609 ## diff -e /n/emeliedump/2000/0522/sys/src/9/port/devcons.c /n/emeliedump/2000/0609/sys/src/9/port/devcons.c 949,1065c return randn; . 941,942c randn = randn*1103515245 + 12345 + MACHP(0)->ticks; return (randn>>16) % n; . 939c if(randn == 0) . 933c randomread((void*)&randn, sizeof(randn)); . 914,928c static ulong randn; . 32,33d ## diffname port/devcons.c 2000/0706 ## diff -e /n/emeliedump/2000/0609/sys/src/9/port/devcons.c /n/emeliedump/2000/0706/sys/src/9/port/devcons.c 141a char* seprint(char *buf, char *e, char *fmt, ...) { char *out; va_list arg; va_start(arg, fmt); out = doprint(buf, e, fmt, arg); va_end(arg); return out; } . ## diffname port/devcons.c 2000/0913 ## diff -e /n/emeliedump/2000/0706/sys/src/9/port/devcons.c /n/emeliedump/2000/0913/sys/src/9/port/devcons.c 1016,1017c char str[7*NUMSIZE]; . ## diffname port/devcons.c 2000/1020 ## diff -e /n/emeliedump/2000/0913/sys/src/9/port/devcons.c /n/emeliedump/2000/1020/sys/src/9/port/devcons.c 484a kbdputcinit(); . 382,390c kbd.ir = kbd.iw = kbd.istage; kbd.ie = kbd.istage + sizeof(kbd.istage); addclock0link(kbdputcclock); . 379,380c static void kbdputcinit(void) . 375,376c char *iw; /* this amortizes cost of qproduce */ if(kbd.iw != kbd.ir){ iw = kbd.iw; if(iw < kbd.ir){ echo(kbd.ir, kbd.ie-kbd.ir); kbd.ir = kbd.istage; } echo(kbd.ir, iw-kbd.ir); kbd.ir = iw; } . 372,373c /* * we save up input characters till clock time to reduce * per character interrupt overhead. */ static void kbdputcclock(void) . 364,368c for(i = 0; i < n; i++){ next = kbd.iw+1; if(next >= kbd.ie) next = kbd.istage; if(next == kbd.ir) break; *kbd.iw = buf[i]; kbd.iw = next; } iunlock(&kbd.lockputc); . 361a ilock(&kbd.lockputc); /* just a mutex */ . 360a char *next; . 358c int i, n; . 335c qiwrite(printq, ebuf, p - ebuf); . 333c if(p == ebuf) return; screenputs(ebuf, p - ebuf); . 326,331c p = ebuf; e = ebuf + sizeof(ebuf) - 4; while(n-- > 0){ if(p >= e){ screenputs(ebuf, p - ebuf); if(printq) qiwrite(printq, ebuf, p - ebuf); p = ebuf; } x = *buf++; if(x == '\n'){ *p++ = '\r'; *p++ = '\n'; } else if(x == 0x15){ *p++ = '^'; *p++ = 'U'; *p++ = '\n'; } else *p++ = x; . 315,319c qproduce(kbdq, buf, n); . 313a ctrlt = 0; . 269,276c if(ctrlt != 2){ ctrlt = 0; continue; } /* ^T escapes */ switch(*p){ . 260,267c e = buf+n; for(p = buf; p < e; p++){ switch(*p){ case 0x10: /* ^P */ if(cpuserver && !kbd.ctlpoff){ active.exiting = 1; return; } break; case 0x14: /* ^T */ ctrlt++; continue; } . 258a char *e, *p; char ebuf[128]; . 254c echo(char *buf, int n) . 26a /* someplace to save up characters at interrupt time before dumping them in the q */ Lock lockputc; char istage[128]; char *iw; char *ir; char *ie; . 23d ## diffname port/devcons.c 2000/1021 ## diff -e /n/emeliedump/2000/1020/sys/src/9/port/devcons.c /n/emeliedump/2000/1021/sys/src/9/port/devcons.c 360c echoprintq(buf, n); . 333,358c echoscreen(buf, n); . 266d 258a static void echoscreen(char *buf, int n) { char *e, *p; char ebuf[128]; int x; p = ebuf; e = ebuf + sizeof(ebuf) - 4; while(n-- > 0){ if(p >= e){ screenputs(ebuf, p - ebuf); p = ebuf; } x = *buf++; if(x == 0x15){ *p++ = '^'; *p++ = 'U'; *p++ = '\n'; } else *p++ = x; } if(p != ebuf) screenputs(ebuf, p - ebuf); } static void echoprintq(char *buf, int n) { char *e, *p; char ebuf[128]; int x; p = ebuf; e = ebuf + sizeof(ebuf) - 4; while(n-- > 0){ if(p >= e){ qiwrite(printq, ebuf, p - ebuf); p = ebuf; } x = *buf++; if(x == '\n'){ *p++ = '\r'; *p++ = '\n'; } else if(x == 0x15){ *p++ = '^'; *p++ = 'U'; *p++ = '\n'; } else *p++ = x; } if(p != ebuf) qiwrite(printq, ebuf, p - ebuf); } . ## diffname port/devcons.c 2000/1101 ## diff -e /n/emeliedump/2000/1021/sys/src/9/port/devcons.c /n/emeliedump/2000/1101/sys/src/9/port/devcons.c 827c putstrn0(buf, bp, 1); . 403c next = kbd.iw+1; if(next >= kbd.ie) next = kbd.istage; if(next != kbd.ir){ *kbd.iw = ch; kbd.iw = next; } iunlock(&kbd.lockputc); return 0; . 401c char *next; ilock(&kbd.lockputc); /* just a mutex */ if(ch == '\r' && !kbd.raw) . 399c kbdcr2nl(Queue*, int ch) . 396c * turn '\r' into '\n' before putting it into the queue. we * can't type runs on alternate consoles, so don't worry about it. . 385,387d 322a if(kbd.raw){ qproduce(kbdq, buf, n); return; } . 216a putstrn(buf, n+1); . 214d 98,108c if(t && !kbd.raw) { m = t-str; if(usewrite){ qwrite(printq, str, m); qwrite(printq, "\r\n", 2); } else { qiwrite(printq, str, m); qiwrite(printq, "\r\n", 2); } n -= m+1; str = t+1; . 79d 65c if(m->ticks - now >= HZ) break; . 63a ulong now; now = m->ticks; . 29c char istage[512]; . ## diffname port/devcons.c 2000/1104 ## diff -e /n/emeliedump/2000/1101/sys/src/9/port/devcons.c /n/emeliedump/2000/1104/sys/src/9/port/devcons.c 388d 373,375c //x = spllo(); //procdump(); //splx(x); print("procdump temporarily disabled\n"); . 349a ctrlt = 0; . 347d 344,345c if(ctrlt != 2) . ## diffname port/devcons.c 2000/1105 ## diff -e /n/emeliedump/2000/1104/sys/src/9/port/devcons.c /n/emeliedump/2000/1105/sys/src/9/port/devcons.c 400c * can't type runes on alternate consoles, so don't worry about it. . 390a if(kbd.raw) return; . 334c if(cpuserver && !kbd.ctlpoff && !kbd.raw){ . 326,329d ## diffname port/devcons.c 2000/1106 ## diff -e /n/emeliedump/2000/1105/sys/src/9/port/devcons.c /n/emeliedump/2000/1106/sys/src/9/port/devcons.c 368,371c x = spllo(); procdump(); splx(x); . ## diffname port/devcons.c 2000/1207 ## diff -e /n/emeliedump/2000/1106/sys/src/9/port/devcons.c /n/emeliedump/2000/1207/sys/src/9/port/devcons.c 330c if(cpuserver && !kbd.ctlpoff){ . ## diffname port/devcons.c 2000/1214 ## diff -e /n/emeliedump/2000/1207/sys/src/9/port/devcons.c /n/emeliedump/2000/1214/sys/src/9/port/devcons.c 1100d ## diffname port/devcons.c 2001/0115 ## diff -e /n/emeliedump/2000/1214/sys/src/9/port/devcons.c /n/emeliedump/2001/0115/sys/src/9/port/devcons.c 396,397c * turn '\r' into '\n' before putting it into the queue. . 317d 27c /* a place to save up characters at interrupt time before dumping them in the queue */ . 24d ## diffname port/devcons.c 2001/0217 ## diff -e /n/emeliedump/2001/0115/sys/src/9/port/devcons.c /n/emeliedump/2001/0217/sys/src/9/port/devcons.c 334a if(ctrlt > 2) ctrlt = 2; . ## diffname port/devcons.c 2001/0316 ## diff -e /n/emeliedump/2001/0217/sys/src/9/port/devcons.c /n/emeliedump/2001/0316/sys/src/9/port/devcons.c 860a qunlock(&kbd); . 858a qlock(&kbd); . 662,666d ## diffname port/devcons.c 2001/0430 ## diff -e /n/emeliedump/2001/0316/sys/src/9/port/devcons.c /n/emeliedump/2001/0430/sys/src/9/port/devcons.c 428a if(kbd.ir == nil) return 0; /* in case we're not inited yet */ . ## diffname port/devcons.c 2001/0527 ## diff -e /n/emeliedump/2001/0430/sys/src/9/port/devcons.c /n/emeliedump/2001/0527/sys/src/9/port/devcons.c 992d 981c snprint(buf, sizeof buf, f, conffile); . 979c char buf[64]; . 970c print("conswrite: 0x%llux\n", c->qid.path); . 963,966c strncpy(buf, a, n); buf[n] = 0; if(buf[n-1] == '\n') buf[n-1] = 0; kstrdup(&sysname, buf); . 961c if(n <= 0 || n >= sizeof buf) . 893,901d 825c switch((ulong)c->qid.path){ . 808c print("consread 0x%llux\n", c->qid.path); . 806a case Qosversion: n = readstr((ulong)offset, buf, n, "2000"); return n; . 786a if(sysname == nil) return 0; . 729,737d 710a case Qkprint: return qread(kprintoq, buf, n); . 639c switch((ulong)c->qid.path){ . 619,622c /* close of kprint allows other opens */ case Qkprint: if(c->flag & COPEN){ unlock(&kprintinuse); qhangup(kprintoq, nil); } break; . 610d 608a switch((ulong)c->qid.path){ . 603c return c; . 601a case Qkprint: if(!canlock(&kprintinuse)){ c->flag &= ~COPEN; error(Einuse); } if(kprintoq == nil){ kprintoq = qopen(8*1024, -1, 0, 0); if(kprintoq == nil){ c->flag &= ~COPEN; error(Enomem); } qnoblock(kprintoq, 1); }else qreopen(kprintoq); break; . 596,597d 593,594c c->aux = nil; c = devopen(c, omode, consdir, nelem(consdir), devgen); switch((ulong)c->qid.path){ . 587c return devstat(c, dp, n, consdir, nelem(consdir), devgen); . 584,585c static int consstat(Chan *c, uchar *dp, int n) . 581c return devwalk(c, nc, name,nname, consdir, nelem(consdir), devgen); . 578,579c static Walkqid* conswalk(Chan *c, Chan *nc, char **name, int nname) . 531c "user", {Quser}, 0, 0666, . 521a "osversion", {Qosversion}, 0, 0444, . 520a "kprint", {Qkprint, 0, QTEXCL}, 0, DMEXCL|0440, . 519c "hostowner", {Qhostowner}, 0, 0664, . 510,512c ".", {Qdir, 0, QTDIR}, 0, DMDIR|0555, . 490a Qosversion, . 487a Qkprint, . 479,481d 388,390c if(screenputs != nil) echoscreen(buf, n); if(serialoq) echoserialoq(buf, n); . 313c qiwrite(serialoq, ebuf, p - ebuf); . 298c qiwrite(serialoq, ebuf, p - ebuf); . 288c echoserialoq(char *buf, int n) . 213c if(serialputs != nil) serialputs(buf, n+1); . 206a kprintoq = nil; /* don't try to write to /dev/kprint */ if(panicking) for(;;); panicking = 1; . 205a static int panicking; . 193,194c if(screenputs != nil) screenputs(buf, n); if(serialputs != nil) serialputs(buf, n); . 115c qiwrite(serialoq, str, n); . 113c qwrite(serialoq, str, n); . 106,107c qiwrite(serialoq, str, m); qiwrite(serialoq, "\r\n", 2); . 103,104c qwrite(serialoq, str, m); qwrite(serialoq, "\r\n", 2); . 96a } . 95c if(kprintoq != nil && !qisclosed(kprintoq)){ if(usewrite) qwrite(kprintoq, str, n); else qiwrite(kprintoq, str, n); }else if(screenputs != nil) screenputs(str, n); if(serialoq == nil){ if(serialputs != nil) serialputs(str, n); . 84,91c * if someone is reading /dev/kprint and the message * is from the kernel (as opposed to from conswrite), * put the message there. * if not and there's an attached bit mapped display, * put the message there. * . 55,56c if(serialoq) return qlen(serialoq) > 0; . 34c char *sysname; . 12c Queue* serialoq; /* serial console output */ Queue* kprintoq; /* console output, for /dev/kprint */ Lock kprintinuse; /* test and set whether /dev/kprint is open */ . 8a void (*screenputs)(char*, int) = nil; void (*serialputs)(char*, int) = nil; . 7a #include . ## diffname port/devcons.c 2001/0819 ## diff -e /n/emeliedump/2001/0527/sys/src/9/port/devcons.c /n/emeliedump/2001/0819/sys/src/9/port/devcons.c 244c // dumpstack(); . ## diffname port/devcons.c 2001/0820 ## diff -e /n/emeliedump/2001/0819/sys/src/9/port/devcons.c /n/emeliedump/2001/0820/sys/src/9/port/devcons.c 244c dumpstack(); . ## diffname port/devcons.c 2001/0904 ## diff -e /n/emeliedump/2001/0820/sys/src/9/port/devcons.c /n/emeliedump/2001/0904/sys/src/9/port/devcons.c 848c snprint(tmp, sizeof tmp, "2000 %d", qiomaxatomic); n = readstr((ulong)offset, buf, n, tmp); . ## diffname port/devcons.c 2001/0925 ## diff -e /n/emeliedump/2001/0904/sys/src/9/port/devcons.c /n/emeliedump/2001/0925/sys/src/9/port/devcons.c 8c #include . ## diffname port/devcons.c 2001/0929 ## diff -e /n/emeliedump/2001/0925/sys/src/9/port/devcons.c /n/emeliedump/2001/0929/sys/src/9/port/devcons.c 925,927d 773,775d 543d 510d ## diffname port/devcons.c 2001/1111 ## diff -e /n/emeliedump/2001/0929/sys/src/9/port/devcons.c /n/emeliedump/2001/1111/sys/src/9/port/devcons.c 592c addclock0link(kbdputcclock); . 495,502d 38c } kbd = { .iw = kbd.istage, .ir = kbd.istage, .ie = kbd.istage + sizeof(kbd.istage), }; . 16,18c Queue* serialoq; /* serial console output */ Queue* kprintoq; /* console output, for /dev/kprint */ Lock kprintinuse; /* test and set whether /dev/kprint is open */ . ## diffname port/devcons.c 2001/1118 ## diff -e /n/emeliedump/2001/1111/sys/src/9/port/devcons.c /n/emeliedump/2001/1118/sys/src/9/port/devcons.c 831a poperror(); . 829a if(waserror()){ free(b); nexterror(); } . 805a poperror(); . 803a if(waserror()){ free(b); nexterror(); } . ## diffname port/devcons.c 2001/1207 ## diff -e /n/emeliedump/2001/1118/sys/src/9/port/devcons.c /n/emeliedump/2001/1207/sys/src/9/port/devcons.c 849c snprint(tmp, sizeof tmp, "2000"); . 634a c->iounit = qiomaxatomic; . ## diffname port/devcons.c 2001/1231 ## diff -e /n/emeliedump/2001/1207/sys/src/9/port/devcons.c /n/emeliedump/2001/1231/sys/src/9/port/devcons.c 544c "random", {Qrandom}, 0, 0444, . 535c "drivers", {Qdrivers}, 0, 0444, . ## diffname port/devcons.c 2002/0109 ## diff -e /n/emeliedump/2001/1231/sys/src/9/port/devcons.c /n/emeliedump/2002/0109/sys/src/9/port/devcons.c 1026a devshutdown, . 1012,1020d 957a } poperror(); free(cb); . 947,956c ct = lookupcmd(cb, reboottbl, nelem(reboottbl)); switch(ct->index) { case CMreboot: rebootcmd(cb->nf-1, cb->f+1); break; case CMpanic: . 943,945c cb = parsecmd(a, n); if(waserror()) { free(cb); nexterror(); . 870a Cmdbuf *cb; Cmdtab *ct; . 52a enum { CMreboot, CMpanic, }; Cmdtab reboottbl[] = { CMreboot, "reboot", 0, CMpanic, "panic", 0, }; . ## diffname port/devcons.c 2002/0115 ## diff -e /n/emeliedump/2002/0109/sys/src/9/port/devcons.c /n/emeliedump/2002/0115/sys/src/9/port/devcons.c 106,107c * if someone is reading /dev/kprint, . ## diffname port/devcons.c 2002/0217 ## diff -e /n/emeliedump/2002/0115/sys/src/9/port/devcons.c /n/emeliedump/2002/0217/sys/src/9/port/devcons.c 286c n = vseprint(buf+n, buf+sizeof(buf), fmt, arg) - buf; . 249c n = vseprint(buf+strlen(buf), buf+sizeof(buf), fmt, arg) - buf; . 221c n = vseprint(buf, buf+sizeof(buf), fmt, arg) - buf; . 205c n = vseprint(buf, buf+sizeof(buf), fmt, arg) - buf; . 157,191d ## diffname port/devcons.c 2002/0402 ## diff -e /n/emeliedump/2002/0217/sys/src/9/port/devcons.c /n/emeliedump/2002/0402/sys/src/9/port/devcons.c 634c kprintinuse = 0; . 598c if(tas(&kprintinuse) != 0){ . 18c ulong kprintinuse; /* test and set whether /dev/kprint is open */ . ## diffname port/devcons.c 2002/0404 ## diff -e /n/emeliedump/2002/0402/sys/src/9/port/devcons.c /n/emeliedump/2002/0404/sys/src/9/port/devcons.c 927c ct = lookupcmd(cb, rebootmsg, nelem(rebootmsg)); . 386c return; . 383c return; . 379c return; #ifdef RSC case 'Q': { extern void dumpschedlog(void); dumpschedlog(); return; } #endif . 359c return; . 353c return; . 350a case 'S': x = splhi(); dumpstack(); procdump(); splx(x); return; . 188c if(screenputs != nil && iprintscreenputs) . 59c Cmdtab rebootmsg[] = . 18a int iprintscreenputs = 1; . ## diffname port/devcons.c 2002/0410 ## diff -e /n/emeliedump/2002/0404/sys/src/9/port/devcons.c /n/emeliedump/2002/0410/sys/src/9/port/devcons.c 387,394d ## diffname port/devcons.c 2002/0412 ## diff -e /n/emeliedump/2002/0410/sys/src/9/port/devcons.c /n/emeliedump/2002/0412/sys/src/9/port/devcons.c 221c (*consdebug)(); . 218,219c uartputs(buf, n+1); . 191,192c uartputs(buf, n); . 124,125c uartputs(str, n); . 12d ## diffname port/devcons.c 2002/0711 ## diff -e /n/emeliedump/2002/0412/sys/src/9/port/devcons.c /n/emeliedump/2002/0711/sys/src/9/port/devcons.c 606c kprintoq = qopen(8*1024, Qcoalesce, 0, 0); . ## diffname port/devcons.c 2002/0816 ## diff -e /n/emeliedump/2002/0711/sys/src/9/port/devcons.c /n/emeliedump/2002/0816/sys/src/9/port/devcons.c 68c lineq = qopen(2*1024, 0, nil, nil); . ## diffname port/devcons.c 2002/0821 ## diff -e /n/emeliedump/2002/0816/sys/src/9/port/devcons.c /n/emeliedump/2002/0821/sys/src/9/port/devcons.c 779a bp += NUMSIZE; readnum(0, bp, NUMSIZE, dutycycle(mp), NUMSIZE); . 760c b = smalloc(conf.nmach*(NUMSIZE*9+1) + 1); /* +1 for NUL */ . 643a /* * calculate duty cycle for a processor (100-(%time in idlehands())) */ static int dutycycle(Mach *mp) { static ulong ticks; uvlong hz; int x; if(ticks == 0){ fastticks(&hz); ticks = hz/HZ; } x = ticks - mp->avginidle; if(x < 0) return 0; x *= 100; return x/ticks; } . ## diffname port/devcons.c 2002/0822 ## diff -e /n/emeliedump/2002/0821/sys/src/9/port/devcons.c /n/emeliedump/2002/0822/sys/src/9/port/devcons.c 802c readnum(0, bp, NUMSIZE, (mp->perf.avg_inidle*100)/mp->perf.period, NUMSIZE); bp += NUMSIZE; readnum(0, bp, NUMSIZE, (mp->perf.avg_inintr*100)/mp->perf.period, NUMSIZE); . 781c b = smalloc(conf.nmach*(NUMSIZE*11+1) + 1); /* +1 for NUL */ . 644,664d ## diffname port/devcons.c 2002/0924 ## diff -e /n/emeliedump/2002/0822/sys/src/9/port/devcons.c /n/emeliedump/2002/0924/sys/src/9/port/devcons.c 384,385c killbig(); . ## diffname port/devcons.c 2002/0925 ## diff -e /n/emeliedump/2002/0924/sys/src/9/port/devcons.c /n/emeliedump/2002/0925/sys/src/9/port/devcons.c 201d 19a int panicking; . ## diffname port/devcons.c 2002/0928 ## diff -e /n/emeliedump/2002/0925/sys/src/9/port/devcons.c /n/emeliedump/2002/0928/sys/src/9/port/devcons.c 567c /* * at 115200 baud, the 1024 char buffer takes 56 ms to process, * processing it every 22 ms should be fine */ addclock0link(kbdputcclock, 22); . 36c char istage[1024]; . ## diffname port/devcons.c 2003/0305 ## diff -e /n/emeliedump/2002/0928/sys/src/9/port/devcons.c /n/emeliedump/2003/0305/sys/src/9/port/devcons.c 20c int panicking; . 18c int iprintscreenputs = 1; . ## diffname port/devcons.c 2003/0403 ## diff -e /n/emeliedump/2003/0305/sys/src/9/port/devcons.c /n/emeliedump/2003/0403/sys/src/9/port/devcons.c 660a . 465d