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

1990/0330/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 | prev | next)
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]++; 
	} 
} 


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