From f1c5a5228f91993c90504652dbc10e39cbd0c967 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Wed, 10 Mar 2010 17:16:11 +0000 Subject: 2010-03-10 Gedare Bloom PR 1495/bsp * clock/ckinit.c: Calling rtems_clock_get_uptime() in a tight loop sometimes showed time moving backwards. --- c/src/lib/libbsp/i386/pc386/ChangeLog | 6 ++++++ c/src/lib/libbsp/i386/pc386/clock/ckinit.c | 16 ++++++++++++++++ 2 files changed, 22 insertions(+) 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 + + 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 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) -- cgit v1.2.3