1 /* kgclock.c 4.4 83/05/30 */ 2 3 #include "kg.h" 4 #if NKG > 0 5 /* 6 * KL-11 as profiling clock 7 */ 8 #include "../machine/pte.h" 9 #include "../machine/psl.h" 10 11 #include "../h/param.h" 12 #include "../h/map.h" 13 #include "../h/buf.h" 14 #include "../h/time.h" 15 #include "../h/kernel.h" 16 17 #include "../vaxuba/ubavar.h" 18 19 int kgprobe(), kgattach(); 20 struct uba_device *kginfo[1]; 21 u_short kgstd[] = { 0177560, 0 }; 22 struct uba_driver kgdriver = 23 { kgprobe, 0, kgattach, 0, kgstd, "kg", kginfo }; 24 25 struct klregs { 26 u_short fill[2]; 27 u_short tcsr; 28 u_short tbuf; 29 }; 30 #define KLSTRT 0300 /* intr enbl + done */ 31 struct klregs *klbase; 32 33 kgprobe(reg) 34 caddr_t reg; 35 { 36 register int br, cvec; /* value-result */ 37 register struct klregs *klp = (struct klregs *)reg; 38 39 klp->tcsr = KLSTRT; 40 DELAY(100000); 41 klp->tcsr = 0; 42 } 43 44 kgattach(ui) 45 struct uba_device *ui; 46 { 47 48 klbase = (struct klregs *)ui->ui_addr; 49 } 50 51 /* 52 * start the sampling clock 53 */ 54 startkgclock() 55 { 56 57 if (klbase) 58 klbase->tcsr = KLSTRT; /* enable interrupts */ 59 } 60 61 /* ARGSUSED */ 62 kgclock(dev, r0, r1, r2, r3, r4 ,r5, pc, ps) 63 caddr_t pc; 64 int ps; 65 { 66 register int k; 67 static long otime; 68 static long calibrate; 69 70 klbase->tbuf = 0377; /* reprime clock (scope sync too) */ 71 if (phz == 0) { 72 if (otime == 0) { 73 otime = time.tv_sec + 1; 74 calibrate = 0; 75 } 76 if (time.tv_sec >= otime) 77 calibrate++; 78 if (time.tv_sec >= otime + 4) { 79 phz = calibrate / 4; 80 otime = 0; 81 } 82 return; 83 } 84 gatherstats(pc, ps); /* this routine lives in kern_clock.c */ 85 } 86 #endif 87