summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2011-03-04 14:07:19 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2011-03-04 14:07:19 +0000
commitd209d9bbccb39bde70101f0609dacc29d402a037 (patch)
tree7b1e1a0f87e4cab837216598aa9db0b0c8251d30
parent2011-03-04 Joel Sherrill <joel.sherrilL@OARcorp.com> (diff)
downloadrtems-d209d9bbccb39bde70101f0609dacc29d402a037.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.
-rw-r--r--c/src/lib/libbsp/sparc/leon3/ChangeLog8
-rw-r--r--c/src/lib/libbsp/sparc/leon3/clock/ckinit.c20
-rw-r--r--c/src/lib/libbsp/sparc/leon3/include/leon.h4
3 files changed, 21 insertions, 11 deletions
diff --git a/c/src/lib/libbsp/sparc/leon3/ChangeLog b/c/src/lib/libbsp/sparc/leon3/ChangeLog
index a924bb95dd..17a96ad316 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.
+
2009-03-09 Antoine Lacroix <antoine.lacroix at sodern.fr>
PR 1391/bsps
diff --git a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
index 977b9d887a..59eb10c4d7 100644
--- a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
+++ b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
@@ -97,16 +97,18 @@ static int clkirq;
uint32_t bsp_clock_nanoseconds_since_last_tick(void)
{
uint32_t clicks;
- 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;
+ uint32_t usecs;
+
+ if ( LEON_Is_interrupt_pending( LEON_INTERRUPT_TIMER1 ) ) {
+ clicks = LEON_REG.Timer_Counter_1;
+ 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.c"
diff --git a/c/src/lib/libbsp/sparc/leon3/include/leon.h b/c/src/lib/libbsp/sparc/leon3/include/leon.h
index 8c130ad6cc..8f817ebf72 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)