summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2010-03-10 17:16:11 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2010-03-10 17:16:11 +0000
commitf1c5a5228f91993c90504652dbc10e39cbd0c967 (patch)
tree7f3bcaff117b59d24e0ddde53c36cbf5df4abdcd
parent2010-03-10 Joel Sherrill <joel.sherrill@oarcorp.com> (diff)
downloadrtems-f1c5a5228f91993c90504652dbc10e39cbd0c967.tar.bz2
2010-03-10 Gedare Bloom <gedare@gwu.edu>
PR 1495/bsp * clock/ckinit.c: Calling rtems_clock_get_uptime() in a tight loop sometimes showed time moving backwards.
-rw-r--r--c/src/lib/libbsp/i386/pc386/ChangeLog6
-rw-r--r--c/src/lib/libbsp/i386/pc386/clock/ckinit.c16
2 files changed, 22 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/i386/pc386/ChangeLog b/c/src/lib/libbsp/i386/pc386/ChangeLog
index c45515ef08..a846549bd8 100644
--- a/c/src/lib/libbsp/i386/pc386/ChangeLog
+++ b/c/src/lib/libbsp/i386/pc386/ChangeLog
@@ -1,3 +1,9 @@
+2010-03-10 Gedare Bloom <gedare@gwu.edu>
+
+ PR 1495/bsp
+ * clock/ckinit.c: Calling rtems_clock_get_uptime() in a tight loop
+ sometimes showed time moving backwards.
+
2009-09-15 Till Straumann <strauman@slac.stanford.edu>
PR 1344/bsps:
diff --git a/c/src/lib/libbsp/i386/pc386/clock/ckinit.c b/c/src/lib/libbsp/i386/pc386/clock/ckinit.c
index ff5b9c46c1..22519a98ee 100644
--- a/c/src/lib/libbsp/i386/pc386/clock/ckinit.c
+++ b/c/src/lib/libbsp/i386/pc386/clock/ckinit.c
@@ -47,6 +47,11 @@ uint64_t pc586_tsc_at_tick;
/* this driver may need to count ISRs per tick */
#define CLOCK_DRIVER_ISRS_PER_TICK pc386_isrs_per_tick
+/* if so, the driver may use the count in Clock_driver_support_at_tick */
+#ifdef CLOCK_DRIVER_ISRS_PER_TICK
+extern volatile uint32_t Clock_driver_isrs;
+#endif
+
#define READ_8254( _lsb, _msb ) \
do { outport_byte(TIMER_MODE, TIMER_SEL0|TIMER_LATCH); \
inport_byte(TIMER_CNTR0, _lsb); \
@@ -66,7 +71,18 @@ uint32_t (*Clock_driver_nanoseconds_since_last_tick)(void) = NULL;
*/
void Clock_driver_support_at_tick_tsc(void)
{
+#ifdef CLOCK_DRIVER_ISRS_PER_TICK
+ /*
+ * The driver is multiple ISRs per clock tick.
+ */
+ if (!Clock_driver_isrs)
+ pc586_tsc_at_tick = rdtsc();
+#else
+ /*
+ * The driver is one ISR per clock tick.
+ */
pc586_tsc_at_tick = rdtsc();
+#endif
}
void Clock_driver_support_at_tick_empty(void)