diff --git a/configure b/configure index fad03fd..ac6939c 100755 --- a/configure +++ b/configure @@ -467,7 +467,7 @@ case $OPERATINGSYSTEM in ;; SunOS) EXTRA_OBJECTS="sys_generic.o sys_solaris.o sys_timex.o sys_posix.o" - LIBS="$LIBS -lsocket -lnsl -lresolv" + LIBS="$LIBS -lsocket -lnsl -lkvm -lelf -lresolv" try_setsched=1 try_lockmem=1 add_def SOLARIS diff --git a/sys_solaris.c b/sys_solaris.c index ba86c11..24949cb 100644 --- a/sys_solaris.c +++ b/sys_solaris.c @@ -28,16 +28,47 @@ #include "sysincl.h" +#include "logging.h" #include "privops.h" #include "sys_solaris.h" #include "sys_timex.h" #include "util.h" +#include +#include + +/* ================================================== */ + +static void +set_dosynctodr(int on_off) +{ + struct nlist nl[] = { {"dosynctodr"}, {NULL} }; + kvm_t *kt; + + kt = kvm_open(NULL, NULL, NULL, O_RDWR, NULL); + if (!kt) + LOG_FATAL("Could not open kvm"); + + if (kvm_nlist(kt, nl) < 0 || !nl[0].n_value) + LOG_FATAL("Could not get dosynctodr address"); + + if (kvm_kwrite(kt, nl[0].n_value, &on_off, sizeof (on_off)) < 0) + LOG_FATAL("Could not write to dosynctodr"); + + kvm_close(kt); +} + /* ================================================== */ void SYS_Solaris_Initialise(void) { + /* The kernel keeps the system clock and hardware clock synchronised to each + other. The dosynctodr variable needs to be set to zero to prevent the + the system clock from following the hardware clock when the system clock + is not adjusted by adjtime() or ntp_adjtime(modes=MOD_OFFSET). */ + set_dosynctodr(0); + /* The kernel allows the frequency to be set in the full range off int32_t */ SYS_Timex_InitialiseWithFunctions(32500, 1.0 / 100, NULL, NULL, NULL, 0.0, 0.0, NULL, NULL);