summaryrefslogtreecommitdiff
path: root/c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2011-03-04 14:07:08 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2011-03-04 14:07:08 +0000
commit7fce2ca5cd05b0f3540235f3e17e90381abb5eab (patch)
tree6efc2c402b4632f7cf60f6cce125357ab7a4f797 /c
parent631a092239d5b78dbf2832ba094c7c74b5c3c958 (diff)
2011-03-04 Joel Sherrill <joel.sherrilL@OARcorp.com>
PR 1748/bsps * clock/ckinit.c, include/leon.h: When the clock tick generates an interrupt WHILE we have interrupts disabled doing a get TOD or uptime, the get nanoseconds handler was returning a bogusly large number.
Diffstat (limited to 'c')
-rw-r--r--c/src/lib/libbsp/sparc/leon3/ChangeLog8
-rw-r--r--c/src/lib/libbsp/sparc/leon3/clock/ckinit.c16
-rw-r--r--c/src/lib/libbsp/sparc/leon3/include/leon.h4
3 files changed, 22 insertions, 6 deletions
diff --git a/c/src/lib/libbsp/sparc/leon3/ChangeLog b/c/src/lib/libbsp/sparc/leon3/ChangeLog
index 0c61fdeff8..4ef8f9ce0b 100644
--- a/c/src/lib/libbsp/sparc/leon3/ChangeLog
+++ b/c/src/lib/libbsp/sparc/leon3/ChangeLog
@@ -1,3 +1,11 @@
+2011-03-04 Joel Sherrill <joel.sherrilL@OARcorp.com>
+
+ PR 1748/bsps
+ * clock/ckinit.c, include/leon.h: When the clock tick generates an
+ interrupt WHILE we have interrupts disabled doing a get TOD or
+ uptime, the get nanoseconds handler was returning a bogusly large
+ number.
+
2011-02-02 Ralf Corsépius <ralf.corsepius@rtems.org>
* configure.ac: Require autoconf-2.68, automake-1.11.1.
diff --git a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
index 071265a30e..5bd41bb7cd 100644
--- a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
+++ b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
@@ -97,16 +97,24 @@ static int clkirq;
uint32_t bsp_clock_nanoseconds_since_last_tick(void)
{
uint32_t clicks;
+ uint32_t usecs;
+
if ( !LEON3_Timer_Regs )
return 0;
clicks = LEON3_Timer_Regs->timer[0].value;
- /* Down counter */
- return (uint32_t)
- (rtems_configuration_get_microseconds_per_tick() - clicks) * 1000;
+ if ( LEON_Is_interrupt_pending( clkirq ) ) {
+ clicks = LEON3_Timer_Regs->timer[0].value;
+ usecs = (2*rtems_configuration_get_microseconds_per_tick() - clicks);
+ } else {
+ usecs = (rtems_configuration_get_microseconds_per_tick() - clicks);
+ }
+ return usecs * 1000;
}
-#define Clock_driver_nanoseconds_since_last_tick bsp_clock_nanoseconds_since_last_tick
+
+#define Clock_driver_nanoseconds_since_last_tick \
+ bsp_clock_nanoseconds_since_last_tick
#include "../../../shared/clockdrv_shell.h"
diff --git a/c/src/lib/libbsp/sparc/leon3/include/leon.h b/c/src/lib/libbsp/sparc/leon3/include/leon.h
index 93bc05462c..ee5ae30af8 100644
--- a/c/src/lib/libbsp/sparc/leon3/include/leon.h
+++ b/c/src/lib/libbsp/sparc/leon3/include/leon.h
@@ -245,11 +245,11 @@ extern int LEON3_Cpu_Index;
} while (0)
#define LEON_Is_interrupt_pending( _source ) \
- (LEON3_IrqCtrl_Regs.ipend & (1 << (_source)))
+ (LEON3_IrqCtrl_Regs->ipend & (1 << (_source)))
#define LEON_Is_interrupt_masked( _source ) \
do {\
- (LEON3_IrqCtrl_Regs.mask[LEON3_Cpu_Index] & (1 << (_source))); \
+ (LEON3_IrqCtrl_Regs->mask[LEON3_Cpu_Index] & (1 << (_source))); \
} while (0)