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