V10/sys/io/fineclock.c

/*
 * read a fine-resolution clock,
 * derived from the VAX interval timer
 */
#include "sys/param.h"
#include "sys/mtpr.h"
#include "sys/clock.h"
#include "sys/systm.h"	/* for time and lbolt */
#include "sys/buf.h"	/* just for B_READ */
#include "sys/conf.h"
#include "sys/user.h"

static int clkread();
struct cdevsw clkcdev = cdinit(nulldev, nulldev, clkread, nodev, nodev);

#define	FINERES	(-CLK60HZ)

static
clkread(dev)
int dev;
{
	register int s;
	long finetime;

	s = spl7();
	finetime = FINERES + mfpr(ICR);	/* ICR is negative remaining count */
	if (mfpr(ICCS) & ICCS_INT)
		finetime += FINERES;	/* one tick already past */
	finetime += (lbolt * FINERES) + (time * FINERES * HZ);
	splx(s);
	iomove((caddr_t)&finetime, MIN(u.u_count, sizeof(finetime)), B_READ);
}