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

1990/1004/port/devkprof.c (diff list | history)

1990/03292/sys/src/9/port/devkprof.c:1,151990/0330/sys/src/9/port/devkprof.c:1,11 (short | long)
1990/03292    
#include "syslibc.h" 
#include "lock.h" 
#include "mem.h" 
#include "chan.h" 
#include "proc.h" 
#include "user.h" 
#include "errno.h" 
#include "dev.h" 
#include "misc.h" 
#include "lint.h" 
1990/0330    
#include	"u.h" 
#include	"lib.h" 
#include	"mem.h" 
#include	"dat.h" 
#include	"fns.h" 
#include	"errno.h" 
1990/03292    
 
#include "devtab.h" 
1990/0330    
#include	"devtab.h" 
1990/03292    
 
#define	MAXPC	(100*1024L) 
#define	RES	8 
1990/03292/sys/src/9/port/devkprof.c:28,421990/0330/sys/src/9/port/devkprof.c:24,44
1990/03292    
	Kprofmaxqid, 
}; 
Dirtab kproftab[Nkproftab]={ 
	"kpdata",	Kprofdataqid,		NBUF*sizeof timerbuf[0], 
	"kpstart",	Kprofstartqid,		0, 
	"kpstartclr",	Kprofstartclrqid,	0, 
	"kpstop",	Kprofstopqid,		0, 
1990/0330    
	"kpdata",	Kprofdataqid,		NBUF*sizeof timerbuf[0],	0600, 
	"kpstart",	Kprofstartqid,		0,		0600, 
	"kpstartclr",	Kprofstartclrqid,	0,		0600, 
	"kpstop",	Kprofstopqid,		0,		0600, 
1990/03292    
}; 
 
void 
1990/0330    
kprofreset(void) 
{ 
} 
 
void 
1990/03292    
kprofinit(void) 
{ 
1990/0330    
	extern void *etext; 
1990/03292    
	if((((unsigned long)&etext)-KTZERO)>MAXPC) 
		print("kernel profiling limited to %lud\n", MAXPC); 
} 
1990/03292/sys/src/9/port/devkprof.c:44,551990/0330/sys/src/9/port/devkprof.c:46,57
1990/03292    
Chan * 
kprofattach(char *spec) 
{ 
	return devattach('k', spec); 
1990/0330    
	return devattach('t', spec); 
1990/03292    
} 
Chan * 
kprofclone(Chan *c, Chan *nc) 
{ 
	return devclone('k', c, nc); 
1990/0330    
	return devclone(c, nc); 
1990/03292    
} 
 
int 
1990/03292/sys/src/9/port/devkprof.c:59,811990/0330/sys/src/9/port/devkprof.c:61,81
1990/03292    
} 
 
void 
kprofstat(Chan *c, Dir *db) 
1990/0330    
kprofstat(Chan *c, char *db) 
1990/03292    
{ 
	devstat(c, db, kproftab, (long)Nkproftab, devgen); 
} 
 
Chan * 
kprofopen(Chan *c, int omode, int amode) 
1990/0330    
kprofopen(Chan *c, int omode) 
1990/03292    
{ 
	if(amode==Aattach) 
		return c; 
	omode&=~Otrunc; 
	if(omode==Oexecute) 
		errjmp(Eperm); 
	if(((c->qid&CHDIR) || c->qid==Kprofdataqid) && omode!=Oread) 
		errjmp(Eisdir); 
	c->mode=omode|OPEN; 
	c->offset=0; 
1990/0330    
	if(c->qid == CHDIR){ 
		if(omode != OREAD) 
			error(0, Eperm); 
	} 
	c->mode = openmode(omode); 
	c->flag |= COPEN; 
	c->offset = 0; 
1990/03292    
	return c; 
} 
 
1990/03292/sys/src/9/port/devkprof.c:82,1291990/0330/sys/src/9/port/devkprof.c:82,132
1990/03292    
void 
kprofcreate(Chan *c, char *name, int omode, ulong perm) 
{ 
	Unused(c); 
	Unused(name); 
	Unused(omode); 
	Unused(perm); 
	devunk(); 
1990/0330    
	error(0, Eperm); 
1990/03292    
} 
 
void 
kprofremove(Chan *c) 
{ 
	Unused(c); 
	devunk(); 
1990/0330    
	error(0, Eperm); 
1990/03292    
} 
 
void 
kprofwstat(Chan *c, Dir *dp) 
1990/0330    
kprofwstat(Chan *c, char *dp) 
1990/03292    
{ 
	Unused(c); 
	Unused(dp); 
	devunk(); 
1990/0330    
	error(0, Eperm); 
1990/03292    
} 
 
void 
kprofclose(Chan *c) 
{ 
	Unused(c); 
} 
 
1990/0330    
void 
kprofuserstr(Error *e, char *buf) 
{ 
	consuserstr(e, buf); 
} 
 
void	  
kproferrstr(Error *e, char *buf) 
{ 
	rooterrstr(e, buf); 
} 
 
