diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2011-03-04 14:06:54 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2011-03-04 14:06:54 +0000 |
commit | b3559ee9f5b7b490568039dabc72aee5fe75b8e0 (patch) | |
tree | cc59c220b2fee2c9d479102f3eee55e2b0866a13 /c | |
parent | 2011-03-04 Joel Sherrill <joel.sherrilL@OARcorp.com> (diff) | |
download | rtems-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/ChangeLog | 8 | ||||
-rw-r--r-- | c/src/lib/libbsp/sparc/leon3/clock/ckinit.c | 15 | ||||
-rw-r--r-- | c/src/lib/libbsp/sparc/leon3/include/leon.h | 4 |
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) |