Commit | Line | Data |
---|---|---|
92e67171 | 1 | /* kgclock.c 6.1 83/07/29 */ |
dbd3c33b | 2 | |
7f562db3 SL |
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" | |
dbd3c33b | 10 | |
f7f6f047 | 11 | #include "../h/param.h" |
dbd3c33b | 12 | #include "../h/map.h" |
dbd3c33b | 13 | #include "../h/buf.h" |
7f562db3 SL |
14 | #include "../h/time.h" |
15 | #include "../h/kernel.h" | |
16 | ||
f7f6f047 | 17 | #include "../vaxuba/ubavar.h" |
dbd3c33b KM |
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) | |
7f562db3 | 34 | caddr_t reg; |
dbd3c33b KM |
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) | |
f7f6f047 | 45 | struct uba_device *ui; |
dbd3c33b | 46 | { |
f7f6f047 | 47 | |
dbd3c33b KM |
48 | klbase = (struct klregs *)ui->ui_addr; |
49 | } | |
50 | ||
51 | /* | |
52 | * start the sampling clock | |
53 | */ | |
54 | startkgclock() | |
55 | { | |
f7f6f047 | 56 | |
dbd3c33b KM |
57 | if (klbase) |
58 | klbase->tcsr = KLSTRT; /* enable interrupts */ | |
59 | } | |
60 | ||
61 | /* ARGSUSED */ | |
62 | kgclock(dev, r0, r1, r2, r3, r4 ,r5, pc, ps) | |
f7f6f047 SL |
63 | caddr_t pc; |
64 | int ps; | |
dbd3c33b KM |
65 | { |
66 | register int k; | |
7f562db3 SL |
67 | static long otime; |
68 | static long calibrate; | |
dbd3c33b KM |
69 | |
70 | klbase->tbuf = 0377; /* reprime clock (scope sync too) */ | |
224a0d4a KM |
71 | if (phz == 0) { |
72 | if (otime == 0) { | |
7f562db3 | 73 | otime = time.tv_sec + 1; |
224a0d4a KM |
74 | calibrate = 0; |
75 | } | |
7f562db3 | 76 | if (time.tv_sec >= otime) |
224a0d4a | 77 | calibrate++; |
7f562db3 | 78 | if (time.tv_sec >= otime + 4) { |
224a0d4a KM |
79 | phz = calibrate / 4; |
80 | otime = 0; | |
81 | } | |
82 | return; | |
83 | } | |
f7f6f047 | 84 | gatherstats(pc, ps); /* this routine lives in kern_clock.c */ |
dbd3c33b | 85 | } |
7f562db3 | 86 | #endif |