1990/03292    
long 
kprofread(Chan *c, char *a, long n) 
1990/0330    
kprofread(Chan *c, void *a, long n) 
1990/03292    
{ 
	switch((int)(c->qid&~CHDIR)){ 
	case Kprofdirqid: 
		return devdirread(c, a, n, kproftab, (long)Nkproftab, devgen); 
		break; 
1990/0330    
		return devdirread(c, a, n, kproftab, Nkproftab, devgen); 
1990/03292    
	case Kprofdataqid: 
		if(c->offset>=NBUF*sizeof timerbuf[0]){ 
			n=0; 
1990/0330    
		if(c->offset >= NBUF*sizeof timerbuf[0]){ 
			n = 0; 
1990/03292    
			break; 
		} 
		if(c->offset+n>NBUF*sizeof timerbuf[0]) 
			n=NBUF*sizeof timerbuf[0]-c->offset; 
1990/0330    
		if(c->offset+n > NBUF*sizeof timerbuf[0]) 
			n = NBUF*sizeof timerbuf[0]-c->offset; 
1990/03292    
		memcpy(a, ((char *)timerbuf)+c->offset, n); 
		break; 
	default: 
1990/03292/sys/src/9/port/devkprof.c:130,1361990/0330/sys/src/9/port/devkprof.c:133,138
1990/03292    
		n=0; 
		break; 
	} 
	c->offset+=n; 
	return n; 
} 
 
1990/03292/sys/src/9/port/devkprof.c:137,1561990/0330/sys/src/9/port/devkprof.c:139,156
1990/03292    
long 
kprofwrite(Chan *c, char *a, long n) 
{ 
	Unused(a); 
	switch((int)(c->qid&~CHDIR)){ 
	case Kprofstartclrqid: 
		memset((char *)timerbuf, 0, NBUF*sizeof timerbuf[0]); 
	case Kprofstartqid: 
		consstarttimer(); 
1990/0330    
		duartstarttimer(); 
1990/03292    
		break; 
	case Kprofstopqid: 
		consstoptimer(); 
1990/0330    
		duartstoptimer(); 
1990/03292    
		break; 
	default: 
		devunk(); 
1990/0330    
		error(0, Ebadusefd); 
1990/03292    
	} 
	c->offset+=n; 
	return n; 
} 
 
1990/03292/sys/src/9/port/devkprof.c:159,1661990/0330/sys/src/9/port/devkprof.c:159,166
1990/03292    
{ 
	timerbuf[0]++; 
	if(KTZERO<=pc && pc<KTZERO+MAXPC){ 
		pc-=KTZERO; 
		pc>>=LRES; 
1990/0330    
		pc -= KTZERO; 
		pc >>= LRES; 
1990/03292    
		timerbuf[pc]++; 
	} 
} 
1990/0330/sys/src/9/port/devkprof.c:162,1661990/0331/sys/src/9/port/devkprof.c:162,167 (short | long)
1990/0330    
		pc -= KTZERO; 
		pc >>= LRES; 
1990/03292    
		timerbuf[pc]++; 
	} 
1990/0331    
	} else 
		timerbuf[1]++; 
