rbriber@POLY1.NIST.GOV (03/07/91)
We have a 4D80GT running 3.3.1 and it looses time at an rate just fast enough to be annoying. I think I read about a file somewhere which has a magic number in it that can be adjusted to speed up or slow down the system clock, but I can't figure out where this file is (or whether I was dreaming this whole scenario). If anyone else has had any experience with this I'd appreciate any hints (like what sort of changes are appropriate, whether the kernal has to be rebuilt, what man pages to read, etc.) Email to me is fine. Thanks. ------------------------------------------------------------------------ | Adios Amebas, |"In the future we will all have names that will | | Rob Briber | make the cathode ray tube resonate." | | NIST 224/B210 | --Professor Brian O'Blivion | | Gaithersburg, MD 20899| rbriber@poly1.nist.gov (Internet) | | (301) 975-6775 (voice)| rbriber@enh.nist.gov (Internet) | | (301) 975-2128 (fax) | rbriber@nbsenh.bitnet (Bitnet) | ------------------------------------------------------------------------
scotth@corp.sgi.com (Scott Henry) (03/08/91)
rb> We have a 4D80GT running 3.3.1 and it looses time at an rate just fast rb> enough to be annoying. I think I read about a file somewhere which rb> has a magic number in it that can be adjusted to speed up or slow down rb> the system clock, but I can't figure out where this file is (or rb> whether I was dreaming this whole scenario). If anyone else has had rb> any experience with this I'd appreciate any hints (like what sort of rb> changes are appropriate, whether the kernal has to be rebuilt, what rb> man pages to read, etc.) There is a kernel variable (timetrim) that adjusts the clock rate. It can be set and read by a couple of SGI-specific system calls. You can look on the syssgi(2) man page. Since I already have a couple of quick&dirty hack programs to get & set timetrim, I thought I'd just post them. Timetrim is in the units ns/sec (10^-9/sec). Values for machines that I've checked range from (approximately) -560000 < timetrim < 30000. You need to be root to set timetrim. #!/bin/sh # This is a shell archive (shar 3.24) # made 03/08/1991 16:52 UTC by ???@harlie.c # Source directory /u2/src/Xntp # # existing files will NOT be overwritten # # This shar contains: # length mode name # ------ ---------- ------------------------------------------ # 394 -rw-r--r-- gettimetrim.c # 2006 -rw-r--r-- settimetrim.c # if touch 2>&1 | fgrep '[-amc]' > /dev/null then TOUCH=touch else TOUCH=true fi # ============= gettimetrim.c ============== if test X"$1" != X"-c" -a -f 'gettimetrim.c'; then echo "File already exists: skipping 'gettimetrim.c'" else echo "x - extracting gettimetrim.c (Text)" sed 's/^X//' << 'SHAR_EOF' > gettimetrim.c && X/* This is a quick hack to read the kernel timetrim on SGI machines. X D. Watson for SGI 11/90 X*/ X X#include <stdio.h> X#include <sys/syssgi.h> X#include <sys/errno.h> X X#define MILLION 1000000 X Xmain(argc, argv) Xint argc; Xchar *argv[]; X X{ X X extern int errno; X int tmp; X X if ((syssgi(SGI_GETTIMETRIM, &tmp)) == -1) { X perror("gettimetrim"); X exit(1); X } X printf("Timetrim is %d\n", tmp); X} SHAR_EOF $TOUCH -am 1102083390 gettimetrim.c && chmod 0644 gettimetrim.c || echo "restore of gettimetrim.c failed" fi # ============= settimetrim.c ============== if test X"$1" != X"-c" -a -f 'settimetrim.c'; then echo "File already exists: skipping 'settimetrim.c'" else echo "x - extracting settimetrim.c (Text)" sed 's/^X//' << 'SHAR_EOF' > settimetrim.c && X/* This is a quick hack to read and then write the kernel timetrim X based on the contents of the file /usr/tmp/.timetrimtest. X CAUTION: using this program can be dangerous to the sanity of X any program that sets or depends on the clock!! X D. Watson for SGI 11/90 X Based on code stolen from timeslave. X modifications by S. Henry 01/91 X*/ X X#include <stdio.h> X#include <sys/syssgi.h> X#include <sys/errno.h> X#include <ctype.h> X X#define MILLION 1000000 X Xmain(argc, argv) Xint argc; Xchar *argv[]; X X{ X char *pgmname = argv[0]; X FILE *timetrim_st; X char *timetrim_fn = 0; X char *timetrim_pat = "long timetrim = %d;\n"; X extern int errno; X long oldtimetrim, timetrim; X int i; X char *ptr; X X if ((syssgi(SGI_GETTIMETRIM, &oldtimetrim)) == -1) X { X perror("gettimetrim"); X exit(1); X } X printf("Old timetrim was %d\n", oldtimetrim); X X if (argc > 1) X { X if (strncmp(argv[1], "-f", 2) == 0) X { X timetrim_st = EOF; X if (argc == 2) X { X timetrim_fn = "/usr/tmp/.timetrim"; X } X else if (argv[2][0] == '-' && argv[2][1] == '\0') X { X timetrim_st = stdin; X } X else X { X timetrim_fn = argv[2]; X } X if (timetrim_st < 0) X { X timetrim_st = fopen(timetrim_fn, "r+"); X } X if (EOF == timetrim_st) X { X if (errno != ENOENT) X { X (void)fprintf(stderr, "%s: ", pgmname); X perror(timetrim_fn); X timetrim_fn = 0; X } X } X i = fscanf(timetrim_st, timetrim_pat, &timetrim); X } X else X { X timetrim = atol(argv[argc-1]); X i = 1; X } X } X if (i != EOF) X { X if (i != 1 || timetrim > MILLION || timetrim < -MILLION) X { X (void)fprintf(stderr, X "%s: %s: unrecognized contents\n", X pgmname, timetrim_fn); X } X else X { X printf("Trimming time by %d\n", timetrim); X if (0 > syssgi(SGI_SETTIMETRIM, timetrim)) X { X (void)fprintf(stderr, "%s: ", pgmname); X perror("syssgi(SETTIMETRIM)"); X } X } X } X if (timetrim_st) X (void)fclose(timetrim_st); X timetrim_st = 0; X} SHAR_EOF $TOUCH -am 0304165791 settimetrim.c && chmod 0644 settimetrim.c || echo "restore of settimetrim.c failed" fi exit 0 -- Scott Henry <scotth@sgi.com> / Traveller on Dragon Wings Information Services, / Help! My disclaimer is missing! Silicon Graphics, Inc / Politicians no baka!