date and time created 83/02/24 12:56:06 by mckusick
[unix-history] / usr / src / usr.bin / gprof / hertz.c
CommitLineData
551f2768
PK
1#ifndef lint
2 static char *sccsid = "@(#)hertz.c 1.1 (Berkeley) %G%";
3#endif lint
4
5 /*
6 * discover the tick frequency of the machine
7 */
8#include <nlist.h>
9#include <stdio.h>
10
11struct nlist nl[] = {{"_hz"}, /* clock ticks per second */
12 {0}};
13
14hertz()
15{
16 int kmem; /* file descriptor for /dev/kmem */
17 long lseek();
18 long seeked; /* return value from lseek() */
19 long hz; /* buffer for reading from system */
20 int red; /* return value from read() */
21 int closed; /* return value from close() */
22
23# define VMUNIX "/vmunix" /* location of the system namelist */
24 nlist(VMUNIX, nl);
25 if (nl[0].n_type == 0) {
26 fprintf(stderr, "no %s namelist entry for _hz\n", VMUNIX);
27 return 0;
28 }
29# define KMEM "/dev/kmem" /* location of the system data space */
30 kmem = open(KMEM, 0);
31 if (kmem == -1) {
32 perror("hertz()");
33 fprintf(stderr, "open(\"%s\", 0)", KMEM);
34 return 0;
35 }
36 seeked = lseek(kmem, nl[0].n_value, 0);
37 if (seeked == -1) {
38 fprintf(stderr, "can't lseek(kmem, 0x%x, 0)\n", nl[0].n_value);
39 return 0;
40 }
41 red = read(kmem, &hz, sizeof hz);
42 if (red != sizeof hz) {
43 fprintf(stderr, "read(kmem, 0x%x, %d) returned %d\n",
44 &hz, sizeof hz, red);
45 return 0;
46 }
47 closed = close(kmem);
48 if (closed != 0) {
49 perror("hertz()");
50 fprintf(stderr, "close(\"%s\")", KMEM);
51 return 0;
52 }
53 return hz;
54}