1990/03292    
} 
1990/0331/sys/src/9/port/devkprof.c:157,1621990/0928/sys/src/9/port/devkprof.c:157,164 (short | long)
1990/03292    
void 
kproftimer(ulong pc) 
{ 
1990/0928    
	extern ulong splpc; 
 
1990/03292    
	timerbuf[0]++; 
	if(KTZERO<=pc && pc<KTZERO+MAXPC){ 
1990/0330    
		pc -= KTZERO; 
1990/0928/sys/src/9/port/devkprof.c:30,381990/1004/sys/src/9/port/devkprof.c:30,41 (short | long)
1990/0330    
	"kpstop",	Kprofstopqid,		0,		0600, 
1990/03292    
}; 
 
1990/1004    
void kproftimer(ulong); 
 
1990/03292    
void 
1990/0330    
kprofreset(void) 
{ 
1990/1004    
	kprofp = kproftimer; 
1990/0330    
} 
 
void 
1990/0928/sys/src/9/port/devkprof.c:157,1631990/1004/sys/src/9/port/devkprof.c:160,171
1990/03292    
void 
kproftimer(ulong pc) 
{ 
1990/0928    
	extern ulong splpc; 
1990/1004    
	/* 
	 *  if the pc is coming out of slplo pr splx, then use 
	 *  the pc saved when we went splhi. 
	 */ 
	if(pc>=(ulong)spllo && pc<=(ulong)spldone) 
		pc = m->splpc; 
1990/0928    
 
1990/03292    
	timerbuf[0]++; 
	if(KTZERO<=pc && pc<KTZERO+MAXPC){ 
1990/1004/sys/src/9/port/devkprof.c:130,1361991/0318/sys/src/9/port/devkprof.c:130,136 (short | long)
1990/03292    
		} 
1990/0330    
		if(c->offset+n > NBUF*sizeof timerbuf[0]) 
			n = NBUF*sizeof timerbuf[0]-c->offset; 
1990/03292    
		memcpy(a, ((char *)timerbuf)+c->offset, n); 
1991/0318    
		memmove(a, ((char *)timerbuf)+c->offset, n); 
1990/03292    
		break; 
	default: 
		n=0; 
1991/0318/sys/src/9/port/devkprof.c:118,1361991/0411/sys/src/9/port/devkprof.c:118,136 (short | long)
1990/0330    
} 
 
1990/03292    
long 
1990/0330    
kprofread(Chan *c, void *a, long n) 
1991/0411    
kprofread(Chan *c, void *a, long n, ulong offset) 
1990/03292    
{ 
	switch((int)(c->qid&~CHDIR)){ 
	case Kprofdirqid: 
1990/0330    
		return devdirread(c, a, n, kproftab, Nkproftab, devgen); 
1990/03292    
	case Kprofdataqid: 
1990/0330    
		if(c->offset >= NBUF*sizeof timerbuf[0]){ 
1991/0411    
		if(offset >= NBUF*sizeof timerbuf[0]){ 
1990/0330    
			n = 0; 
1990/03292    
			break; 
		} 
1990/0330    
		if(c->offset+n > NBUF*sizeof timerbuf[0]) 
			n = NBUF*sizeof timerbuf[0]-c->offset; 
1991/0318    
		memmove(a, ((char *)timerbuf)+c->offset, n); 
1991/0411    
		if(offset+n > NBUF*sizeof timerbuf[0]) 
			n = NBUF*sizeof timerbuf[0]-offset; 
		memmove(a, ((char *)timerbuf)+offset, n); 
1990/03292    
		break; 
	default: 
		n=0; 
1991/0318/sys/src/9/port/devkprof.c:140,1461991/0411/sys/src/9/port/devkprof.c:140,146
1990/03292    
} 
 
long 
kprofwrite(Chan *c, char *a, long n) 
1991/0411    
kprofwrite(Chan *c, char *a, long n, ulong offset) 
1990/03292    
{ 
	switch((int)(c->qid&~CHDIR)){ 
	case Kprofstartclrqid: 
1991/0411/sys/src/9/port/devkprof.c:63,681991/0419/sys/src/9/port/devkprof.c:63,74 (short | long)
1990/03292    
	return devwalk(c, name, kproftab, (long)Nkproftab, devgen); 
} 
 
1991/0419    
Chan* 
kprofclwalk(Chan *c, char *name) 
{ 
	return devclwalk(c, name); 
} 
 
1990/03292    
void 
1990/0330    
kprofstat(Chan *c, char *db) 
1990/03292    
{ 
1991/0419/sys/src/9/port/devkprof.c:24,331991/0421/sys/src/9/port/devkprof.c:24,33 (short | long)
1990/03292    
	Kprofmaxqid, 
}; 
Dirtab kproftab[Nkproftab]={ 
1990/0330    
	"kpdata",	Kprofdataqid,		NBUF*sizeof timerbuf[0],	0600, 
	"kpstart",	Kprofstartqid,		0,		0600, 
	"kpstartclr",	Kprofstartclrqid,	0,		0600, 
	"kpstop",	Kprofstopqid,		0,		0600, 
1991/0421    
	"kpdata",	{Kprofdataqid},		NBUF*sizeof timerbuf[0],	0600, 
	"kpstart",	{Kprofstartqid},	0,		0600, 
	"kpstartclr",	{Kprofstartclrqid},	0,		0600, 
	"kpstop",	{Kprofstopqid},		0,		0600, 
1990/03292    
}; 
 
1990/1004    
void kproftimer(ulong); 
1991/0421/sys/src/9/port/devkprof.c:63,741991/0427/sys/src/9/port/devkprof.c:63,68 (short | long)
1990/03292    
	return devwalk(c, name, kproftab, (long)Nkproftab, devgen); 
} 
 
1991/0419    
Chan* 
kprofclwalk(Chan *c, char *name) 
{ 
	return devclwalk(c, name); 
} 
                 
1990/03292    
void 
1990/0330    
kprofstat(Chan *c, char *db) 
1990/03292    
{ 
1991/0427/sys/src/9/port/devkprof.c:7,331991/1006/sys/src/9/port/devkprof.c:7,32 (short | long)
Created.
rsc Fri Mar 4 12:44:25 2005
1990/03292    
 
1990/0330    
#include	"devtab.h" 
1990/03292    
 
#define	MAXPC	(100*1024L) 
#define	RES	8 
#define	LRES	3 
#define	NBUF	(MAXPC>>LRES) 
1991/1006    
#define	LRES	3		/* log of PC resolution */ 
1990/03292    
 
long		timerbuf[NBUF]; 
1991/1006    
struct{ 
	int	minpc; 
	int	maxpc; 
	int	nbuf; 
	int	time; 
	ulong	*buf; 
}kprof; 
1990/03292    
 
enum{ 
	Kprofdirqid, 
	Kprofdataqid, 
	Kprofstartqid, 
	Kprofstartclrqid, 
	Kprofstopqid, 
	Nkproftab=Kprofstopqid, 
1991/1006    
	Kprofctlqid, 
	Nkproftab=Kprofctlqid, 
1990/03292    
	Kprofmaxqid, 
}; 
Dirtab kproftab[Nkproftab]={ 
1991/0421    
	"kpdata",	{Kprofdataqid},		NBUF*sizeof timerbuf[0],	0600, 
	"kpstart",	{Kprofstartqid},	0,		0600, 
	"kpstartclr",	{Kprofstartclrqid},	0,		0600, 
	"kpstop",	{Kprofstopqid},		0,		0600, 
1991/1006    
	"kpdata",	{Kprofdataqid},		0,	0600, 
	"kpctl",	{Kprofctlqid},		0,	0600, 
1990/03292    
}; 
 
1990/1004    
void kproftimer(ulong); 
1991/0427/sys/src/9/port/devkprof.c:35,551991/1006/sys/src/9/port/devkprof.c:34,55
1990/03292    
void 
1990/0330    
kprofreset(void) 
{ 
1990/1004    
	kprofp = kproftimer; 
1991/1006    
	kprof.minpc = KTZERO; 
	kprof.maxpc = (ulong)&etext; 
	kprof.nbuf = (kprof.maxpc-kprof.minpc) >> LRES; 
	kprof.buf = ialloc(kprof.nbuf*sizeof kprof.buf[0], 0); 
	kproftab[0].length = kprof.nbuf*sizeof kprof.buf[0]; 
1990/0330    
} 
 
void 
1990/03292    
kprofinit(void) 
{ 
1990/0330    
	extern void *etext; 
1990/03292    
	if((((unsigned long)&etext)-KTZERO)>MAXPC) 
		print("kernel profiling limited to %lud\n", MAXPC); 
} 
 
Chan * 
kprofattach(char *spec) 
{ 
1990/0330    
	return devattach('t', spec); 
1991/1006    
	return devattach('T', spec); 
1990/03292    
} 
Chan * 
kprofclone(Chan *c, Chan *nc) 
1991/0427/sys/src/9/port/devkprof.c:72,801991/1006/sys/src/9/port/devkprof.c:72,80
1990/03292    
Chan * 
1990/0330    
kprofopen(Chan *c, int omode) 
1990/03292    
{ 
1990/0330    
	if(c->qid == CHDIR){ 
1991/1006    
	if(c->qid.path == CHDIR){ 
1990/0330    
		if(omode != OREAD) 
			error(0, Eperm); 
1991/1006    
			error(Eperm); 
1990/0330    
	} 
	c->mode = openmode(omode); 
	c->flag |= COPEN; 
1991/0427/sys/src/9/port/devkprof.c:85,1031991/1006/sys/src/9/port/devkprof.c:85,103
1990/03292    
void 
kprofcreate(Chan *c, char *name, int omode, ulong perm) 
{ 
1990/0330    
	error(0, Eperm); 
1991/1006    
	error(Eperm); 
1990/03292    
} 
 
void 
kprofremove(Chan *c) 
{ 
1990/0330    
	error(0, Eperm); 
1991/1006    
	error(Eperm); 
1990/03292    
} 
 
void 
1990/0330    
kprofwstat(Chan *c, char *dp) 
1990/03292    
{ 
1990/0330    
	error(0, Eperm); 
1991/1006    
	error(Eperm); 
1990/03292    
} 
 
void 
1991/0427/sys/src/9/port/devkprof.c:105,1361991/1006/sys/src/9/port/devkprof.c:105,126
1990/03292    
{ 
} 
 
1990/0330    
void 
kprofuserstr(Error *e, char *buf) 
{ 
	consuserstr(e, buf); 
} 
                 
void	  
kproferrstr(Error *e, char *buf) 
{ 
	rooterrstr(e, buf); 
} 
                 
1990/03292    
long 
1991/0411    
kprofread(Chan *c, void *a, long n, ulong offset) 
1990/03292    
{ 
	switch((int)(c->qid&~CHDIR)){ 
1991/1006    
	ulong end; 
	switch((int)(c->qid.path&~CHDIR)){ 
1990/03292    
	case Kprofdirqid: 
1990/0330    
		return devdirread(c, a, n, kproftab, Nkproftab, devgen); 
1990/03292    
	case Kprofdataqid: 
1991/0411    
		if(offset >= NBUF*sizeof timerbuf[0]){ 
1991/1006    
		end = kprof.nbuf*sizeof kprof.buf[0]; 
		if(offset >= end){ 
1990/0330    
			n = 0; 
1990/03292    
			break; 
		} 
1991/0411    
		if(offset+n > NBUF*sizeof timerbuf[0]) 
			n = NBUF*sizeof timerbuf[0]-offset; 
		memmove(a, ((char *)timerbuf)+offset, n); 
1991/1006    
		if(offset+n > end) 
			n = end-offset; 
		memmove(a, ((char *)kprof.buf)+offset, n); 
1990/03292    
		break; 
	default: 
		n=0; 
1991/0427/sys/src/9/port/devkprof.c:142,1581991/1006/sys/src/9/port/devkprof.c:132,149
1990/03292    
long 
1991/0411    
kprofwrite(Chan *c, char *a, long n, ulong offset) 
1990/03292    
{ 
	switch((int)(c->qid&~CHDIR)){ 
	case Kprofstartclrqid: 
		memset((char *)timerbuf, 0, NBUF*sizeof timerbuf[0]); 
	case Kprofstartqid: 
1990/0330    
		duartstarttimer(); 
1991/1006    
	switch((int)(c->qid.path&~CHDIR)){ 
	case Kprofctlqid: 
		if(strncmp(a, "startclr", 8) == 0){ 
			memset((char *)kprof.buf, 0, kprof.nbuf*sizeof kprof.buf[0]); 
			kprof.time = 1; 
		}else if(strncmp(a, "start", 5) == 0) 
			kprof.time = 1; 
		else if(strncmp(a, "stop", 4) == 0) 
			kprof.time = 0; 
1990/03292    
		break; 
	case Kprofstopqid: 
1990/0330    
		duartstoptimer(); 
1990/03292    
		break; 
	default: 
1990/0330    
		error(0, Ebadusefd); 
1991/1006    
		error(Ebadusefd); 
1990/03292    
	} 
	return n; 
} 
1991/0427/sys/src/9/port/devkprof.c:160,1651991/1006/sys/src/9/port/devkprof.c:151,158
1990/03292    
void 
kproftimer(ulong pc) 
{ 
1991/1006    
	if(kprof.time == 0) 
		return; 
1990/1004    
	/* 
	 *  if the pc is coming out of slplo pr splx, then use 
	 *  the pc saved when we went splhi. 
1991/0427/sys/src/9/port/devkprof.c:167,1771991/1006/sys/src/9/port/devkprof.c:160,170
1990/1004    
	if(pc>=(ulong)spllo && pc<=(ulong)spldone) 
		pc = m->splpc; 
1990/0928    
 
1990/03292    
	timerbuf[0]++; 
	if(KTZERO<=pc && pc<KTZERO+MAXPC){ 
1990/0330    
		pc -= KTZERO; 
1991/1006    
	kprof.buf[0]++; 
	if(kprof.minpc<=pc && pc<kprof.maxpc){ 
		pc -= kprof.minpc; 
1990/0330    
		pc >>= LRES; 
1990/03292    
		timerbuf[pc]++; 
1991/1006    
		kprof.buf[pc]++; 
1990/0331    
	} else 
		timerbuf[1]++; 
1991/1006    
		kprof.buf[1]++; 
1990/03292    
} 
1991/1006/sys/src/9/port/devkprof.c:160,1701991/1007/sys/src/9/port/devkprof.c:160,170 (short | long)
1990/1004    
	if(pc>=(ulong)spllo && pc<=(ulong)spldone) 
		pc = m->splpc; 
1990/0928    
 
1991/1006    
	kprof.buf[0]++; 
1991/1007    
	kprof.buf[0] += TK2MS(1); 
1991/1006    
	if(kprof.minpc<=pc && pc<kprof.maxpc){ 
		pc -= kprof.minpc; 
1990/0330    
		pc >>= LRES; 
1991/1006    
		kprof.buf[pc]++; 
1991/1007    
		kprof.buf[pc] += TK2MS(1); 
1990/0331    
	} else 
1991/1006    
		kprof.buf[1]++; 
1991/1007    
		kprof.buf[1] += TK2MS(1); 
1990/03292    
} 
1991/1007/sys/src/9/port/devkprof.c:151,1561991/1009/sys/src/9/port/devkprof.c:151,158 (short | long)
1990/03292    
void 
kproftimer(ulong pc) 
{ 
1991/1009    
	extern void spldone(void); 
 
1991/1006    
	if(kprof.time == 0) 
		return; 
1990/1004    
	/* 
1991/1009/sys/src/9/port/devkprof.c:9,151991/1011/sys/src/9/port/devkprof.c:9,16 (short | long)
1990/03292    
 
1991/1006    
#define	LRES	3		/* log of PC resolution */ 
1990/03292    
 
1991/1006    
struct{ 
1991/1011    
struct 
{ 
1991/1006    
	int	minpc; 
	int	maxpc; 
	int	nbuf; 
1991/1009/sys/src/9/port/devkprof.c:37,441991/1011/sys/src/9/port/devkprof.c:38,45
1991/1006    
	kprof.minpc = KTZERO; 
	kprof.maxpc = (ulong)&etext; 
	kprof.nbuf = (kprof.maxpc-kprof.minpc) >> LRES; 
	kprof.buf = ialloc(kprof.nbuf*sizeof kprof.buf[0], 0); 
	kproftab[0].length = kprof.nbuf*sizeof kprof.buf[0]; 
1991/1011    
	kprof.buf = ialloc(conf.nmach * kprof.nbuf*sizeof kprof.buf[0], 0); 
	kproftab[0].length = conf.nmach * kprof.nbuf*sizeof kprof.buf[0]; 
1990/0330    
} 
 
void 
1991/1009/sys/src/9/port/devkprof.c:113,1191991/1011/sys/src/9/port/devkprof.c:114,120
1990/03292    
	case Kprofdirqid: 
1990/0330    
		return devdirread(c, a, n, kproftab, Nkproftab, devgen); 
1990/03292    
	case Kprofdataqid: 
1991/1006    
		end = kprof.nbuf*sizeof kprof.buf[0]; 
1991/1011    
		end = conf.nmach * kprof.nbuf*sizeof kprof.buf[0]; 
1991/1006    
		if(offset >= end){ 
1990/0330    
			n = 0; 
1990/03292    
			break; 
1991/1009/sys/src/9/port/devkprof.c:135,1411991/1011/sys/src/9/port/devkprof.c:136,142
1991/1006    
	switch((int)(c->qid.path&~CHDIR)){ 
	case Kprofctlqid: 
		if(strncmp(a, "startclr", 8) == 0){ 
			memset((char *)kprof.buf, 0, kprof.nbuf*sizeof kprof.buf[0]); 
1991/1011    
			memset((char *)kprof.buf, 0, conf.nmach * kprof.nbuf*sizeof kprof.buf[0]); 
1991/1006    
			kprof.time = 1; 
		}else if(strncmp(a, "start", 5) == 0) 
			kprof.time = 1; 
1991/1009/sys/src/9/port/devkprof.c:152,1571991/1011/sys/src/9/port/devkprof.c:153,159
1990/03292    
kproftimer(ulong pc) 
{ 
1991/1009    
	extern void spldone(void); 
1991/1011    
	ulong *buf; 
1991/1009    
 
1991/1006    
	if(kprof.time == 0) 
		return; 
1991/1009/sys/src/9/port/devkprof.c:162,1721991/1011/sys/src/9/port/devkprof.c:164,175
1990/1004    
	if(pc>=(ulong)spllo && pc<=(ulong)spldone) 
		pc = m->splpc; 
1990/0928    
 
1991/1007    
	kprof.buf[0] += TK2MS(1); 
1991/1011    
	buf = kprof.buf+kprof.nbuf*m->machno; 
	buf[0] += TK2MS(1); 
1991/1006    
	if(kprof.minpc<=pc && pc<kprof.maxpc){ 
		pc -= kprof.minpc; 
1990/0330    
		pc >>= LRES; 
1991/1007    
		kprof.buf[pc] += TK2MS(1); 
1991/1011    
		buf[pc] += TK2MS(1); 
1990/0331    
	} else 
1991/1007    
		kprof.buf[1] += TK2MS(1); 
1991/1011    
		buf[1] += TK2MS(1); 
1990/03292    
} 
1991/1011/sys/src/9/port/devkprof.c:86,911991/1115/sys/src/9/port/devkprof.c:86,92 (short | long)
1990/03292    
void 
kprofcreate(Chan *c, char *name, int omode, ulong perm) 
{ 
1991/1115    
	USED(c, name, omode, perm); 
1991/1006    
	error(Eperm); 
1990/03292    
} 
 
1991/1011/sys/src/9/port/devkprof.c:92,971991/1115/sys/src/9/port/devkprof.c:93,99
1990/03292    
void 
kprofremove(Chan *c) 
{ 
1991/1115    
	USED(c); 
1991/1006    
	error(Eperm); 
1990/03292    
} 
 
1991/1011/sys/src/9/port/devkprof.c:98,1031991/1115/sys/src/9/port/devkprof.c:100,106
1990/03292    
void 
1990/0330    
kprofwstat(Chan *c, char *dp) 
1990/03292    
{ 
1991/1115    
	USED(c, dp); 
1991/1006    
	error(Eperm); 
1990/03292    
} 
 
1991/1011/sys/src/9/port/devkprof.c:104,1091991/1115/sys/src/9/port/devkprof.c:107,113
1990/03292    
void 
kprofclose(Chan *c) 
{ 
1991/1115    
	USED(c); 
1990/03292    
} 
 
long 
1991/1115/sys/src/9/port/devkprof.c:3,91992/0111/sys/src/9/port/devkprof.c:3,9 (short | long)
Move error.h to ../port. Change errors to actual strings.
rsc Fri Mar 4 12:44:25 2005
1990/0330    
#include	"mem.h" 
#include	"dat.h" 
#include	"fns.h" 
#include	"errno.h" 
1992/0111    
#include	"../port/error.h" 
1990/03292    
 
1990/0330    
#include	"devtab.h" 
1990/03292    
 
1992/0111/sys/src/9/port/devkprof.c:8,131992/0122/sys/src/9/port/devkprof.c:8,14 (short | long)
1990/0330    
#include	"devtab.h" 
1990/03292    
 
1991/1006    
#define	LRES	3		/* log of PC resolution */ 
1992/0122    
#define	SZ	4		/* sizeof of count cell; well known as 4 */ 
1990/03292    
 
1991/1011    
struct 
{ 
1992/0111/sys/src/9/port/devkprof.c:35,451992/0122/sys/src/9/port/devkprof.c:36,51
1990/03292    
void 
1990/0330    
kprofreset(void) 
{ 
1992/0122    
	ulong n; 
 
1991/1006    
	kprof.minpc = KTZERO; 
	kprof.maxpc = (ulong)&etext; 
	kprof.nbuf = (kprof.maxpc-kprof.minpc) >> LRES; 
1991/1011    
	kprof.buf = ialloc(conf.nmach * kprof.nbuf*sizeof kprof.buf[0], 0); 
	kproftab[0].length = conf.nmach * kprof.nbuf*sizeof kprof.buf[0]; 
1992/0122    
	n = kprof.nbuf*SZ; 
	kprof.buf = ialloc(n, 0); 
	kproftab[0].length = n; 
	if(SZ != sizeof kprof.buf[0]) 
		panic("kprof size"); 
1990/0330    
} 
 
void 
1992/0111/sys/src/9/port/devkprof.c:111,1241992/0122/sys/src/9/port/devkprof.c:117,136
1990/03292    
} 
 
long 
1991/0411    
kprofread(Chan *c, void *a, long n, ulong offset) 
1992/0122    
kprofread(Chan *c, void *va, long n, ulong offset) 
1990/03292    
{ 
1991/1006    
	ulong end; 
	switch((int)(c->qid.path&~CHDIR)){ 
1992/0122    
	ulong w, *bp; 
	uchar *a, *ea; 
 
	switch(c->qid.path & ~CHDIR){ 
1990/03292    
	case Kprofdirqid: 
1990/0330    
		return devdirread(c, a, n, kproftab, Nkproftab, devgen); 
1992/0122    
		return devdirread(c, va, n, kproftab, Nkproftab, devgen); 
 
1990/03292    
	case Kprofdataqid: 
1991/1011    
		end = conf.nmach * kprof.nbuf*sizeof kprof.buf[0]; 
1992/0122    
		end = kprof.nbuf*SZ; 
		if(offset & (SZ-1)) 
			error(Ebadarg); 
1991/1006    
		if(offset >= end){ 
1990/0330    
			n = 0; 
1990/03292    
			break; 
1992/0111/sys/src/9/port/devkprof.c:125,1341992/0122/sys/src/9/port/devkprof.c:137,157
1990/03292    
		} 
1991/1006    
		if(offset+n > end) 
			n = end-offset; 
		memmove(a, ((char *)kprof.buf)+offset, n); 
1992/0122    
		n &= ~(SZ-1); 
		a = va; 
		ea = a + n; 
		bp = kprof.buf + offset/SZ; 
		while(a < ea){ 
			w = *bp++; 
			*a++ = w>>24; 
			*a++ = w>>16; 
			*a++ = w>>8; 
			*a++ = w>>0; 
		} 
1990/03292    
		break; 
1992/0122    
 
1990/03292    
	default: 
		n=0; 
1992/0122    
		n = 0; 
1990/03292    
		break; 
	} 
	return n; 
1992/0111/sys/src/9/port/devkprof.c:140,1461992/0122/sys/src/9/port/devkprof.c:163,169
1991/1006    
	switch((int)(c->qid.path&~CHDIR)){ 
	case Kprofctlqid: 
		if(strncmp(a, "startclr", 8) == 0){ 
1991/1011    
			memset((char *)kprof.buf, 0, conf.nmach * kprof.nbuf*sizeof kprof.buf[0]); 
1992/0122    
			memset((char *)kprof.buf, 0, kprof.nbuf*SZ); 
1991/1006    
			kprof.time = 1; 
		}else if(strncmp(a, "start", 5) == 0) 
			kprof.time = 1; 
1992/0111/sys/src/9/port/devkprof.c:157,1791992/0122/sys/src/9/port/devkprof.c:180,200
1990/03292    
kproftimer(ulong pc) 
{ 
1991/1009    
	extern void spldone(void); 
1991/1011    
	ulong *buf; 
1991/1009    
 
1991/1006    
	if(kprof.time == 0) 
		return; 
1990/1004    
	/* 
	 *  if the pc is coming out of slplo pr splx, then use 
	 *  the pc saved when we went splhi. 
1992/0122    
	 *  if the pc is coming out of slplo pr splx, 
	 *  use the pc saved when we went splhi. 
1990/1004    
	 */ 
	if(pc>=(ulong)spllo && pc<=(ulong)spldone) 
		pc = m->splpc; 
1990/0928    
 
1991/1011    
	buf = kprof.buf+kprof.nbuf*m->machno; 
	buf[0] += TK2MS(1); 
1992/0122    
	kprof.buf[0] += TK2MS(1); 
1991/1006    
	if(kprof.minpc<=pc && pc<kprof.maxpc){ 
		pc -= kprof.minpc; 
1990/0330    
		pc >>= LRES; 
1991/1011    
		buf[pc] += TK2MS(1); 
1992/0122    
		kprof.buf[pc] += TK2MS(1); 
1990/0331    
	} else 
1991/1011    
		buf[1] += TK2MS(1); 
1992/0122    
		kprof.buf[1] += TK2MS(1); 
1990/03292    
} 
1992/0122/sys/src/9/port/devkprof.c:195,2001992/0123/sys/src/9/port/devkprof.c:195,200 (short | long)
1991/1006    
		pc -= kprof.minpc; 
1990/0330    
		pc >>= LRES; 
1992/0122    
		kprof.buf[pc] += TK2MS(1); 
1990/0331    
	} else 
1992/0123    
	}else 
1992/0122    
		kprof.buf[1] += TK2MS(1); 
1990/03292    
} 
1992/0123/sys/src/9/port/devkprof.c:184,1901992/0124/sys/src/9/port/devkprof.c:184,190 (short | long)
1991/1006    
	if(kprof.time == 0) 
		return; 
1990/1004    
	/* 
1992/0122    
	 *  if the pc is coming out of slplo pr splx, 
1992/0124    
	 *  if the pc is coming out of spllo or splx, 
1992/0122    
	 *  use the pc saved when we went splhi. 
1990/1004    
	 */ 
	if(pc>=(ulong)spllo && pc<=(ulong)spldone) 
1992/0124/sys/src/9/port/devkprof.c:39,451992/0319/sys/src/9/port/devkprof.c:39,45 (short | long)
1992/0122    
	ulong n; 
 
1991/1006    
	kprof.minpc = KTZERO; 
	kprof.maxpc = (ulong)&etext; 
1992/0319    
	kprof.maxpc = (ulong)etext; 
1991/1006    
	kprof.nbuf = (kprof.maxpc-kprof.minpc) >> LRES; 
1992/0122    
	n = kprof.nbuf*SZ; 
	kprof.buf = ialloc(n, 0); 
1992/0319/sys/src/9/port/devkprof.c:1,51992/0321/sys/src/9/port/devkprof.c:1,5 (short | long)
Move lib.h to ../port.
rsc Fri Mar 4 12:44:25 2005
1990/0330    
#include	"u.h" 
#include	"lib.h" 
1992/0321    
#include	"../port/lib.h" 
1990/0330    
#include	"mem.h" 
#include	"dat.h" 
#include	"fns.h" 
1992/0321/sys/src/9/port/devkprof.c:42,481992/0620/sys/src/9/port/devkprof.c:42,48 (short | long)
1992/0319    
	kprof.maxpc = (ulong)etext; 
1991/1006    
	kprof.nbuf = (kprof.maxpc-kprof.minpc) >> LRES; 
1992/0122    
	n = kprof.nbuf*SZ; 
	kprof.buf = ialloc(n, 0); 
1992/0620    
	kprof.buf = xalloc(n); 
1992/0122    
	kproftab[0].length = n; 
	if(SZ != sizeof kprof.buf[0]) 
		panic("kprof size"); 
1992/0620/sys/src/9/port/devkprof.c:160,1651992/0711/sys/src/9/port/devkprof.c:160,167 (short | long)
1990/03292    
long 
1991/0411    
kprofwrite(Chan *c, char *a, long n, ulong offset) 
1990/03292    
{ 
1992/0711    
	USED(offset); 
 
1991/1006    
	switch((int)(c->qid.path&~CHDIR)){ 
	case Kprofctlqid: 
		if(strncmp(a, "startclr", 8) == 0){ 
1992/0711/sys/src/9/port/devkprof.c:36,611992/0814/sys/src/9/port/devkprof.c:36,66 (short | long)
1990/03292    
void 
1990/0330    
kprofreset(void) 
{ 
1992/0122    
	ulong n; 
                 
1991/1006    
	kprof.minpc = KTZERO; 
1992/0319    
	kprof.maxpc = (ulong)etext; 
1991/1006    
	kprof.nbuf = (kprof.maxpc-kprof.minpc) >> LRES; 
1992/0122    
	n = kprof.nbuf*SZ; 
1992/0620    
	kprof.buf = xalloc(n); 
1992/0122    
	kproftab[0].length = n; 
	if(SZ != sizeof kprof.buf[0]) 
		panic("kprof size"); 
1990/0330    
} 
 
void 
1990/03292    
kprofinit(void) 
{ 
1992/0814    
	if(SZ != sizeof kprof.buf[0]) 
		panic("kprof size"); 
1990/03292    
} 
 
Chan * 
kprofattach(char *spec) 
{ 
1992/0814    
	ulong n; 
 
	/* allocate when first used */ 
	kprof.minpc = KTZERO; 
	kprof.maxpc = (ulong)etext; 
	kprof.nbuf = (kprof.maxpc-kprof.minpc) >> LRES; 
	n = kprof.nbuf*SZ; 
	if(kprof.buf == 0) { 
		kprof.buf = xalloc(n); 
		if(kprof.buf == 0) 
			error(Enomem); 
	} 
	kproftab[0].length = n; 
1991/1006    
	return devattach('T', spec); 
1990/03292    
} 
Chan * 
1992/0814/sys/src/9/port/devkprof.c:124,1301993/0123/sys/src/9/port/devkprof.c:124,130 (short | long)
1990/03292    
long 
1992/0122    
kprofread(Chan *c, void *va, long n, ulong offset) 
1990/03292    
{ 
1991/1006    
	ulong end; 
1993/0123    
	ulong tabend; 
1992/0122    
	ulong w, *bp; 
	uchar *a, *ea; 
 
1992/0814/sys/src/9/port/devkprof.c:133,1471993/0123/sys/src/9/port/devkprof.c:133,147
1992/0122    
		return devdirread(c, va, n, kproftab, Nkproftab, devgen); 
 
1990/03292    
	case Kprofdataqid: 
1992/0122    
		end = kprof.nbuf*SZ; 
1993/0123    
		tabend = kprof.nbuf*SZ; 
1992/0122    
		if(offset & (SZ-1)) 
			error(Ebadarg); 
1991/1006    
		if(offset >= end){ 
1993/0123    
		if(offset >= tabend){ 
1990/0330    
			n = 0; 
1990/03292    
			break; 
		} 
1991/1006    
		if(offset+n > end) 
			n = end-offset; 
1993/0123    
		if(offset+n > tabend) 
			n = tabend-offset; 
1992/0122    
		n &= ~(SZ-1); 
		a = va; 
		ea = a + n; 
1993/0123/sys/src/9/port/devkprof.c:124,1301993/0501/sys/src/9/port/devkprof.c:124,130 (short | long)
1990/03292    
long 
1992/0122    
kprofread(Chan *c, void *va, long n, ulong offset) 
1990/03292    
{ 
1993/0123    
	ulong tabend; 
1993/0501    
	ulong end; 
1992/0122    
	ulong w, *bp; 
	uchar *a, *ea; 
 
1993/0123/sys/src/9/port/devkprof.c:133,1471993/0501/sys/src/9/port/devkprof.c:133,147
1992/0122    
		return devdirread(c, va, n, kproftab, Nkproftab, devgen); 
 
1990/03292    
	case Kprofdataqid: 
1993/0123    
		tabend = kprof.nbuf*SZ; 
1993/0501    
		end = kprof.nbuf*SZ; 
1992/0122    
		if(offset & (SZ-1)) 
			error(Ebadarg); 
1993/0123    
		if(offset >= tabend){ 
1993/0501    
		if(offset >= end){ 
1990/0330    
			n = 0; 
1990/03292    
			break; 
		} 
1993/0123    
		if(offset+n > tabend) 
			n = tabend-offset; 
1993/0501    
		if(offset+n > end) 
			n = end-offset; 
1992/0122    
		n &= ~(SZ-1); 
		a = va; 
		ea = a + n; 
Too many diffs (26 > 25). Stopping.


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