Commit | Line | Data |
---|---|---|
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 | ||
11 | struct nlist nl[] = {{"_hz"}, /* clock ticks per second */ | |
12 | {0}}; | |
13 | ||
14 | hertz() | |
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 | } |