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