getsecs.c revision 1.2
11.1Scgd#include <sys/param.h>
21.1Scgd#include "include/prom.h"
31.1Scgd#include "include/rpb.h"
41.1Scgd
51.1Scgdint
61.1Scgdgetsecs()
71.1Scgd{
81.1Scgd	static long tnsec;
91.1Scgd	static long lastpcc, wrapsecs;
101.1Scgd	long curpcc, pccdiff;
111.1Scgd
121.1Scgd	if (tnsec == 0) {
131.1Scgd		tnsec = 1;
141.1Scgd		lastpcc = alpha_rpcc() & 0xffffffff;
151.1Scgd		wrapsecs = (0xffffffff /
161.1Scgd		    ((struct rpb *)HWRPB_ADDR)->rpb_cc_freq) + 1;
171.1Scgd
181.2Scgd#if 0
191.1Scgd		printf("getsecs: cc freq = %d, time to wrap = %d\n",
201.1Scgd		    ((struct rpb *)HWRPB_ADDR)->rpb_cc_freq, wrapsecs);
211.2Scgd#endif
221.1Scgd	}
231.1Scgd
241.1Scgd	curpcc = alpha_rpcc() & 0xffffffff;
251.1Scgd	if (curpcc < lastpcc)
261.1Scgd		curpcc += 0x100000000;
271.1Scgd
281.1Scgd	tnsec += ((curpcc - lastpcc) * 1000000000) / ((struct rpb *)HWRPB_ADDR)->rpb_cc_freq;
291.1Scgd	lastpcc = curpcc;
301.1Scgd
311.1Scgd	return (tnsec / 1000000000);
321.1Scgd}
33