M gnot/dat.h => gnot/dat.h +1 -1
@@ 454,7 454,7 @@ enum {
Sctlqid = Sdataqid-1,
Slowqid = Sctlqid,
Streamhi= (9*1024), /* byte count high water mark */
- Streambhi= 16, /* block count high water mark */
+ Streambhi= 32, /* block count high water mark */
};
#define PRINTSIZE 256
M port/devcons.c => port/devcons.c +70 -0
@@ 290,6 290,7 @@ enum{
Qdir,
Qcons,
Qcputime,
+ Qlog,
Qnull,
Qpgrpid,
Qpid,
@@ 301,6 302,7 @@ enum{
Dirtab consdir[]={
"cons", Qcons, 0, 0600,
"cputime", Qcputime, 72, 0600,
+ "log", Qlog, sizeof(SYSLOG->buf), 0600,
"null", Qnull, 0, 0600,
"pgrpid", Qpgrpid, 12, 0600,
"pid", Qpid, 12, 0600,
@@ 496,6 498,9 @@ consread(Chan *c, void *buf, long n)
case Quser:
return readstr(c->offset, buf, n, u->p->pgrp->user);
+ case Qlog:
+ return readlog(c->offset, buf, n);
+
case Qnull:
return 0;
@@ 588,3 593,68 @@ consuserstr(Error *e, char *buf)
{
strcpy(buf, u->p->pgrp->user);
}
+
+/*
+ * crash info
+ */
+void
+sysloginit(void)
+{
+ Syslog *s;
+ char *p;
+
+ s = SYSLOG;
+ if(s->magic!=SYSLOGMAGIC || s->next>=&s->buf[sizeof(s->buf)]
+ || s->next<s->buf){
+ 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;
+}
M port/page.c => port/page.c +1 -0
@@ 493,6 493,7 @@ segaddr(Seg *s, ulong min, ulong max)
if(max < min)
return 0;
+if(max > 20*1024*1024) pprint("segaddr %lux\n", max);
if(min != s->minva) /* can't grow down yet (stacks: fault.c) */
return 0;
max = (max+(BY2PG-1)) & ~(BY2PG-1);
M power/dat.h => power/dat.h +3 -3
@@ 694,11 694,11 @@ extern FPsave initfp;
/*
* kernel based system log, passed between crashes
*/
-#define SYSLOG ((Syslog *)(0x80001B00))
-#define SYSLOGMAGIC 0x12345678
+#define SYSLOG ((Syslog *)(0xa0001B00))
+#define SYSLOGMAGIC 0x87654321
struct Syslog
{
ulong magic;
char *next;
- char buf[16*1024];
+ char buf[8*1024];
};
M power/fns.h => power/fns.h +1 -0
@@ 139,6 139,7 @@ void putbq(Blist*, Block*);
int putq(Queue*, Block*);
void putstrn(char*, long);
ulong pwait(Waitmsg*);
+int readlog(ulong, char*, ulong);
int readnum(ulong, char*, ulong, ulong, int);
void ready(Proc*);
void rooterrstr(Error*, char*);