#include "fns.h"
#include "../port/error.h"
-#include <pool.h>
#include <authsrv.h>
void (*consdebug)(void) = nil;
break;
}
-/*
- * Log console output so it can be retrieved via /dev/kmesg.
- * This is good for catching boot-time messages after the fact.
- */
-struct {
- Lock lk;
- char buf[16384];
- uint n;
-} kmesg;
-
static void
kmesgputs(char *str, int n)
{
{
int m;
char *t;
-
- if(!islo())
- usewrite = 0;
+ int (*wq)(Queue*, void*, int);
/*
* how many different output devices do we need?
* if there's a serial line being used as a console,
* put the message there.
*/
- if(kprintoq != nil && !qisclosed(kprintoq)){
- if(usewrite)
- qwrite(kprintoq, str, n);
- else
- qiwrite(kprintoq, str, n);
- }else if(screenputs != nil)
+ wq = usewrite && islo() ? qwrite : qiwrite;
+ if(kprintoq != nil && !qisclosed(kprintoq))
+ (*wq)(kprintoq, str, n);
+ else if(screenputs != nil)
screenputs(str, n);
if(serialoq == nil){
t = memchr(str, '\n', n);
if(t != nil) {
m = t-str;
- if(usewrite){
- qwrite(serialoq, str, m);
- qwrite(serialoq, "\r\n", 2);
- } else {
- qiwrite(serialoq, str, m);
- qiwrite(serialoq, "\r\n", 2);
- }
+ (*wq)(serialoq, str, m);
+ (*wq)(serialoq, "\r\n", 2);
n -= m+1;
str = t+1;
} else {
- if(usewrite)
- qwrite(serialoq, str, n);
- else
- qiwrite(serialoq, str, n);
+ (*wq)(serialoq, str, n);
break;
}
}
Qppid,
Qrandom,
Qreboot,
- Qswap,
Qsysname,
Qsysstat,
Qtime,
"ppid", {Qppid}, NUMSIZE, 0444,
"random", {Qrandom}, 0, 0444,
"reboot", {Qreboot}, 0, 0664,
- "swap", {Qswap}, 0, 0664,
"sysname", {Qsysname}, 0, 0664,
"sysstat", {Qsysstat}, 0, 0666,
"time", {Qtime}, NUMSIZE+3*VLNUMSIZE, 0664,
ulong l;
Mach *mp;
char *b, *bp;
- char tmp[256]; /* must be >= 18*NUMSIZE (Qswap) */
+ char tmp[256];
int i, k, id;
vlong offset = off;
extern char configfile[];
- extern Image fscache;
- extern Image swapimage;
if(n <= 0)
return n;
poperror();
return n;
- case Qswap:
- snprint(tmp, sizeof tmp,
- "%llud memory\n"
- "%llud pagesize\n"
- "%lud kernel\n"
- "%lud/%lud user\n"
- "%lud/%lud swap\n"
- "%llud/%llud/%llud kernel malloc\n"
- "%llud/%llud/%llud kernel draw\n"
- "%llud/%llud/%llud kernel secret\n",
- (uvlong)conf.npage*BY2PG,
- (uvlong)BY2PG,
- conf.npage-conf.upages,
- palloc.user-palloc.freecount-fscache.pgref-swapimage.pgref, palloc.user,
- conf.nswap-swapalloc.free, conf.nswap,
- (uvlong)mainmem->curalloc,
- (uvlong)mainmem->cursize,
- (uvlong)mainmem->maxsize,
- (uvlong)imagmem->curalloc,
- (uvlong)imagmem->cursize,
- (uvlong)imagmem->maxsize,
- (uvlong)secrmem->curalloc,
- (uvlong)secrmem->cursize,
- (uvlong)secrmem->maxsize);
-
- return readstr((ulong)offset, buf, n, tmp);
-
case Qsysname:
if(sysname == nil)
return 0;
long l, bp;
char *a;
Mach *mp;
- int id, fd;
- Chan *swc;
+ int id;
ulong offset;
Cmdbuf *cb;
Cmdtab *ct;
}
break;
- case Qswap:
- if(n >= sizeof buf)
- error(Egreg);
- memmove(buf, va, n); /* so we can NUL-terminate */
- buf[n] = 0;
- /* start a pager if not already started */
- if(strncmp(buf, "start", 5) == 0){
- kickpager();
- break;
- }
- if(!iseve())
- error(Eperm);
- if(buf[0]<'0' || '9'<buf[0])
- error(Ebadarg);
- fd = strtoul(buf, 0, 0);
- swc = fdtochan(fd, ORDWR, 1, 1);
- setswapchan(swc);
- break;
-
case Qsysname:
if(offset != 0)
error(Ebadarg);
vlong delta;
long period;
- n--;
+ if(--n <= 0)
+ error(Ebadtimectl);
p = (uchar*)buf + 1;
switch(*buf){
case 'n':
todsetfreq(fasthz);
break;
}
- return n;
+ return n+1;
}
void
{
int ms, once;
- lock(&active);
once = active.machs[m->machno];
active.machs[m->machno] = 0;
active.exiting = 1;
- unlock(&active);
if(once)
iprint("cpu%d: exiting\n", m->machno);