Path: utzoo!news-server.csri.toronto.edu!cs.utexas.edu!swrinde!elroy.jpl.nasa.gov!decwrl!sgi!shinobu!odin!sgi.com!scotth From: scotth@corp.sgi.com (Scott Henry) Newsgroups: comp.sys.sgi Subject: Re: The Time Message-ID: Date: 8 Mar 91 09:03:48 GMT References: <9103062240.AA01309@poly1.nist.gov> Sender: news@odin.corp.sgi.com (Net News) Reply-To: scotth@sgi.com (Scott Henry) Organization: Silicon Graphics Inc, Mountain View, CA Lines: 184 In-Reply-To: rbriber@POLY1.NIST.GOV's message of 6 Mar 91 22:40:00 GMT 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 X#include X#include 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 X#include X#include X#include 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 / Traveller on Dragon Wings Information Services, / Help! My disclaimer is missing! Silicon Graphics, Inc / Politicians no baka!