As Linux knows about our timezone (MET or MET DST), the time was
rather correct when I started. After the program was running for some
time (> 30 minutes), the clock seemed to be ok, but after reboot I
had discovered that the clock was still one hour behind. Obviously
there's something wrong in kernel/time.c. I don't know what it is
exactly, but the CMOS clock isn't updated properly.
One problem seems to be that the warp_clock() depends on a _local_
flag in sys_settimeofday(). If you have a continuously running
system, you will have to "re-warp" the clock at beginning/end of DST.
BTW: There's also a bug in libc 5.2.18: __adjtimex() only fills the
old timex structure!
int
__ntp_gettime (struct ntptimeval * ntv)
{
struct timex tntx;
int result;
result = adjtimex(&tntx);
ntv->time = tntx.time;
ntv->maxerror = tntx.maxerror;
ntv->esterror = tntx.esterror;
return result;
}
In <sys/timex.h> there's the wrong structure declared:
struct ntptimeval {
struct timeval time; /* current time */
long maxerror; /* maximum error (usec) */
long esterror; /* estimated error (usec) */
};
Here's my little test program:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/time.h>
#include <linux/timex.h>
#if 1
#include <syscall.h>
inline static
_syscall1(int, adjtimex, struct timex *, ntx);
static int __ntp_gettime(struct timex *ntv)
{
return(adjtimex(ntv));
}
#endif
get_values()
{
struct timex tx;
memset(&tx, 0, sizeof(tx));
tx.modes = 0;
if ( __ntp_gettime(&tx) != 0 )
return;
printf("%6ld %6ld %6ld %6ld %3d %6ld %6ld %6ld\n",
tx.offset, tx.freq, tx.maxerror, tx.esterror, tx.status,
tx.constant, tx.precision, tx.tolerance);
printf("%6ld %6ld %6ld %2ld %6ld %6ld %6ld\n",
tx.tick, tx.ppsfreq, tx.jitter, tx.shift, tx.stabil, tx.jitcnt,
tx.calcnt);
}
main()
{
printf("offset freq maxerr esterr sta consta precis tolera\n"
"tick ppsfre jitter sh stabil jitcnt calcnt\n"
"----------------------------------------------------\n");
for (;;)
{
get_values();
sleep(1);
}
}
Finally: On my Pentium 100 with enough RAM and SCSI (AHA2940) the
interrupt latency for ttyS0 is below 1ms (as experienced at user
level). Even with some CPU and disk load I have no problem. I'm
wondering if someone who does not have kerneld or EIDE drives has
problems with interrupt latency.
Ulrich