plan 9 kernel history: overview | file list | diff list

1990/1018/port/devcons.c (diff list | history)

1990/0928/sys/src/9/port/devcons.c:36,501990/1018/sys/src/9/port/devcons.c:36,50 (short | long | prev | next)
1990/0227    
IOQ	kbdq;		/* qlock to getc; interrupt putc's */ 
IOQ	lineq;		/* lock to getc; interrupt putc's */ 
 
1990/0928    
#define SYSLOGMAGIC	0x23456789 
#define SYSLOG		((Syslog *)(UNCACHED | KZERO | 0x1B00)) 
1990/1018    
#define SYSLOGMAGIC	0xdeadbeaf 
#define SYSLOG		((Syslog *)(UNCACHED | 0x1B00)) 
1990/0928    
typedef struct Syslog	Syslog; 
struct Syslog 
{ 
	ulong	magic; 
	char	*start; 
1990/1018    
	int	wrapped; 
1990/0928    
	char	*next; 
	char	buf[2*BY2PG - 3*BY2WD]; 
1990/1018    
	char	buf[2*1024]; 
1990/0928    
}; 
 
 
1990/0928/sys/src/9/port/devcons.c:67,731990/1018/sys/src/9/port/devcons.c:67,72
1990/0227    
	unlock(&lineq); 
 
	duartinit(); 
1990/0928    
	sysloginit();		/* must be at the end of printinit */ 
1990/0227    
} 
 
/* 
1990/0928/sys/src/9/port/devcons.c:177,1831990/1018/sys/src/9/port/devcons.c:176,181
1990/0227    
{ 
	char buf[PRINTSIZE]; 
	int n; 
1990/0928    
	Syslog *s; 
1990/0227    
 
	strcpy(buf, "panic: "); 
1990/06111    
	n = doprint(buf+7, buf+sizeof(buf), fmt, (&fmt+1)) - buf; 
1990/0928/sys/src/9/port/devcons.c:184,1911990/1018/sys/src/9/port/devcons.c:182,187
1990/0227    
	buf[n] = '\n'; 
	putstrn(buf, n+1); 
1990/0907    
	dumpstack(); 
1990/0928    
	s = SYSLOG; 
	print("start/next is %lux/%lux\n", s->start, s->next); 
1990/0227    
	exit(); 
} 
 
1990/0928/sys/src/9/port/devcons.c:309,3141990/1018/sys/src/9/port/devcons.c:305,311
1990/0227    
	Qcputime, 
1990/0720    
	Qlog, 
1990/0227    
	Qnull, 
1990/1018    
/*	Qpanic, /**/ 
1990/0227    
	Qpgrpid, 
	Qpid, 
	Qppid, 
1990/0928/sys/src/9/port/devcons.c:321,3261990/1018/sys/src/9/port/devcons.c:318,324
1990/0227    
	"cputime",	Qcputime,	72,	0600, 
1990/0912    
	"log",		Qlog,		BY2PG-8,	0600, 
1990/0227    
	"null",		Qnull,		0,	0600, 
1990/1018    
/*	"panic",	Qpanic,		0,	0666, /**/ 
1990/0227    
	"pgrpid",	Qpgrpid,	12,	0600, 
	"pid",		Qpid,		12,	0600, 
	"ppid",		Qppid,		12,	0600, 
1990/0928/sys/src/9/port/devcons.c:618,6951990/1018/sys/src/9/port/devcons.c:616,726
1990/0720    
sysloginit(void) 
{ 
	Syslog *s; 
1990/0928    
	char *start, *next; 
1990/1018    
	int i; 
1990/0720    
 
	s = SYSLOG; 
1990/0928    
	next = s->next; 
	start = s->start; 
	if(s->magic!=SYSLOGMAGIC || next>=&s->buf[sizeof(s->buf)] 
	|| start>=&s->buf[sizeof(s->buf)] || next<s->buf){ 
1990/0912    
		s->start = s->buf; 
1990/1018    
	if(s->magic!=SYSLOGMAGIC || s->next>=&s->buf[sizeof(s->buf)] || s->next<s->buf){ 
		s->wrapped = 0; 
1990/0720    
		s->next = s->buf; 
		s->magic = SYSLOGMAGIC; 
	} 
1990/0928    
	print("start/next is %lux/%lux was %lux/%lux\n", s->start, s->next, 
		start, next); 
1990/0720    
} 
 
void 
syslog(char *p, int n) 
{ 
1990/0912    
	int restart; 
1990/0720    
	Syslog *s; 
	char *end; 
1990/1018    
	int m; 
1990/0720    
 
1990/1018    
	sysloginit(); 
1990/0720    
	s = SYSLOG; 
	end = &s->buf[sizeof(s->buf)]; 
1990/0912    
	restart = 0; 
1990/0720    
	while(n-- > 0){ 
		*s->next++ = *p++; 
		if(s->next >= end) 
1990/1018    
	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; 
1990/0720    
			s->next = s->buf; 
1990/0912    
		if(s->next == s->start) 
			restart = 1; 
1990/1018    
		} 
1990/0720    
	} 
1990/0912    
	if(restart){ 
		s->start = s->next + 1; 
		if(s->start >= end) 
			s->start = s->buf; 
	} 
	wbflush(); 
1990/0720    
} 
 
long 
readlog(ulong off, char *buf, ulong n) 
1990/1018    
readlog(ulong off, char *buf, ulong len) 
1990/0720    
{ 
	Syslog *s; 
	char *p; 
	char *end; 
1990/0912    
	char *a = buf; 
1990/1018    
	char *start; 
	int n, m; 
	char *p; 
1990/0720    
 
1990/1018    
	n = len; 
	p = buf; 
 
	sysloginit(); 
1990/0720    
	s = SYSLOG; 
1990/1018    
	end = &s->buf[sizeof(s->buf)]; 
1990/0720    
 
	/* past end */ 
	if(off >= sizeof(s->buf)) 
1990/1018    
	if(s->wrapped){ 
		start = s->next; 
		m = sizeof(s->buf); 
	} else { 
		start = s->buf; 
		m = s->next - start; 
	} 
 
	if(off > m) 
1990/0720    
		return 0; 
1990/1018    
	if(off + n > m) 
		n = m - off; 
	start += off; 
	if(start > end) 
		start -= sizeof(s->buf); 
1990/0720    
 
	/* point to start of area to be read */ 
1990/1018    
	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; 
1990/0720    
	end = &s->buf[sizeof(s->buf)]; 
1990/0912    
	p = s->start; 
1990/0720    
 
1990/0912    
	/* skip offset */ 
	while(off-- > 0){ 
		if(p == s->next) 
			return 0; 
		p++; 
	} 
1990/1018    
	x = splhi(); 
	lock(&printq); 
	for(p = s->buf; p < end; p++) 
		*p = *p; 
	unlock(&printq); 
	splx(x); 
1990/0912    
 
	/* copy out */ 
	while(n-- > 0){ 
		if(p == s->next) 
			break; 
		*a++ = *p++; 
1990/0720    
		if(p >= end) 
			p = s->buf; 
	} 
1990/0912    
	return a-buf; 
1990/1018    
	wbflush(); 
1990/0227    
} 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)