xref: /csrg-svn/sys/vax/uba/kgclock.c (revision 11393)
1*11393Ssam /*	kgclock.c	4.3	83/03/03	*/
211357Smckusick 
311357Smckusick #ifdef KGCLOCK		/* kl-11 as profiling clock */
411357Smckusick 
5*11393Ssam #include "../h/param.h"
611357Smckusick #include "../h/map.h"
711357Smckusick #include "../h/pte.h"
811357Smckusick #include "../h/buf.h"
9*11393Ssam #include "../vaxuba/ubavar.h"
10*11393Ssam #include "../machine/psl.h"
1111357Smckusick 
1211358Smckusick int	phz = 0;
1311357Smckusick int	kgprobe(), kgattach();
1411357Smckusick struct	uba_device *kginfo[1];
1511357Smckusick u_short	kgstd[] = { 0177560, 0 };
1611357Smckusick struct	uba_driver kgdriver =
1711357Smckusick     { kgprobe, 0, kgattach, 0, kgstd, "kg", kginfo };
1811357Smckusick 
1911357Smckusick struct klregs {
2011357Smckusick 	u_short	fill[2];
2111357Smckusick 	u_short	tcsr;
2211357Smckusick 	u_short	tbuf;
2311357Smckusick };
2411357Smckusick #define	KLSTRT	0300		/* intr enbl + done */
2511357Smckusick struct	klregs *klbase;
2611357Smckusick 
2711357Smckusick kgprobe(reg)
2811357Smckusick caddr_t reg;
2911357Smckusick {
3011357Smckusick 	register int br, cvec;	/* value-result */
3111357Smckusick 	register struct klregs *klp = (struct klregs *)reg;
3211357Smckusick 
3311357Smckusick 	klp->tcsr = KLSTRT;
3411357Smckusick 	DELAY(100000);
3511357Smckusick 	klp->tcsr = 0;
3611357Smckusick }
3711357Smckusick 
3811357Smckusick kgattach(ui)
39*11393Ssam 	struct uba_device *ui;
4011357Smckusick {
41*11393Ssam 
4211357Smckusick 	klbase = (struct klregs *)ui->ui_addr;
4311357Smckusick }
4411357Smckusick 
4511357Smckusick /*
4611357Smckusick  * start the sampling clock
4711357Smckusick  */
4811357Smckusick startkgclock()
4911357Smckusick {
50*11393Ssam 
5111357Smckusick 	if (klbase)
5211357Smckusick 		klbase->tcsr = KLSTRT;	/* enable interrupts */
5311357Smckusick }
5411357Smckusick 
5511357Smckusick /* ARGSUSED */
5611357Smckusick kgclock(dev, r0, r1, r2, r3, r4 ,r5, pc, ps)
57*11393Ssam 	caddr_t pc;
58*11393Ssam 	int ps;
5911357Smckusick {
6011357Smckusick 	register int k;
61*11393Ssam 	extern time_t time;
62*11393Ssam 	static time_t otime = 0;
63*11393Ssam 	static time_t calibrate;
6411357Smckusick 
6511357Smckusick 	klbase->tbuf = 0377;	/* reprime clock (scope sync too) */
6611358Smckusick 	if (phz == 0) {
6711358Smckusick 		if (otime == 0) {
6811358Smckusick 			otime = time + 1;
6911358Smckusick 			calibrate = 0;
7011358Smckusick 		}
7111358Smckusick 		if (time >= otime)
7211358Smckusick 			calibrate++;
7311358Smckusick 		if (time >= otime + 4) {
7411358Smckusick 			phz = calibrate / 4;
7511358Smckusick 			otime = 0;
7611358Smckusick 		}
7711358Smckusick 		return;
7811358Smckusick 	}
79*11393Ssam 	gatherstats(pc, ps);	/* this routine lives in kern_clock.c */
8011357Smckusick }
8111357Smckusick #endif KGCLOCK
82