1*11358Smckusick /* kgclock.c 4.2 83/03/01 */ 211357Smckusick 311357Smckusick #ifdef KGCLOCK /* kl-11 as profiling clock */ 411357Smckusick 511357Smckusick #include "../h/map.h" 611357Smckusick #include "../h/pte.h" 711357Smckusick #include "../h/buf.h" 811357Smckusick #include "../h/ubavar.h" 911357Smckusick #include "../h/psl.h" 1011357Smckusick 11*11358Smckusick int phz = 0; 1211357Smckusick int kgprobe(), kgattach(); 1311357Smckusick struct uba_device *kginfo[1]; 1411357Smckusick u_short kgstd[] = { 0177560, 0 }; 1511357Smckusick struct uba_driver kgdriver = 1611357Smckusick { kgprobe, 0, kgattach, 0, kgstd, "kg", kginfo }; 1711357Smckusick 1811357Smckusick struct klregs { 1911357Smckusick u_short fill[2]; 2011357Smckusick u_short tcsr; 2111357Smckusick u_short tbuf; 2211357Smckusick }; 2311357Smckusick #define KLSTRT 0300 /* intr enbl + done */ 2411357Smckusick struct klregs *klbase; 2511357Smckusick 2611357Smckusick kgprobe(reg) 2711357Smckusick caddr_t reg; 2811357Smckusick { 2911357Smckusick register int br, cvec; /* value-result */ 3011357Smckusick register struct klregs *klp = (struct klregs *)reg; 3111357Smckusick 3211357Smckusick klp->tcsr = KLSTRT; 3311357Smckusick DELAY(100000); 3411357Smckusick klp->tcsr = 0; 3511357Smckusick } 3611357Smckusick 3711357Smckusick kgattach(ui) 3811357Smckusick struct uba_device *ui; 3911357Smckusick { 4011357Smckusick klbase = (struct klregs *)ui->ui_addr; 4111357Smckusick } 4211357Smckusick 4311357Smckusick /* 4411357Smckusick * start the sampling clock 4511357Smckusick */ 4611357Smckusick startkgclock() 4711357Smckusick { 4811357Smckusick if (klbase) 4911357Smckusick klbase->tcsr = KLSTRT; /* enable interrupts */ 5011357Smckusick } 5111357Smckusick 5211357Smckusick /* ARGSUSED */ 5311357Smckusick kgclock(dev, r0, r1, r2, r3, r4 ,r5, pc, ps) 5411357Smckusick caddr_t pc; 5511357Smckusick { 5611357Smckusick register int k; 57*11358Smckusick static int otime = 0; 58*11358Smckusick static int calibrate; 5911357Smckusick 6011357Smckusick klbase->tbuf = 0377; /* reprime clock (scope sync too) */ 61*11358Smckusick if (phz == 0) { 62*11358Smckusick if (otime == 0) { 63*11358Smckusick otime = time + 1; 64*11358Smckusick calibrate = 0; 65*11358Smckusick } 66*11358Smckusick if (time >= otime) 67*11358Smckusick calibrate++; 68*11358Smckusick if (time >= otime + 4) { 69*11358Smckusick phz = calibrate / 4; 70*11358Smckusick otime = 0; 71*11358Smckusick } 72*11358Smckusick return; 73*11358Smckusick } 7411357Smckusick gatherstats(); /* this routine lives in kern_clock.c */ 7511357Smckusick } 7611357Smckusick #endif KGCLOCK 77