aboutsummaryrefslogtreecommitdiff
path: root/sys/boot
diff options
context:
space:
mode:
authorMarcel Moolenaar <marcel@FreeBSD.org>2005-06-11 05:44:54 +0000
committerMarcel Moolenaar <marcel@FreeBSD.org>2005-06-11 05:44:54 +0000
commit6c0dfabdc76e787dfc0f120dafe5f53c2d95e97f (patch)
tree3bcaf2d6277f2ae1cb953224718fe523b3c06c4b /sys/boot
parentb314b57dd55ab1004ed1984dd3d43a5c60196f5b (diff)
Notes
Diffstat (limited to 'sys/boot')
-rw-r--r--sys/boot/alpha/libalpha/getsecs.c65
1 files changed, 46 insertions, 19 deletions
diff --git a/sys/boot/alpha/libalpha/getsecs.c b/sys/boot/alpha/libalpha/getsecs.c
index 18c87702738b..e4e175c49331 100644
--- a/sys/boot/alpha/libalpha/getsecs.c
+++ b/sys/boot/alpha/libalpha/getsecs.c
@@ -1,5 +1,27 @@
-/*
- * $NetBSD: getsecs.c,v 1.5 1998/01/05 07:02:49 perry Exp $
+/*-
+ * Copyright (c) 2005 Marcel Moolenaar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
@@ -9,31 +31,36 @@ __FBSDID("$FreeBSD$");
#include <machine/prom.h>
#include <machine/rpb.h>
+static unsigned long lastpcc;
+static int tnsec;
+
+/*
+ * Count the number of elapsed seconds since this function was called first.
+ * The algorithm uses the processor's cycle counter, which means that it'd
+ * better be called frequently (on a 433Mhz machine this means at least once
+ * every 9 seconds or so).
+ */
int
getsecs()
{
- static long tnsec;
- static long lastpcc, wrapsecs;
- long curpcc;
+ struct rpb *hwrpb = (struct rpb *)HWRPB_ADDR;
+ unsigned long curpcc;
+ int delta;
if (tnsec == 0) {
tnsec = 1;
- lastpcc = alpha_rpcc() & 0xffffffff;
- wrapsecs = (0xffffffff /
- ((struct rpb *)HWRPB_ADDR)->rpb_cc_freq) + 1;
-
-#if 0
- printf("getsecs: cc freq = %d, time to wrap = %d\n",
- ((struct rpb *)HWRPB_ADDR)->rpb_cc_freq, wrapsecs);
-#endif
+ lastpcc = alpha_rpcc() & 0xfffffffful;
+ return (tnsec);
}
- curpcc = alpha_rpcc() & 0xffffffff;
+ curpcc = alpha_rpcc() & 0xfffffffful;
if (curpcc < lastpcc)
- curpcc += 0x100000000;
-
- tnsec += ((curpcc - lastpcc) * 1000000000) / ((struct rpb *)HWRPB_ADDR)->rpb_cc_freq;
- lastpcc = curpcc;
+ curpcc += 0x100000000ul;
- return (tnsec / 1000000000);
+ delta = (curpcc - lastpcc) / hwrpb->rpb_cc_freq;
+ if (delta) {
+ tnsec += delta;
+ lastpcc = curpcc & 0xfffffffful;
+ }
+ return (tnsec);
}