timetrim.c revision 1.5 1 1.5 christos /* $NetBSD: timetrim.c,v 1.5 2020/05/25 20:47:37 christos Exp $ */
2 1.1 kardel
3 1.1 kardel #if defined(sgi) || defined(_UNICOSMP)
4 1.1 kardel /*
5 1.1 kardel * timetrim.c
6 1.1 kardel *
7 1.1 kardel * "timetrim" allows setting and adjustment of the system clock frequency
8 1.1 kardel * trim parameter on Silicon Graphics machines. The trim value native
9 1.1 kardel * units are nanoseconds per second (10**-9), so a trim value of 1 makes
10 1.1 kardel * the system clock step ahead 1 nanosecond more per second than a value
11 1.1 kardel * of zero. Xntpd currently uses units of 2**-20 secs for its frequency
12 1.1 kardel * offset (drift) values; to convert to a timetrim value, multiply by
13 1.1 kardel * 1E9 / 2**20 (about 954).
14 1.1 kardel *
15 1.1 kardel * "timetrim" with no arguments just prints out the current kernel value.
16 1.1 kardel * With a numeric argument, the kernel value is set to the supplied value.
17 1.1 kardel * The "-i" flag causes the supplied value to be added to the kernel value.
18 1.1 kardel * The "-n" option causes all input and output to be in xntpd units rather
19 1.1 kardel * than timetrim native units.
20 1.1 kardel *
21 1.1 kardel * Note that there is a limit of +-3000000 (0.3%) on the timetrim value
22 1.1 kardel * which is (silently?) enforced by the kernel.
23 1.1 kardel *
24 1.1 kardel */
25 1.1 kardel
26 1.1 kardel #ifdef HAVE_CONFIG_H
27 1.1 kardel #include <config.h>
28 1.1 kardel #endif
29 1.1 kardel
30 1.1 kardel #include <stdio.h>
31 1.1 kardel #include <ctype.h>
32 1.1 kardel #include <stdlib.h>
33 1.1 kardel #ifdef HAVE_SYS_SYSSGI_H
34 1.1 kardel # include <sys/syssgi.h>
35 1.1 kardel #endif
36 1.1 kardel #ifdef HAVE_SYS_SYSTUNE_H
37 1.1 kardel # include <sys/systune.h>
38 1.1 kardel #endif
39 1.1 kardel
40 1.1 kardel #define abs(X) (((X) < 0) ? -(X) : (X))
41 1.1 kardel #define USAGE "usage: timetrim [-n] [[-i] value]\n"
42 1.1 kardel #define SGITONTP(X) ((double)(X) * 1048576.0/1.0e9)
43 1.1 kardel #define NTPTOSGI(X) ((long)((X) * 1.0e9/1048576.0))
44 1.1 kardel
45 1.1 kardel int
46 1.1 kardel main(
47 1.1 kardel int argc,
48 1.1 kardel char *argv[]
49 1.1 kardel )
50 1.1 kardel {
51 1.1 kardel char *rem;
52 1.1 kardel int incremental = 0, ntpunits = 0;
53 1.1 kardel long timetrim;
54 1.1 kardel double value;
55 1.1 kardel
56 1.1 kardel while (--argc && **++argv == '-' && isalpha((int)argv[0][1])) {
57 1.1 kardel switch (argv[0][1]) {
58 1.1 kardel case 'i':
59 1.1 kardel incremental++;
60 1.1 kardel break;
61 1.1 kardel case 'n':
62 1.1 kardel ntpunits++;
63 1.1 kardel break;
64 1.1 kardel default:
65 1.1 kardel fprintf(stderr, USAGE);
66 1.1 kardel exit(1);
67 1.1 kardel }
68 1.1 kardel }
69 1.1 kardel
70 1.1 kardel #ifdef HAVE_SYS_SYSSGI_H
71 1.1 kardel if (syssgi(SGI_GETTIMETRIM, &timetrim) < 0) {
72 1.1 kardel perror("syssgi");
73 1.1 kardel exit(2);
74 1.1 kardel }
75 1.1 kardel #endif
76 1.1 kardel #ifdef HAVE_SYS_SYSTUNE_H
77 1.1 kardel if (systune(SYSTUNE_GET, "timetrim", &timetrim) < 0) {
78 1.1 kardel perror("systune");
79 1.1 kardel exit(2);
80 1.1 kardel }
81 1.1 kardel #endif
82 1.1 kardel
83 1.1 kardel if (argc == 0) {
84 1.1 kardel if (ntpunits)
85 1.1 kardel fprintf(stdout, "%0.5f\n", SGITONTP(timetrim));
86 1.1 kardel else
87 1.1 kardel fprintf(stdout, "%ld\n", timetrim);
88 1.1 kardel } else if (argc != 1) {
89 1.1 kardel fprintf(stderr, USAGE);
90 1.1 kardel exit(1);
91 1.1 kardel } else {
92 1.1 kardel value = strtod(argv[0], &rem);
93 1.1 kardel if (*rem != '\0') {
94 1.1 kardel fprintf(stderr, USAGE);
95 1.1 kardel exit(1);
96 1.1 kardel }
97 1.1 kardel if (ntpunits)
98 1.1 kardel value = NTPTOSGI(value);
99 1.1 kardel if (incremental)
100 1.1 kardel timetrim += value;
101 1.1 kardel else
102 1.1 kardel timetrim = value;
103 1.1 kardel #ifdef HAVE_SYS_SYSSGI_H
104 1.1 kardel if (syssgi(SGI_SETTIMETRIM, timetrim) < 0) {
105 1.1 kardel perror("syssgi");
106 1.1 kardel exit(2);
107 1.1 kardel }
108 1.1 kardel #endif
109 1.1 kardel #ifdef HAVE_SYS_SYSTUNE_H
110 1.1 kardel if (systune(SYSTUNE_SET, "timer", "timetrim", &timetrim) < 0) {
111 1.1 kardel perror("systune");
112 1.1 kardel exit(2);
113 1.1 kardel }
114 1.1 kardel #endif
115 1.1 kardel }
116 1.1 kardel return 0;
117 1.1 kardel }
118 1.1 kardel #endif
119