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