diff options
| author | Marcel Moolenaar <marcel@FreeBSD.org> | 2005-06-11 05:44:54 +0000 |
|---|---|---|
| committer | Marcel Moolenaar <marcel@FreeBSD.org> | 2005-06-11 05:44:54 +0000 |
| commit | 6c0dfabdc76e787dfc0f120dafe5f53c2d95e97f (patch) | |
| tree | 3bcaf2d6277f2ae1cb953224718fe523b3c06c4b /sys | |
| parent | b314b57dd55ab1004ed1984dd3d43a5c60196f5b (diff) | |
Notes
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/boot/alpha/libalpha/getsecs.c | 65 |
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); } |
