1 /* kgclock.c 6.3 84/08/29 */ 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 "param.h" 12 #include "map.h" 13 #include "buf.h" 14 #include "time.h" 15 #include "kernel.h" 16 17 #include "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 int usekgclock = 1; /* if zero, kgclock is disabled */ 34 35 kgprobe(reg) 36 caddr_t reg; 37 { 38 register int br, cvec; /* value-result */ 39 register struct klregs *klp = (struct klregs *)reg; 40 41 klp->tcsr = KLSTRT; 42 DELAY(100000); 43 klp->tcsr = 0; 44 } 45 46 kgattach(ui) 47 struct uba_device *ui; 48 { 49 50 klbase = (struct klregs *)ui->ui_addr; 51 } 52 53 /* 54 * start the sampling clock 55 */ 56 startkgclock() 57 { 58 59 if (klbase && usekgclock && phz == 0) 60 klbase->tcsr = KLSTRT; /* enable interrupts */ 61 } 62 63 /* ARGSUSED */ 64 kgclock(dev, r0, r1, r2, r3, r4 ,r5, pc, ps) 65 caddr_t pc; 66 int ps; 67 { 68 register int k; 69 static long otime; 70 static long calibrate; 71 72 if (usekgclock == 0) { 73 phz = 0; 74 otime = 0; 75 return; 76 } 77 klbase->tbuf = 0377; /* reprime clock (scope sync too) */ 78 if (phz == 0) { 79 if (otime == 0) { 80 otime = time.tv_sec + 1; 81 calibrate = 0; 82 } 83 if (time.tv_sec >= otime) 84 calibrate++; 85 if (time.tv_sec >= otime + 4) { 86 phz = calibrate / 4; 87 otime = 0; 88 } 89 return; 90 } 91 gatherstats(pc, ps); /* this routine lives in kern_clock.c */ 92 } 93 #endif 94