getsecs.c revision 1.5
11.5Sperry/*	$NetBSD: getsecs.c,v 1.5 1998/01/05 07:02:49 perry Exp $	*/
21.5Sperry
31.1Scgd#include <sys/param.h>
41.1Scgd#include "include/prom.h"
51.1Scgd#include "include/rpb.h"
61.1Scgd
71.1Scgdint
81.1Scgdgetsecs()
91.1Scgd{
101.1Scgd	static long tnsec;
111.1Scgd	static long lastpcc, wrapsecs;
121.4Sdrochner	long curpcc;
131.1Scgd
141.1Scgd	if (tnsec == 0) {
151.3Scgd		tnsec = 1;
161.1Scgd		lastpcc = alpha_rpcc() & 0xffffffff;
171.1Scgd		wrapsecs = (0xffffffff /
181.1Scgd		    ((struct rpb *)HWRPB_ADDR)->rpb_cc_freq) + 1;
191.1Scgd
201.2Scgd#if 0
211.1Scgd		printf("getsecs: cc freq = %d, time to wrap = %d\n",
221.1Scgd		    ((struct rpb *)HWRPB_ADDR)->rpb_cc_freq, wrapsecs);
231.2Scgd#endif
241.1Scgd	}
251.1Scgd
261.1Scgd	curpcc = alpha_rpcc() & 0xffffffff;
271.1Scgd	if (curpcc < lastpcc)
281.1Scgd		curpcc += 0x100000000;
291.1Scgd
301.1Scgd	tnsec += ((curpcc - lastpcc) * 1000000000) / ((struct rpb *)HWRPB_ADDR)->rpb_cc_freq;
311.1Scgd	lastpcc = curpcc;
321.1Scgd
331.1Scgd	return (tnsec / 1000000000);
341.1Scgd}
35