summaryrefslogtreecommitdiffstats
path: root/c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2011-03-04 14:06:54 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2011-03-04 14:06:54 +0000
commitb3559ee9f5b7b490568039dabc72aee5fe75b8e0 (patch)
treecc59c220b2fee2c9d479102f3eee55e2b0866a13 /c
parent2011-03-04 Joel Sherrill <joel.sherrilL@OARcorp.com> (diff)
downloadrtems-b3559ee9f5b7b490568039dabc72aee5fe75b8e0.tar.bz2
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.c15
-rw-r--r--c/src/lib/libbsp/sparc/leon3/include/leon.h4
3 files changed, 21 insertions, 6 deletions
diff --git a/c/src/lib/libbsp/sparc/leon3/ChangeLog b/c/src/lib/libbsp/sparc/leon3/ChangeLog
index de763cf3ac..bf2b5b87fd 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-11 Ralf Corsépius <ralf.corsepius@rtems.org>
* amba/amba.c, include/tm27.h, shmsupp/lock.c, startup/bspstart.c,
diff --git a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
index 071265a30e..86a968fea8 100644
--- a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
+++ b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
@@ -97,16 +97,23 @@ 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)