[comp.sys.sgi] The Time

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!