[PATCH 3/4] new rtems environment with the implementation of FreeBSD timecounters; modifications of certain tests in the testsuite New test: timecounter02

Joel Sherrill joel.sherrill at oarcorp.com
Wed Apr 1 15:58:27 UTC 2015



On 4/1/2015 10:01 AM, Gedare Bloom wrote:
> I didn't read much of this, but it needs doxygen, and probably part of
> the previous patch should be merged in here, or some better
> splitting/recombining of patches so I don't have to review code that
> gets fixed. It's worth repeating, the "rtems_*time" functions are not
> following the API conventions of rtems_package_method, it should be
> rtems_timecounter_*time like rtems_timecounter_bintime.
>
> Please use a short git-commit message for the first line, and longer
> git commit message after a blank line. This will avoid really long
> lines in git log, and long subjects in git-send-email. I guess this
> advice is in the Git page
> (https://devel.rtems.org/wiki/Developer/Git).
It is already combined so I am not going to complain but I see a method
renamed
in here (_TOD_Get). Personally I like a series of small patches and that
is an
example of something that could have been done independently.  Remember
smaller patches are easier for everyone to review. It is often hard to
think that
way as you are working and knees deep in it, but it is important.

Add an _ after _Timecount_Get and rtems_get_ in various API methods. But the
rtems_get methods are (as Gedare pointed out) named incorrectly per the
RTEMS API naming patterns.

rtems_ methods should not be in the score. By convention, they should be in
the rtems_ directory.

I think I see some tabs in the files particularly the test code. Check
all code for
tabs. They shouldn't be used in source files.

Tests usually have a comment marking the beginning and end of the
configuration
section. Just check another test for the convention.

I agree with Gedare that a lot of Doxygen is missing. File headers and
group annotation
appear to be largely missing in addition to methods not having any
documentation.

> Gedare
>
>
> On Wed, Apr 1, 2015 at 10:37 AM, Alexander Krutwig
> <alexander.krutwig at embedded-brains.de> wrote:
>> ---
>>  cpukit/libnetworking/rtems/rtems_bsdnet_internal.h |   3 +-
>>  cpukit/libnetworking/rtems/rtems_glue.c            |   4 -
>>  cpukit/posix/src/clockgettime.c                    |   3 +-
>>  cpukit/posix/src/posixtimespecabsolutetimeout.c    |   2 +-
>>  cpukit/posix/src/timergettime.c                    |   2 +-
>>  cpukit/posix/src/timersettime.c                    |   4 +-
>>  cpukit/posix/src/timertsr.c                        |   2 +-
>>  cpukit/rtems/Makefile.am                           |   1 -
>>  cpukit/rtems/include/rtems/rtems/clock.h           |  25 --
>>  cpukit/rtems/src/clockgetuptimenanoseconds.c       |   9 +-
>>  cpukit/rtems/src/clockgetuptimeseconds.c           |   6 +-
>>  cpukit/rtems/src/clocksetnsecshandler.c            |  34 --
>>  cpukit/sapi/Makefile.am                            |   1 +
>>  cpukit/sapi/include/rtems/timecounter.h            |  89 +++++
>>  cpukit/sapi/preinstall.am                          |   4 +
>>  cpukit/sapi/src/exinit.c                           |   3 +
>>  cpukit/score/Makefile.am                           |  18 +-
>>  cpukit/score/include/rtems/score/timecounter.h     |  59 +++-
>>  cpukit/score/include/rtems/score/timecounterimpl.h | 119 +++++++
>>  cpukit/score/include/rtems/score/timestamp.h       | 267 ++++++++-------
>>  cpukit/score/include/rtems/score/timestamp64.h     | 379 ---------------------
>>  cpukit/score/include/rtems/score/tod.h             |   9 -
>>  cpukit/score/include/rtems/score/todimpl.h         | 101 ++----
>>  cpukit/score/preinstall.am                         |  10 +-
>>  cpukit/score/src/coretod.c                         |  18 +-
>>  cpukit/score/src/coretodadjust.c                   |   9 +-
>>  cpukit/score/src/coretodget.c                      |  46 ---
>>  cpukit/score/src/coretodgetuptimetimespec.c        |  32 --
>>  cpukit/score/src/coretodsecondssinceepoch.c        |  32 --
>>  cpukit/score/src/coretodset.c                      |  10 +-
>>  cpukit/score/src/coretodtickle.c                   |  22 +-
>>  cpukit/score/src/tcgetscalerandmask.c              |  40 +++
>>  cpukit/score/src/ts64addto.c                       |  31 --
>>  cpukit/score/src/ts64divide.c                      |  51 ---
>>  cpukit/score/src/ts64equalto.c                     |  31 --
>>  cpukit/score/src/ts64getnanoseconds.c              |  30 --
>>  cpukit/score/src/ts64getseconds.c                  |  30 --
>>  cpukit/score/src/ts64lessthan.c                    |  31 --
>>  cpukit/score/src/ts64set.c                         |  33 --
>>  cpukit/score/src/ts64settozero.c                   |  31 --
>>  cpukit/score/src/ts64subtract.c                    |  31 --
>>  cpukit/score/src/ts64totimespec.c                  |  32 --
>>  cpukit/score/src/ts64totimeval.c                   |  37 --
>>  testsuites/sptests/Makefile.am                     |   2 +
>>  testsuites/sptests/configure.ac                    |   2 +
>>  testsuites/sptests/spclock_err01/init.c            |   8 -
>>  testsuites/sptests/spsize/size.c                   |   3 -
>>  testsuites/sptests/sptimecounter02/Makefile.am     |  19 ++
>>  testsuites/sptests/sptimecounter02/init.c          | 266 +++++++++++++++
>>  .../sptests/sptimecounter02/sptimecounter02.doc    |  11 +
>>  .../sptests/sptimecounter02/sptimecounter02.scn    |   0
>>  51 files changed, 818 insertions(+), 1224 deletions(-)
>>  delete mode 100644 cpukit/rtems/src/clocksetnsecshandler.c
>>  create mode 100644 cpukit/sapi/include/rtems/timecounter.h
>>  create mode 100644 cpukit/score/include/rtems/score/timecounterimpl.h
>>  delete mode 100644 cpukit/score/include/rtems/score/timestamp64.h
>>  delete mode 100644 cpukit/score/src/coretodget.c
>>  delete mode 100644 cpukit/score/src/coretodgetuptimetimespec.c
>>  delete mode 100644 cpukit/score/src/coretodsecondssinceepoch.c
>>  create mode 100644 cpukit/score/src/tcgetscalerandmask.c
>>  delete mode 100644 cpukit/score/src/ts64addto.c
>>  delete mode 100644 cpukit/score/src/ts64divide.c
>>  delete mode 100644 cpukit/score/src/ts64equalto.c
>>  delete mode 100644 cpukit/score/src/ts64getnanoseconds.c
>>  delete mode 100644 cpukit/score/src/ts64getseconds.c
>>  delete mode 100644 cpukit/score/src/ts64lessthan.c
>>  delete mode 100644 cpukit/score/src/ts64set.c
>>  delete mode 100644 cpukit/score/src/ts64settozero.c
>>  delete mode 100644 cpukit/score/src/ts64subtract.c
>>  delete mode 100644 cpukit/score/src/ts64totimespec.c
>>  delete mode 100644 cpukit/score/src/ts64totimeval.c
>>  create mode 100644 testsuites/sptests/sptimecounter02/Makefile.am
>>  create mode 100644 testsuites/sptests/sptimecounter02/init.c
>>  create mode 100644 testsuites/sptests/sptimecounter02/sptimecounter02.doc
>>  create mode 100644 testsuites/sptests/sptimecounter02/sptimecounter02.scn
>>
>> diff --git a/cpukit/libnetworking/rtems/rtems_bsdnet_internal.h b/cpukit/libnetworking/rtems/rtems_bsdnet_internal.h
>> index fc0370c..01562b1 100644
>> --- a/cpukit/libnetworking/rtems/rtems_bsdnet_internal.h
>> +++ b/cpukit/libnetworking/rtems/rtems_bsdnet_internal.h
>> @@ -12,6 +12,7 @@
>>
>>  #include <rtems.h>
>>  #include <rtems/fs.h>
>> +#include <rtems/timecounter.h>
>>
>>  #ifdef __cplusplus
>>  extern "C" {
>> @@ -61,7 +62,7 @@ void *memset(void *s, int c, size_t n);
>>  #define panic  rtems_panic
>>  #define suser(a,b)     0
>>
>> -void microtime(struct timeval *tv);
>> +#define microtime(tv) rtems_microtime(tv)
>>
>>  #define hz rtems_bsdnet_ticks_per_second
>>  #define tick rtems_bsdnet_microseconds_per_tick
>> diff --git a/cpukit/libnetworking/rtems/rtems_glue.c b/cpukit/libnetworking/rtems/rtems_glue.c
>> index f05530e..0a42f97 100644
>> --- a/cpukit/libnetworking/rtems/rtems_glue.c
>> +++ b/cpukit/libnetworking/rtems/rtems_glue.c
>> @@ -1344,7 +1344,3 @@ m_clalloc(int ncl, int nowait)
>>         return 1;
>>  }
>>
>> -void microtime(struct timeval *tv)
>> -{
>> -       rtems_clock_get_uptime_timeval(tv);
>> -}
>> diff --git a/cpukit/posix/src/clockgettime.c b/cpukit/posix/src/clockgettime.c
>> index 2838ba6..06cafa5 100644
>> --- a/cpukit/posix/src/clockgettime.c
>> +++ b/cpukit/posix/src/clockgettime.c
>> @@ -37,7 +37,8 @@ int clock_gettime(
>>      rtems_set_errno_and_return_minus_one( EINVAL );
>>
>>    if ( clock_id == CLOCK_REALTIME ) {
>> -    _TOD_Get(tp);
>> +
>> +    _TOD_Get_as_timespec(tp);
>>      return 0;
>>    }
>>  #ifdef CLOCK_MONOTONIC
>> diff --git a/cpukit/posix/src/posixtimespecabsolutetimeout.c b/cpukit/posix/src/posixtimespecabsolutetimeout.c
>> index 32da45f..f302986 100644
>> --- a/cpukit/posix/src/posixtimespecabsolutetimeout.c
>> +++ b/cpukit/posix/src/posixtimespecabsolutetimeout.c
>> @@ -57,7 +57,7 @@ POSIX_Absolute_timeout_conversion_results_t _POSIX_Absolute_timeout_to_ticks(
>>    /*
>>     *  Is the absolute time in the past?
>>     */
>> -  _TOD_Get( &current_time );
>> +  _TOD_Get_as_timespec( &current_time );
>>
>>    if ( _Timespec_Less_than( abstime, &current_time ) )
>>      return POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST;
>> diff --git a/cpukit/posix/src/timergettime.c b/cpukit/posix/src/timergettime.c
>> index 2a810ef..f065cc9 100644
>> --- a/cpukit/posix/src/timergettime.c
>> +++ b/cpukit/posix/src/timergettime.c
>> @@ -49,7 +49,7 @@ int timer_gettime(
>>      rtems_set_errno_and_return_minus_one( EINVAL );
>>
>>    /* Reads the current time */
>> -  _TOD_Get( &current_time );
>> +  _TOD_Get_as_timespec( &current_time );
>>
>>    ptimer = _POSIX_Timer_Get( timerid, &location );
>>    switch ( location ) {
>> diff --git a/cpukit/posix/src/timersettime.c b/cpukit/posix/src/timersettime.c
>> index 6cc3780..4d2af5d 100644
>> --- a/cpukit/posix/src/timersettime.c
>> +++ b/cpukit/posix/src/timersettime.c
>> @@ -66,7 +66,7 @@ int timer_settime(
>>    /* Convert absolute to relative time */
>>    if (flags == TIMER_ABSTIME) {
>>      struct timespec now;
>> -    _TOD_Get( &now );
>> +    _TOD_Get_as_timespec( &now );
>>      /* Check for seconds in the past */
>>      if ( _Timespec_Greater_than( &now, &normalize.it_value ) )
>>        rtems_set_errno_and_return_minus_one( EINVAL );
>> @@ -125,7 +125,7 @@ int timer_settime(
>>
>>         /* Indicate that the time is running */
>>         ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
>> -       _TOD_Get( &ptimer->time );
>> +       _TOD_Get_as_timespec( &ptimer->time );
>>        _Objects_Put( &ptimer->Object );
>>         return 0;
>>
>> diff --git a/cpukit/posix/src/timertsr.c b/cpukit/posix/src/timertsr.c
>> index 8555463..512dd06 100644
>> --- a/cpukit/posix/src/timertsr.c
>> +++ b/cpukit/posix/src/timertsr.c
>> @@ -58,7 +58,7 @@ void _POSIX_Timer_TSR(
>>        return;
>>
>>      /* Store the time when the timer was started again */
>> -    _TOD_Get( &ptimer->time );
>> +    _TOD_Get_as_timespec( &ptimer->time );
>>
>>      /* The state really did not change but just to be safe */
>>      ptimer->state = POSIX_TIMER_STATE_CREATE_RUN;
>> diff --git a/cpukit/rtems/Makefile.am b/cpukit/rtems/Makefile.am
>> index 5e6f2ea..1af8536 100644
>> --- a/cpukit/rtems/Makefile.am
>> +++ b/cpukit/rtems/Makefile.am
>> @@ -158,7 +158,6 @@ librtems_a_SOURCES += src/clockgetuptimetimeval.c
>>  librtems_a_SOURCES += src/clockgetuptimeseconds.c
>>  librtems_a_SOURCES += src/clockgetuptimenanoseconds.c
>>  librtems_a_SOURCES += src/clockset.c
>> -librtems_a_SOURCES += src/clocksetnsecshandler.c
>>  librtems_a_SOURCES += src/clocktick.c
>>  librtems_a_SOURCES += src/clocktodtoseconds.c
>>  librtems_a_SOURCES += src/clocktodvalidate.c
>> diff --git a/cpukit/rtems/include/rtems/rtems/clock.h b/cpukit/rtems/include/rtems/rtems/clock.h
>> index 2a1c772..89750cf 100644
>> --- a/cpukit/rtems/include/rtems/rtems/clock.h
>> +++ b/cpukit/rtems/include/rtems/rtems/clock.h
>> @@ -14,7 +14,6 @@
>>   *
>>   * - set the current date and time
>>   * - obtain the current date and time
>> - * - set the nanoseconds since last clock tick handler
>>   * - announce a clock tick
>>   * - obtain the system uptime
>>   */
>> @@ -69,12 +68,6 @@ typedef enum {
>>  } rtems_clock_get_options;
>>
>>  /**
>> - *  Type for the nanoseconds since last tick BSP extension.
>> - */
>> -typedef TOD_Nanoseconds_since_last_tick_routine
>> -  rtems_nanoseconds_extension_routine;
>> -
>> -/**
>>   * @brief Obtain Current Time of Day
>>   *
>>   * @deprecated rtems_clock_get() is deprecated. Use the more explicit
>> @@ -279,24 +272,6 @@ rtems_status_code rtems_clock_set(
>>  rtems_status_code rtems_clock_tick( void );
>>
>>  /**
>> - * @brief Set the BSP specific Nanoseconds Extension
>> - *
>> - * Clock Manager
>> - *
>> - * This directive sets the BSP provided nanoseconds since last tick
>> - * extension.
>> - *
>> - * @param[in] routine is a pointer to the extension routine
>> - *
>> - * @return This method returns RTEMS_SUCCESSFUL if there was not an
>> - *         error. Otherwise, a status code is returned indicating the
>> - *         source of the error.
>> - */
>> -rtems_status_code rtems_clock_set_nanoseconds_extension(
>> -  rtems_nanoseconds_extension_routine routine
>> -);
>> -
>> -/**
>>   * @brief Obtain the System Uptime
>>   *
>>   * This directive returns the system uptime.
>> diff --git a/cpukit/rtems/src/clockgetuptimenanoseconds.c b/cpukit/rtems/src/clockgetuptimenanoseconds.c
>> index 0310e59..d43f672 100644
>> --- a/cpukit/rtems/src/clockgetuptimenanoseconds.c
>> +++ b/cpukit/rtems/src/clockgetuptimenanoseconds.c
>> @@ -23,13 +23,8 @@
>>  uint64_t rtems_clock_get_uptime_nanoseconds( void )
>>  {
>>    Timestamp_Control  snapshot_as_timestamp;
>> -  uint32_t           nanoseconds;
>> -  ISR_lock_Context   lock_context;
>>
>> -  _TOD_Acquire( &_TOD, &lock_context );
>> -    snapshot_as_timestamp = _TOD.uptime;
>> -    nanoseconds = ( *_TOD.nanoseconds_since_last_tick )();
>> -  _TOD_Release( &_TOD, &lock_context );
>> +  _TOD_Get_uptime(&snapshot_as_timestamp);
>>
>> -  return _Timestamp_Get_As_nanoseconds( &snapshot_as_timestamp, nanoseconds );
>> +  return _Timestamp_Get_nanoseconds(&snapshot_as_timestamp);
>>  }
>> diff --git a/cpukit/rtems/src/clockgetuptimeseconds.c b/cpukit/rtems/src/clockgetuptimeseconds.c
>> index 0312921..5c6b57c 100644
>> --- a/cpukit/rtems/src/clockgetuptimeseconds.c
>> +++ b/cpukit/rtems/src/clockgetuptimeseconds.c
>> @@ -28,14 +28,10 @@
>>
>>  time_t rtems_clock_get_uptime_seconds( void )
>>  {
>> -  TOD_Control       *tod = &_TOD;
>>    Timestamp_Control  snapshot_as_timestamp;
>>    struct timespec    snapshot_as_timespec;
>> -  ISR_lock_Context   lock_context;
>>
>> -  _TOD_Acquire( tod, &lock_context );
>> -  snapshot_as_timestamp = tod->uptime;
>> -  _TOD_Release( tod, &lock_context );
>> +  _TOD_Get_uptime(&snapshot_as_timestamp);
>>
>>    _Timestamp_To_timespec( &snapshot_as_timestamp, &snapshot_as_timespec );
>>
>> diff --git a/cpukit/rtems/src/clocksetnsecshandler.c b/cpukit/rtems/src/clocksetnsecshandler.c
>> deleted file mode 100644
>> index ae08246..0000000
>> --- a/cpukit/rtems/src/clocksetnsecshandler.c
>> +++ /dev/null
>> @@ -1,34 +0,0 @@
>> -/**
>> - * @file
>> - *
>> - * @brief Set the BSP specific Nanoseconds Extension
>> - * @ingroup ClassicClock Clocks
>> - */
>> -
>> -/*
>> - *  COPYRIGHT (c) 1989-2006.
>> - *  On-Line Applications Research Corporation (OAR).
>> - *
>> - *  The license and distribution terms for this file may be
>> - *  found in the file LICENSE in this distribution or at
>> - *  http://www.rtems.org/license/LICENSE.
>> - */
>> -
>> -#if HAVE_CONFIG_H
>> -#include "config.h"
>> -#endif
>> -
>> -#include <rtems/rtems/clock.h>
>> -#include <rtems/score/todimpl.h>
>> -
>> -rtems_status_code rtems_clock_set_nanoseconds_extension(
>> -  rtems_nanoseconds_extension_routine routine
>> -)
>> -{
>> -  if ( !routine )
>> -    return RTEMS_INVALID_ADDRESS;
>> -
>> -  _TOD_Set_nanoseconds_since_last_tick_handler( routine );
>> -
>> -  return RTEMS_SUCCESSFUL;
>> -}
>> diff --git a/cpukit/sapi/Makefile.am b/cpukit/sapi/Makefile.am
>> index 070800e..17f0e4f 100644
>> --- a/cpukit/sapi/Makefile.am
>> +++ b/cpukit/sapi/Makefile.am
>> @@ -19,6 +19,7 @@ include_rtems_HEADERS += include/rtems/rbheap.h
>>  include_rtems_HEADERS += include/rtems/rbtree.h
>>  include_rtems_HEADERS += include/rtems/scheduler.h
>>  include_rtems_HEADERS += include/rtems/sptables.h
>> +include_rtems_HEADERS += include/rtems/timecounter.h
>>  include_rtems_HEADERS += include/rtems/timespec.h
>>
>>  EXTRA_DIST = include/rtems/README
>> diff --git a/cpukit/sapi/include/rtems/timecounter.h b/cpukit/sapi/include/rtems/timecounter.h
>> new file mode 100644
>> index 0000000..a496e64
>> --- /dev/null
>> +++ b/cpukit/sapi/include/rtems/timecounter.h
>> @@ -0,0 +1,89 @@
>> +/*
>> + * Copyright (c) 2015 embedded brains GmbH.  All rights reserved.
>> + *
>> + *  embedded brains GmbH
>> + *  Dornierstr. 4
>> + *  82178 Puchheim
>> + *  Germany
>> + *  <rtems at embedded-brains.de>
>> + *
>> + * The license and distribution terms for this file may be
>> + * found in the file LICENSE in this distribution or at
>> + * http://www.rtems.org/license/LICENSE.
>> + */
>> +
>> +#ifndef _RTEMS_TIMECOUNTER_H
>> +#define _RTEMS_TIMECOUNTER_H
>> +
>> +#include <rtems/score/timecounter.h>
>> +#include <rtems/score/basedefs.h>
>> +
>> +#ifdef __cplusplus
>> +extern "C" {
>> +#endif /* __cplusplus */
>> +
>> +RTEMS_INLINE_ROUTINE void rtems_bintime( struct bintime *bt )
>> +{
>> +  _Timecounter_Bintime( bt );
>> +}
>> +
>> +RTEMS_INLINE_ROUTINE void rtems_nanotime( struct timespec *ts )
>> +{
>> +  _Timecounter_Nanotime( ts );
>> +}
>> +
>> +RTEMS_INLINE_ROUTINE void rtems_microtime( struct timeval *tv )
>> +{
>> +  _Timecounter_Microtime( tv );
>> +}
>> +
>> +RTEMS_INLINE_ROUTINE void rtems_binuptime( struct bintime *bt )
>> +{
>> +  _Timecounter_Binuptime( bt );
>> +}
>> +
>> +RTEMS_INLINE_ROUTINE void rtems_nanouptime( struct timespec *ts )
>> +{
>> +  _Timecounter_Nanouptime( ts );
>> +}
>> +
>> +RTEMS_INLINE_ROUTINE void rtems_microuptime( struct timeval *tv )
>> +{
>> +  _Timecounter_Microuptime( tv );
>> +}
>> +
>> +RTEMS_INLINE_ROUTINE void rtems_getbintime( struct bintime *bt )
>> +{
>> +  _Timecounter_Getbintime( bt );
>> +}
>> +
>> +RTEMS_INLINE_ROUTINE void rtems_getnanotime( struct timespec *ts )
>> +{
>> +  _Timecounter_Getnanotime( ts );
>> +}
>> +
>> +RTEMS_INLINE_ROUTINE void rtems_getmicrotime( struct timeval *tv )
>> +{
>> +  _Timecounter_Getmicrotime( tv );
>> +}
>> +
>> +RTEMS_INLINE_ROUTINE void rtems_getbinuptime( struct bintime *bt )
>> +{
>> +  _Timecounter_Getbinuptime( bt );
>> +}
>> +
>> +RTEMS_INLINE_ROUTINE void rtems_getnanouptime( struct timespec *ts )
>> +{
>> +  _Timecounter_Getnanouptime( ts );
>> +}
>> +
>> +RTEMS_INLINE_ROUTINE void rtems_getmicrouptime( struct timeval *tv )
>> +{
>> +  _Timecounter_Getmicrouptime( tv );
>> +}
>> +
>> +#ifdef __cplusplus
>> +}
>> +#endif /* __cplusplus */
>> +
>> +#endif /* _RTEMS_TIMECOUNTER_H */
>> diff --git a/cpukit/sapi/preinstall.am b/cpukit/sapi/preinstall.am
>> index 3f864bb..4509842 100644
>> --- a/cpukit/sapi/preinstall.am
>> +++ b/cpukit/sapi/preinstall.am
>> @@ -82,6 +82,10 @@ $(PROJECT_INCLUDE)/rtems/sptables.h: include/rtems/sptables.h $(PROJECT_INCLUDE)
>>         $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/sptables.h
>>  PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/sptables.h
>>
>> +$(PROJECT_INCLUDE)/rtems/timecounter.h: include/rtems/timecounter.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
>> +       $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/timecounter.h
>> +PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/timecounter.h
>> +
>>  $(PROJECT_INCLUDE)/rtems/timespec.h: include/rtems/timespec.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
>>         $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/timespec.h
>>  PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/timespec.h
>> diff --git a/cpukit/sapi/src/exinit.c b/cpukit/sapi/src/exinit.c
>> index 235ba77..5c265a6 100644
>> --- a/cpukit/sapi/src/exinit.c
>> +++ b/cpukit/sapi/src/exinit.c
>> @@ -44,6 +44,7 @@
>>  #include <rtems/score/priority.h>
>>  #include <rtems/score/schedulerimpl.h>
>>  #include <rtems/score/smpimpl.h>
>> +#include <rtems/score/timecounter.h>
>>  #include <rtems/score/threadimpl.h>
>>  #include <rtems/score/todimpl.h>
>>  #include <rtems/score/userextimpl.h>
>> @@ -69,6 +70,8 @@ void rtems_initialize_data_structures(void)
>>     *           are disabled by boot_card().
>>     */
>>
>> +    _Timecounter_Initialize();
>> +
>>    #if defined(RTEMS_MULTIPROCESSING)
>>      /*
>>       *  Initialize the system state based on whether this is an MP system.
>> diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am
>> index 55fdc99..596df68 100644
>> --- a/cpukit/score/Makefile.am
>> +++ b/cpukit/score/Makefile.am
>> @@ -94,7 +94,8 @@ include_rtems_score_HEADERS += include/rtems/score/threadqimpl.h
>>  include_rtems_score_HEADERS += include/rtems/score/threadsync.h
>>  include_rtems_score_HEADERS += include/rtems/score/timespec.h
>>  include_rtems_score_HEADERS += include/rtems/score/timestamp.h
>> -include_rtems_score_HEADERS += include/rtems/score/timestamp64.h
>> +include_rtems_score_HEADERS += include/rtems/score/timecounter.h
>> +include_rtems_score_HEADERS += include/rtems/score/timecounterimpl.h
>>  include_rtems_score_HEADERS += include/rtems/score/tls.h
>>  include_rtems_score_HEADERS += include/rtems/score/tod.h
>>  include_rtems_score_HEADERS += include/rtems/score/todimpl.h
>> @@ -317,18 +318,10 @@ libscore_a_SOURCES += src/timespecaddto.c src/timespecfromticks.c \
>>      src/timespecsubtract.c src/timespectoticks.c src/timespecdivide.c \
>>      src/timespecdividebyinteger.c src/timespecgetasnanoseconds.c
>>
>> -## TIMESTAMP_INT64_C_FILES
>> -libscore_a_SOURCES += src/ts64addto.c \
>> -    src/ts64divide.c src/ts64equalto.c \
>> -    src/ts64getnanoseconds.c src/ts64getseconds.c \
>> -    src/ts64lessthan.c \
>> -    src/ts64set.c src/ts64settozero.c src/ts64subtract.c \
>> -    src/ts64totimespec.c src/ts64totimeval.c
>> -
>>  ## TOD_C_FILES
>> -libscore_a_SOURCES += src/coretod.c src/coretodset.c src/coretodget.c \
>> -    src/coretodgetuptimetimespec.c src/coretodtickle.c \
>> -    src/coretodsecondssinceepoch.c src/coretodtickspersec.c \
>> +libscore_a_SOURCES += src/coretod.c src/coretodset.c \
>> +    src/coretodtickle.c \
>> +    src/coretodtickspersec.c \
>>      src/coretodadjust.c
>>
>>  ## WATCHDOG_C_FILES
>> @@ -353,6 +346,7 @@ libscore_a_SOURCES += src/once.c
>>  libscore_a_SOURCES += src/resourceiterate.c
>>  libscore_a_SOURCES += src/smpbarrierwait.c
>>  libscore_a_SOURCES += src/kern_tc.c
>> +libscore_a_SOURCES += src/tcgetscalerandmask.c
>>
>>  EXTRA_DIST = src/Unlimited.txt
>>
>> diff --git a/cpukit/score/include/rtems/score/timecounter.h b/cpukit/score/include/rtems/score/timecounter.h
>> index 3744a76..bae5851 100644
>> --- a/cpukit/score/include/rtems/score/timecounter.h
>> +++ b/cpukit/score/include/rtems/score/timecounter.h
>> @@ -1,23 +1,52 @@
>> +/*
>> + * Copyright (c) 2015 embedded brains GmbH.  All rights reserved.
>> + *
>> + *  embedded brains GmbH
>> + *  Dornierstr. 4
>> + *  82178 Puchheim
>> + *  Germany
>> + *  <rtems at embedded-brains.de>
>> + *
>> + * The license and distribution terms for this file may be
>> + * found in the file LICENSE in this distribution or at
>> + * http://www.rtems.org/license/LICENSE.
>> + */
>> +
>> +#ifndef _RTEMS_SCORE_TIMECOUNTER_H
>> +#define _RTEMS_SCORE_TIMECOUNTER_H
>>
>>  #include <sys/time.h>
>>
>> -void _Timecounter_Initialize(void);
>> +#ifdef __cplusplus
>> +extern "C" {
>> +#endif /* __cplusplus */
>> +
>> +void _Timecounter_Bintime( struct bintime *bt );
>> +
>> +void _Timecounter_Nanotime( struct timespec *ts );
>> +
>> +void _Timecounter_Microtime( struct timeval *tv );
>> +
>> +void _Timecounter_Binuptime( struct bintime *bt );
>> +
>> +void _Timecounter_Nanouptime( struct timespec *ts );
>> +
>> +void _Timecounter_Microuptime( struct timeval *tv );
>> +
>> +void _Timecounter_Getbintime( struct bintime *bt );
>> +
>> +void _Timecounter_Getnanotime( struct timespec *ts );
>> +
>> +void _Timecounter_Getmicrotime( struct timeval *tv );
>>
>> -void _Timecounter_Set_clock(const struct timespec *ts);
>> +void _Timecounter_Getbinuptime( struct bintime *bt );
>>
>> -void _Timecounter_Ticktock(int cnt);
>> +void _Timecounter_Getnanouptime( struct timespec *ts );
>>
>> -void rtems_bintime(struct bintime *bt);
>> -void rtems_nanotime(struct timespec *tsp);
>> -void rtems_microtime(struct timeval *tvp);
>> -void rtems_binuptime(struct bintime *bt);
>> -void rtems_nanouptime(struct timespec *tsp);
>> -void rtems_microuptime(struct timeval *tvp);
>> -void rtems_getbintime(struct bintime *bt);
>> -void rtems_getnanotime(struct timespec *tsp);
>> -void rtems_getmicrotime(struct timeval *tvp);
>> -void rtems_getbinuptime(struct bintime *bt);
>> -void rtems_getnanouptime(struct timespec *tsp);
>> -void rtems_getmicrouptime(struct timeval *tvp);
>> +void _Timecounter_Getmicrouptime( struct timeval *tv );
>>
>> +#ifdef __cplusplus
>> +}
>> +#endif /* __cplusplus */
>>
>> +#endif /* _RTEMS_SCORE_TIMECOUNTER_H */
>> diff --git a/cpukit/score/include/rtems/score/timecounterimpl.h b/cpukit/score/include/rtems/score/timecounterimpl.h
>> new file mode 100644
>> index 0000000..5987672
>> --- /dev/null
>> +++ b/cpukit/score/include/rtems/score/timecounterimpl.h
>> @@ -0,0 +1,119 @@
>> +/*
>> + * Copyright (c) 2015 embedded brains GmbH.  All rights reserved.
>> + *
>> + *  embedded brains GmbH
>> + *  Dornierstr. 4
>> + *  82178 Puchheim
>> + *  Germany
>> + *  <rtems at embedded-brains.de>
>> + *
>> + * The license and distribution terms for this file may be
>> + * found in the file LICENSE in this distribution or at
>> + * http://www.rtems.org/license/LICENSE.
>> + */
>> +
>> +#ifndef _RTEMS_SCORE_TIMECOUNTERIMPL_H
>> +#define _RTEMS_SCORE_TIMECOUNTERIMPL_H
>> +
>> +#include <rtems/score/timecounter.h>
>> +#include <sys/timetc.h>
>> +
>> +#ifdef __cplusplus
>> +extern "C" {
>> +#endif /* __cplusplus */
>> +
>> +#define TIMECOUNTER_DEFAULT_DRIVER_QUALITY 100
>> +
>> +/**
>> + *  @brief Starts the initialization of the timecounter.
>> + *
>> + *  This routine sets hardclock ticks per milliseconds and assigns to the
>> + *  timecounters where to get the timecount information for each windup() call.
>> + *
>> + */
>> +void _Timecounter_Initialize(void);
>> +
>> +/**
>> + *  @brief Sets the clock of the timecounter.
>> + *
>> + *  This routine converts an input timespec into a bintime which is then set in
>> + *  the timecounter.
>> + *
>> + *  @param[in] ts is a timespec for conversion.
>> + */
>> +void _Timecounter_Set_clock(const struct timespec *ts);
>> +
>> +/**
>> + *  @brief Sets up the ring of timecounters.
>> + *
>> + *  This routine installs a "ring" of minimum one timecounter in the format of
>> + *  the input and calls the windup function afterwards.
>> + *
>> + *  @param[in] tc is the timecounter instance of which the ring should be
>> + *  created.
>> + *
>> + *  @code tc->tc_next = timecounters;
>> + *        timecounters = tc;
>> + *        ...
>> + *        (void)tc->tc_get_timecount(tc);
>> + *        ...
>> + *        tc_windup();
>> + *  @endcode
>> + */
>> +void _Timecounter_Install(struct timecounter *tc);
>> +
>> +/**
>> + *  @brief Interrupt Routine that triggers a windup call.
>> + *
>> + *  Usage for timecount registers that run on binary basis.
>> + */
>> +
>> +void _Timecounter_Tick(void);
>> +
>> +/**
>> + *  @brief Interrupt Routine that cannot trigger a windup call.
>> + *
>> + *  This routine is needed for a get_timecounter request where the information
>> + *  is received from a real time clock register that does not offer a binary
>> + *  basis. Here the bintime offset is generated by giving the delta and offset
>> + *  parameters as inputs.
>> + *
>> + *  @param[in] delta is one timecounter interval + time from the start of the
>> + *  new interval.
>> + *  @param[in] offset is the time from the start of the new interval.
>> + *
>> + *  @code
>> + *  th = timehands;
>> + *  ogen = th->th_generation;
>> + *  th->th_offset_count = offset;
>> + *  bintime_addx(&th->th_offset, th->th_scale * delta);
>> + *  @endcode
>> + */
>> +
>> +void _Timecounter_Tick_simple(u_int delta, u_int offset);
>> +
>> +/**
>> + *  @brief creates scaler and mask for _Timecounter_Tick_simple.
>> + *
>> + *  Calculates the scaler and mask of the next upcoming power of 2. The scaler
>> + *  is the next power of 2 divided by the counter_ticks_per_clock_ticks. The
>> + *  mask is double the next power of 2 minus 1, as the timecounter can return a
>> + *  maximum value of the length of two intervals.
>> + *
>> + *  @param[in] counter_ticks_per_clock_tick
>> + *  @param[out] scaler is the value of the scaling factor which has to imposed
>> + *  on the values returned by the get_timecount information
>> + *  @param[out] mask is the value of double the next power of 2 minus 1
>> + */
>> +
>> +void _Timecounter_Get_binary_scaler_and_mask(
>> +  uint32_t  counter_ticks_per_clock_tick,
>> +  uint64_t *scaler,
>> +  uint32_t *mask
>> +);
>> +
>> +#ifdef __cplusplus
>> +}
>> +#endif /* __cplusplus */
>> +
>> +#endif /* _RTEMS_SCORE_TIMECOUNTERIMPL_H */
>> diff --git a/cpukit/score/include/rtems/score/timestamp.h b/cpukit/score/include/rtems/score/timestamp.h
>> index dbd0425..056976b 100644
>> --- a/cpukit/score/include/rtems/score/timestamp.h
>> +++ b/cpukit/score/include/rtems/score/timestamp.h
>> @@ -42,55 +42,45 @@
>>
>>  #include <sys/time.h>
>>
>> -#include <rtems/score/cpu.h>
>> -#include <rtems/score/timespec.h>
>> +#include <rtems/score/basedefs.h>
>> +
>> +#include "timespec.h"
>>
>>  #ifdef __cplusplus
>>  extern "C" {
>>  #endif
>>
>> -#if ! ( ( CPU_TIMESTAMP_USE_STRUCT_TIMESPEC == TRUE \
>> -    && CPU_TIMESTAMP_USE_INT64 == FALSE \
>> -    && CPU_TIMESTAMP_USE_INT64_INLINE == FALSE ) \
>> -  || ( CPU_TIMESTAMP_USE_STRUCT_TIMESPEC == FALSE \
>> -    && CPU_TIMESTAMP_USE_INT64 == TRUE \
>> -    && CPU_TIMESTAMP_USE_INT64_INLINE == FALSE ) \
>> -  || ( CPU_TIMESTAMP_USE_STRUCT_TIMESPEC == FALSE \
>> -    && CPU_TIMESTAMP_USE_INT64 == FALSE \
>> -    && CPU_TIMESTAMP_USE_INT64_INLINE == TRUE ) )
>> -  #error "Invalid SuperCore Timestamp implementations selection."
>> -#endif
>> -
>> -#if CPU_TIMESTAMP_USE_INT64 == TRUE || CPU_TIMESTAMP_USE_INT64_INLINE == TRUE
>> -  #include <rtems/score/timestamp64.h>
>> -#endif
>> +#define MICROSECONDS_PER_SECOND 1000000
>> +#define NANOSECONDS_PER_SECOND 1000000000
>>
>>  /**
>>   *   Define the Timestamp control type.
>>   */
>> -#if CPU_TIMESTAMP_USE_STRUCT_TIMESPEC == TRUE
>> -  typedef struct timespec Timestamp_Control;
>> -#else
>> -  typedef Timestamp64_Control Timestamp_Control;
>> -#endif
>> +typedef struct bintime Timestamp_Control;
>>
>>  /**
>>   *  @brief Set timestamp to specified seconds and nanoseconds.
>>   *
>> - *  This method sets the timestamp to the specified @a _seconds and @a _nanoseconds
>> - *  value.
>> + *  This method sets the timestamp to the specified @a _seconds and
>> + *  @a _nanoseconds value.
>>   *
>>   *  @param[in] _time points to the timestamp instance to validate.
>>   *  @param[in] _seconds is the seconds portion of the timestamp
>>   *  @param[in] _nanoseconds is the nanoseconds portion of the timestamp
>>   */
>> -#if CPU_TIMESTAMP_USE_STRUCT_TIMESPEC == TRUE
>> -  #define _Timestamp_Set( _time, _seconds, _nanoseconds ) \
>> -          _Timespec_Set( _time, _seconds, _nanoseconds )
>> -#else
>> -  #define _Timestamp_Set( _time, _seconds, _nanoseconds ) \
>> -         _Timestamp64_Set( _time, _seconds, _nanoseconds )
>> -#endif
>> +RTEMS_INLINE_ROUTINE void _Timestamp_Set(
>> +  Timestamp_Control *_time,
>> +  time_t _seconds,
>> +  long _nanoseconds
>> +)
>> +{
>> +  struct timespec _ts;
>> +
>> +  _ts.tv_sec = _seconds;
>> +  _ts.tv_nsec = _nanoseconds;
>> +
>> +  timespec2bintime(&_ts, _time);
>> +}
>>
>>  /**
>>   *  @brief Sets the timestamp to zero.
>> @@ -100,13 +90,14 @@ extern "C" {
>>   *
>>   *  @param[in] _time points to the timestamp instance to zero.
>>   */
>> -#if CPU_TIMESTAMP_USE_STRUCT_TIMESPEC == TRUE
>> -  #define _Timestamp_Set_to_zero( _time ) \
>> -          _Timespec_Set_to_zero( _time )
>> -#else
>> -  #define _Timestamp_Set_to_zero( _time ) \
>> -         _Timestamp64_Set_to_zero( _time )
>> -#endif
>> +
>> +RTEMS_INLINE_ROUTINE void _Timestamp_Set_to_zero(
>> +  Timestamp_Control *_time
>> +)
>> +{
>> +  _time->sec = 0;
>> +  _time->frac = 0;
>> +}
>>
>>  /**
>>   *  @brief Less than operator for timestamps.
>> @@ -119,13 +110,23 @@ extern "C" {
>>   *  @retval This method returns true if @a _lhs is less than the @a _rhs and
>>   *          false otherwise.
>>   */
>> -#if CPU_TIMESTAMP_USE_STRUCT_TIMESPEC == TRUE
>> -  #define _Timestamp_Less_than( _lhs, _rhs ) \
>> -          _Timespec_Less_than( _lhs, _rhs )
>> -#else
>> -  #define _Timestamp_Less_than( _lhs, _rhs ) \
>> -         _Timestamp64_Less_than( _lhs, _rhs )
>> -#endif
>> +
>> +RTEMS_INLINE_ROUTINE bool _Timestamp_Less_than(
>> +  Timestamp_Control *_lhs, Timestamp_Control *_rhs
>> +)
>> +{
>> +  if ( _lhs->sec < _rhs->sec )
>> +    return true;
>> +
>> +  if ( _lhs->sec > _rhs->sec )
>> +    return false;
>> +
>> +  /* assert: lhs->tv_sec == rhs->tv_sec */
>> +  if ( _lhs->frac < _rhs->frac)
>> +    return true;
>> +
>> +  return false;
>> +}
>>
>>  /**
>>   *  @brief Greater than operator for timestamps.
>> @@ -138,8 +139,23 @@ extern "C" {
>>   *  @retval This method returns true if @a _lhs is greater than the @a _rhs and
>>   *          false otherwise.
>>   */
>> -#define _Timestamp_Greater_than( _lhs, _rhs ) \
>> -  _Timestamp_Less_than( _rhs, _lhs )
>> +
>> +RTEMS_INLINE_ROUTINE bool _Timestamp_Greater_than(
>> +  Timestamp_Control *_lhs, Timestamp_Control *_rhs
>> +)
>> +{
>> +  if ( _lhs->sec > _rhs->sec )
>> +    return true;
>> +
>> +  if ( _lhs->sec < _rhs->sec )
>> +    return false;
>> +
>> +  /* assert: lhs->tv_sec == rhs->tv_sec */
>> +  if ( _lhs->frac > _rhs->frac)
>> +    return true;
>> +
>> +  return false;
>> +}
>>
>>  /**
>>   *  @brief Equal to than operator for timestamps.
>> @@ -152,13 +168,16 @@ extern "C" {
>>   *  @retval This method returns true if @a _lhs is equal to  @a _rhs and
>>   *          false otherwise.
>>   */
>> -#if CPU_TIMESTAMP_USE_STRUCT_TIMESPEC == TRUE
>> -  #define _Timestamp_Equal_to( _lhs, _rhs ) \
>> -          _Timespec_Equal_to( _lhs, _rhs )
>> -#else
>> -  #define _Timestamp_Equal_to( _lhs, _rhs ) \
>> -         _Timestamp64_Equal_to( _lhs, _rhs )
>> -#endif
>> +
>> +RTEMS_INLINE_ROUTINE bool _Timestamp_Equal_to(
>> +  Timestamp_Control *_lhs, Timestamp_Control *_rhs
>> +)
>> +{
>> +  if (( _lhs->sec < _rhs->sec) && (_lhs->frac == _rhs->frac))
>> +    return true;
>> +
>> +  return false;
>> +}
>>
>>  /**
>>   *  @brief Adds two timestamps.
>> @@ -171,13 +190,15 @@ extern "C" {
>>   *
>>   *  @retval This method returns the number of seconds @a time increased by.
>>   */
>> -#if CPU_TIMESTAMP_USE_STRUCT_TIMESPEC == TRUE
>> -  #define _Timestamp_Add_to( _time, _add ) \
>> -          _Timespec_Add_to( _time, _add )
>> -#else
>> -  #define _Timestamp_Add_to( _time, _add ) \
>> -         _Timestamp64_Add_to( _time, _add )
>> -#endif
>> +RTEMS_INLINE_ROUTINE time_t _Timestamp_Add_to(
>> +  Timestamp_Control *_time,
>> +  const Timestamp_Control *_add
>> +)
>> +{
>> +  time_t seconds = _time->sec;
>> +  bintime_add(_time, _add);
>> +  return ((_time->sec) - seconds);
>> +}
>>
>>  /**
>>   *  @brief Subtracts two timestamps.
>> @@ -192,13 +213,17 @@ extern "C" {
>>   *
>>   *  @retval This method fills in @a _result.
>>   */
>> -#if CPU_TIMESTAMP_USE_STRUCT_TIMESPEC == TRUE
>> -  #define _Timestamp_Subtract( _start, _end, _result ) \
>> -          _Timespec_Subtract( _start, _end, _result )
>> -#else
>> -  #define _Timestamp_Subtract( _start, _end, _result ) \
>> -         _Timestamp64_Subtract( _start, _end, _result )
>> -#endif
>> +RTEMS_INLINE_ROUTINE void _Timestamp_Subtract(
>> +  const Timestamp_Control *_start,
>> +  const Timestamp_Control *_end,
>> +  Timestamp_Control       *_result
>> +)
>> +{
>> +  _result->sec = _end->sec;
>> +  _result->frac = _end->frac;
>> +
>> +  bintime_sub(_result, _start);
>> +}
>>
>>  /**
>>   *  @brief Divides a timestamp by another timestamp.
>> @@ -213,13 +238,24 @@ extern "C" {
>>   *
>>   *  @retval This method fills in @a result.
>>   */
>> -#if CPU_TIMESTAMP_USE_STRUCT_TIMESPEC == TRUE
>> -  #define _Timestamp_Divide( _lhs, _rhs, _ival_percentage, _fval_percentage ) \
>> -          _Timespec_Divide( _lhs, _rhs, _ival_percentage, _fval_percentage )
>> -#else
>> -  #define _Timestamp_Divide( _lhs, _rhs, _ival_percentage, _fval_percentage ) \
>> -          _Timestamp64_Divide( _lhs, _rhs, _ival_percentage, _fval_percentage )
>> -#endif
>> +RTEMS_INLINE_ROUTINE void _Timestamp_Divide(
>> +  const Timestamp_Control *_lhs,
>> +  const Timestamp_Control *_rhs,
>> +  uint32_t              *_ival_percentage,
>> +  uint32_t              *_fval_percentage
>> +)
>> +{
>> +  struct timespec _time_left, _time_right;
>> +
>> +  bintime2timespec(_lhs, &_time_left);
>> +  bintime2timespec(_rhs, &_time_right);
>> +
>> +  _Timespec_Divide(&_time_left,
>> +                  &_time_right,
>> +                  _ival_percentage,
>> +                  _fval_percentage
>> +                  );
>> +}
>>
>>  /**
>>   *  @brief Get seconds portion of timestamp.
>> @@ -230,13 +266,12 @@ extern "C" {
>>   *
>>   *  @retval The seconds portion of @a _time.
>>   */
>> -#if CPU_TIMESTAMP_USE_STRUCT_TIMESPEC == TRUE
>> -  #define _Timestamp_Get_seconds( _time ) \
>> -          _Timespec_Get_seconds( _time )
>> -#else
>> -  #define _Timestamp_Get_seconds( _time ) \
>> -         _Timestamp64_Get_seconds( _time )
>> -#endif
>> +RTEMS_INLINE_ROUTINE time_t _Timestamp_Get_seconds(
>> +  const Timestamp_Control *_time
>> +)
>> +{
>> +  return _time->sec;
>> +}
>>
>>  /**
>>   *  @brief Get nanoseconds portion of timestamp.
>> @@ -247,13 +282,14 @@ extern "C" {
>>   *
>>   *  @retval The nanoseconds portion of @a _time.
>>   */
>> -#if CPU_TIMESTAMP_USE_STRUCT_TIMESPEC == TRUE
>> -  #define _Timestamp_Get_nanoseconds( _time ) \
>> -          _Timespec_Get_nanoseconds( _time )
>> -#else
>> -  #define _Timestamp_Get_nanoseconds( _time ) \
>> -         _Timestamp64_Get_nanoseconds( _time )
>> -#endif
>> +RTEMS_INLINE_ROUTINE uint32_t _Timestamp_Get_nanoseconds(
>> +  const Timestamp_Control *_time
>> +)
>> +{
>> +  struct timespec _ts;
>> +  bintime2timespec(_time, &_ts);
>> +  return _ts.tv_nsec;
>> +}
>>
>>  /**
>>   *  @brief Get the timestamp as nanoseconds.
>> @@ -261,16 +297,23 @@ extern "C" {
>>   *  This method returns the timestamp as nanoseconds.
>>   *
>>   *  @param[in] _time points to the timestamp
>> + *  @param[in] _nanoseconds adds nanoseconds since last tick
>>   *
>>   *  @retval The time in nanoseconds.
>>   */
>> -#if CPU_TIMESTAMP_USE_STRUCT_TIMESPEC == TRUE
>> -  #define _Timestamp_Get_As_nanoseconds( _timestamp, _nanoseconds ) \
>> -          _Timespec_Get_As_nanoseconds( _timestamp, _nanoseconds )
>> -#else
>> -  #define _Timestamp_Get_As_nanoseconds( _timestamp, _nanoseconds ) \
>> -         _Timestamp64_Get_As_nanoseconds( _timestamp, _nanoseconds )
>> -#endif
>> +RTEMS_INLINE_ROUTINE uint64_t _Timestamp_Get_As_nanoseconds(
>> +  const Timestamp_Control *_time,
>> +  const uint32_t _nanoseconds
>> +)
>> +{
>> +  struct timespec ts;
>> +  uint64_t overall_ns_val;
>> +
>> +  bintime2timespec(_time, &ts);
>> +  overall_ns_val = _Timespec_Get_As_nanoseconds(&ts, _nanoseconds);
>> +
>> +  return overall_ns_val;
>> +}
>>
>>  /**
>>   *  @brief Convert timestamp to struct timespec.
>> @@ -280,14 +323,13 @@ extern "C" {
>>   *  @param[in] _timestamp points to the timestamp
>>   *  @param[in] _timespec points to the timespec
>>   */
>> -#if CPU_TIMESTAMP_USE_STRUCT_TIMESPEC == TRUE
>> -  /* in this case we know they are the same type so use simple assignment */
>> -  #define _Timestamp_To_timespec( _timestamp, _timespec  ) \
>> -          *(_timespec) = *(_timestamp)
>> -#else
>> -  #define _Timestamp_To_timespec( _timestamp, _timespec  ) \
>> -         _Timestamp64_To_timespec( _timestamp, _timespec  )
>> -#endif
>> +RTEMS_INLINE_ROUTINE void _Timestamp_To_timespec(
>> +  const Timestamp_Control *_timestamp,
>> +  struct timespec *_timespec
>> +)
>> +{
>> +  bintime2timespec(_timestamp, _timespec);
>> +}
>>
>>  /**
>>   *  @brief Convert timestamp to struct timeval.
>> @@ -295,16 +337,13 @@ extern "C" {
>>   *  @param[in] _timestamp points to the timestamp
>>   *  @param[in] _timeval points to the timeval
>>   */
>> -#if CPU_TIMESTAMP_USE_STRUCT_TIMESPEC == TRUE
>> -  #define _Timestamp_To_timeval( _timestamp, _timeval  ) \
>> -    do { \
>> -      (_timeval)->tv_sec = (_timestamp)->tv_sec; \
>> -      (_timeval)->tv_usec = (_timestamp)->tv_nsec / 1000; \
>> -    } while (0)
>> -#else
>> -  #define _Timestamp_To_timeval( _timestamp, _timeval  ) \
>> -         _Timestamp64_To_timeval( _timestamp, _timeval  )
>> -#endif
>> +RTEMS_INLINE_ROUTINE void _Timestamp_To_timeval(
>> +  const Timestamp_Control *_timestamp,
>> +  struct timeval *_timeval
>> +)
>> +{
>> +  bintime2timeval(_timestamp, _timeval);
>> +}
>>
>>  #ifdef __cplusplus
>>  }
>> diff --git a/cpukit/score/include/rtems/score/timestamp64.h b/cpukit/score/include/rtems/score/timestamp64.h
>> deleted file mode 100644
>> index 39b4965..0000000
>> --- a/cpukit/score/include/rtems/score/timestamp64.h
>> +++ /dev/null
>> @@ -1,379 +0,0 @@
>> -/**
>> - *  @file  rtems/score/timestamp64.h
>> - *
>> - *  @brief Helpers for Manipulating 64-bit Integer Timestamps
>> - *
>> - *  This include file contains helpers for manipulating
>> - *  64-bit integer timestamps.
>> - */
>> -
>> -/*
>> - *  COPYRIGHT (c) 1989-2009.
>> - *  On-Line Applications Research Corporation (OAR).
>> - *
>> - *  The license and distribution terms for this file may be
>> - *  found in the file LICENSE in this distribution or at
>> - *  http://www.rtems.org/license/LICENSE.
>> - */
>> -
>> -#ifndef _RTEMS_SCORE_TIMESTAMP64_H
>> -#define _RTEMS_SCORE_TIMESTAMP64_H
>> -
>> -/**
>> - *  @defgroup SuperCoreTimestamp64 SuperCore Sixty-Four Bit Timestamps
>> - *
>> - *  @ingroup Score
>> - *
>> - *  This handler encapsulates functionality related to manipulating
>> - *  the 64 bit integer implementation of SuperCore Timestamps.
>> - */
>> -/**@{*/
>> -
>> -#ifdef __cplusplus
>> -extern "C" {
>> -#endif
>> -
>> -/*
>> - *  This .h file is not for general use.  It is an alternative
>> - *  implementation of Timestamps and should only be used that way.
>> - */
>> -#ifndef _RTEMS_SCORE_TIMESTAMP_H
>> -  #error "Should only be included by rtems/score/timestamp.h"
>> -#endif
>> -
>> -/*
>> - *  Verify something is defined.
>> - */
>> -#if CPU_TIMESTAMP_USE_INT64 != TRUE && CPU_TIMESTAMP_USE_INT64_INLINE != TRUE
>> -  #error "SuperCore Timestamp64 implementation included but not defined."
>> -#endif
>> -
>> -/**
>> - *   Define the Timestamp control type.
>> - */
>> -typedef int64_t Timestamp64_Control;
>> -
>> -static inline void _Timestamp64_implementation_Set(
>> -  Timestamp64_Control *_time,
>> -  Timestamp64_Control  _seconds,
>> -  Timestamp64_Control  _nanoseconds
>> -)
>> -{
>> -  *_time = _seconds * 1000000000L + _nanoseconds;
>> -}
>> -
>> -/**
>> - *  @brief Set 64-bit timestamp to seconds nanosecond.
>> - *
>> - *  This method sets the timestamp to the specified seconds and nanoseconds
>> - *  value.
>> - *
>> - *  @param[in] _time points to the timestamp instance to validate.
>> - *  @param[in] _seconds is the seconds portion of the timestamp
>> - *  @param[in] _nanoseconds is the nanoseconds portion of the timestamp
>> - */
>> -#if CPU_TIMESTAMP_USE_INT64_INLINE == TRUE
>> -  #define _Timestamp64_Set( _time, _seconds, _nanoseconds ) \
>> -    _Timestamp64_implementation_Set( _time, _seconds, _nanoseconds )
>> -#else
>> -  void _Timestamp64_Set(
>> -    Timestamp64_Control *_time,
>> -    Timestamp64_Control  _seconds,
>> -    Timestamp64_Control  _nanoseconds
>> -  );
>> -#endif
>> -
>> -static inline void _Timestamp64_implementation_Set_to_zero(
>> -  Timestamp64_Control *_time
>> -)
>> -{
>> -  *_time = 0;
>> -}
>> -
>> -/**
>> - *  @brief Sets the 64-bit timestamp to zero.
>> - *
>> - *  This method sets the timestamp to zero value.
>> - *
>> - *  @param[in] _time points to the timestamp instance to zero.
>> - */
>> -#if CPU_TIMESTAMP_USE_INT64_INLINE == TRUE
>> -  #define _Timestamp64_Set_to_zero( _time ) \
>> -    _Timestamp64_implementation_Set_to_zero( _time )
>> -#else
>> -  void _Timestamp64_Set_to_zero(
>> -    Timestamp64_Control *_time
>> -  );
>> -#endif
>> -
>> -static inline bool _Timestamp64_implementation_Less_than(
>> -  const Timestamp64_Control *_lhs,
>> -  const Timestamp64_Control *_rhs
>> -)
>> -{
>> -  return *_lhs < *_rhs;
>> -}
>> -
>> -/**
>> - *  @brief The "less than" operator for 64-bit timestamps.
>> - *
>> - *  This method is the less than operator for timestamps.
>> - *
>> - *  @param[in] _lhs points to the left hand side timestamp
>> - *  @param[in] _rhs points to the right hand side timestamp
>> - *
>> - *  @retval This method returns true if @a _lhs is less than the @a _rhs and
>> - *          false otherwise.
>> - */
>> -#if CPU_TIMESTAMP_USE_INT64_INLINE == TRUE
>> -  #define _Timestamp64_Less_than( _lhs, _rhs ) \
>> -    _Timestamp64_implementation_Less_than( _lhs, _rhs )
>> -#else
>> -  bool _Timestamp64_Less_than(
>> -    const Timestamp64_Control *_lhs,
>> -    const Timestamp64_Control *_rhs
>> -  );
>> -#endif
>> -
>> -static inline bool _Timestamp64_implementation_Equal_to(
>> -  const Timestamp64_Control *_lhs,
>> -  const Timestamp64_Control *_rhs
>> -)
>> -{
>> -  return *_lhs == *_rhs;
>> -}
>> -
>> -#define _Timestamp64_Greater_than( _lhs, _rhs ) \
>> -  _Timestamp64_Less_than( _rhs, _lhs )
>> -
>> -/**
>> - *  @brief The "equal to" operator for 64-bit timestamps.
>> - *
>> - *  This method is the is equal to than operator for timestamps.
>> - *
>> - *  @param[in] _lhs points to the left hand side timestamp
>> - *  @param[in] _rhs points to the right hand side timestamp
>> - *
>> - *  @retval This method returns true if @a _lhs is equal to  @a _rhs and
>> - *          false otherwise.
>> - */
>> -#if CPU_TIMESTAMP_USE_INT64_INLINE == TRUE
>> -  #define _Timestamp64_Equal_to( _lhs, _rhs ) \
>> -    _Timestamp64_implementation_Equal_to( _lhs, _rhs )
>> -#else
>> -  bool _Timestamp64_Equal_to(
>> -    const Timestamp64_Control *_lhs,
>> -    const Timestamp64_Control *_rhs
>> -  );
>> -#endif
>> -
>> -static inline void _Timestamp64_implementation_Add_to(
>> -  Timestamp64_Control       *_time,
>> -  const Timestamp64_Control *_add
>> -)
>> -{
>> -  *_time += *_add;
>> -}
>> -
>> -/**
>> - *  @brief Add two 64-bit timestamps.
>> - *
>> - *  This routine adds two timestamps.  The second argument is added
>> - *  to the first.
>> - *
>> - *  @param[in] _time points to the base time to be added to
>> - *  @param[in] _add points to the timestamp to add to the first argument
>> - *
>> - *  @retval This method returns the number of seconds @a time increased by.
>> - */
>> -#if CPU_TIMESTAMP_USE_INT64_INLINE == TRUE
>> -  #define _Timestamp64_Add_to( _time, _add ) \
>> -    _Timestamp64_implementation_Add_to( _time, _add )
>> -#else
>> -  void _Timestamp64_Add_to(
>> -    Timestamp64_Control       *_time,
>> -    const Timestamp64_Control *_add
>> -  );
>> -#endif
>> -
>> -static inline void _Timestamp64_implementation_Subtract(
>> -  const Timestamp64_Control *_start,
>> -  const Timestamp64_Control *_end,
>> -  Timestamp64_Control       *_result
>> -)
>> -{
>> -  *_result = *_end - *_start;
>> -}
>> -
>> -/**
>> - *  @brief Subtract two 64-bit timestamps.
>> - *
>> - *  This routine subtracts two timestamps.  @a result is set to
>> - *  @a end - @a start.
>> - *
>> - *  @param[in] _start points to the starting time
>> - *  @param[in] _end points to the ending time
>> - *  @param[out] _result points to the difference between
>> - *             starting and ending time.
>> - */
>> -#if CPU_TIMESTAMP_USE_INT64_INLINE == TRUE
>> -  #define _Timestamp64_Subtract( _start, _end, _result ) \
>> -    _Timestamp64_implementation_Subtract( _start, _end, _result )
>> -#else
>> -  void _Timestamp64_Subtract(
>> -    const Timestamp64_Control *_start,
>> -    const Timestamp64_Control *_end,
>> -    Timestamp64_Control       *_result
>> -  );
>> -#endif
>> -
>> -/**
>> - *  @brief Divide 64-bit timestamp by another 64-bit timestamp.
>> - *
>> - *  This routine divides a timestamp by another timestamp.  The
>> - *  intended use is for calculating percentages to three decimal points.
>> - *
>> - *  @param[in] _lhs points to the left hand number
>> - *  @param[in] _rhs points to the right hand number
>> - *  @param[out] _ival_percentage points to the integer portion of the average
>> - *  @param[out] _fval_percentage points to the thousandths of percentage
>> - */
>> -void _Timestamp64_Divide(
>> -  const Timestamp64_Control *_lhs,
>> -  const Timestamp64_Control *_rhs,
>> -  uint32_t                  *_ival_percentage,
>> -  uint32_t                  *_fval_percentage
>> -);
>> -
>> -static inline uint32_t _Timestamp64_implementation_Get_seconds(
>> -  const Timestamp64_Control *_time
>> -)
>> -{
>> -  return (uint32_t) (*_time / 1000000000L);
>> -}
>> -
>> -/**
>> - *  @brief Get seconds portion of a 64-bit timestamp.
>> - *
>> - *  This method returns the seconds portion of the specified timestamp
>> - *
>> - *  @param[in] _time points to the timestamp
>> - *
>> - *  @retval The seconds portion of @a _time.
>> - */
>> -#if CPU_TIMESTAMP_USE_INT64_INLINE == TRUE
>> -  #define _Timestamp64_Get_seconds( _time ) \
>> -    _Timestamp64_implementation_Get_seconds( _time )
>> -#else
>> -  uint32_t _Timestamp64_Get_seconds(
>> -    const Timestamp64_Control *_time
>> -  );
>> -#endif
>> -
>> -static inline uint32_t _Timestamp64_implementation_Get_nanoseconds(
>> -  const Timestamp64_Control *_time
>> -)
>> -{
>> -  return (uint32_t) (*_time % 1000000000L);
>> -}
>> -
>> -/**
>> - *  @brief Get nanoseconds portion of a 64-bit timestamp.
>> - *
>> - *  This method returns the nanoseconds portion of the specified timestamp
>> - *
>> - *  @param[in] _time points to the timestamp
>> - *
>> - *  @retval The nanoseconds portion of @a _time.
>> - */
>> -#if CPU_TIMESTAMP_USE_INT64_INLINE == TRUE
>> -  #define _Timestamp64_Get_nanoseconds( _time ) \
>> -    _Timestamp64_implementation_Get_nanoseconds( _time )
>> -#else
>> -  uint32_t _Timestamp64_Get_nanoseconds(
>> -    const Timestamp64_Control *_time
>> -  );
>> -#endif
>> -
>> -static inline uint64_t _Timestamp64_implementation_Get_As_nanoseconds(
>> -  const Timestamp64_Control *_time,
>> -  const uint32_t nanoseconds
>> -)
>> -{
>> -  return *_time + (uint64_t) nanoseconds;
>> -}
>> -
>> -/**
>> - *  @brief Get the 64-bit timestamp as nanoseconds.
>> - *
>> - *  This method returns the 64-bit timestamp as it is already in nanoseconds.
>> - *
>> - *  @param[in] _time points to the timestamp
>> - *
>> - *  @retval The nanoseconds portion of @a _time.
>> - */
>> -#define _Timestamp64_Get_As_nanoseconds( _time, _nanoseconds ) \
>> -  _Timestamp64_implementation_Get_As_nanoseconds( _time, _nanoseconds )
>> -
>> -static inline void _Timestamp64_implementation_To_timespec(
>> -  const Timestamp64_Control *_timestamp,
>> -  struct timespec           *_timespec
>> -)
>> -{
>> -  _timespec->tv_sec = (time_t) (*_timestamp / 1000000000L);
>> -  _timespec->tv_nsec = (long) (*_timestamp % 1000000000L);
>> -}
>> -
>> -/**
>> - *  @brief Convert 64-bit timestamp to struct timespec.
>> - *
>> - *  This method returns the seconds portion of the specified timestamp
>> - *
>> - *  @param[in] _timestamp points to the timestamp
>> - *  @param[out] _timespec points to the timespec
>> - */
>> -#if CPU_TIMESTAMP_USE_INT64_INLINE == TRUE
>> -  #define _Timestamp64_To_timespec( _timestamp, _timespec  ) \
>> -    _Timestamp64_implementation_To_timespec( _timestamp, _timespec )
>> -#else
>> -  void _Timestamp64_To_timespec(
>> -    const Timestamp64_Control *_timestamp,
>> -    struct timespec           *_timespec
>> -  );
>> -#endif
>> -
>> -static inline void _Timestamp64_implementation_To_timeval(
>> -  const Timestamp64_Control *_timestamp,
>> -  struct timeval            *_timeval
>> -)
>> -{
>> -  _timeval->tv_sec = (time_t) (*_timestamp / 1000000000U);
>> -  _timeval->tv_usec = (suseconds_t) ((*_timestamp % 1000000000U) / 1000U);
>> -}
>> -
>> -/**
>> - *  @brief Convert 64-bit timestamp to struct timeval.
>> - *
>> - *  This method returns the seconds portion of the specified timestamp
>> - *
>> - *  @param[in] _timestamp points to the timestamp
>> - *  @param[out] _timeval points to the timeval
>> - */
>> -#if CPU_TIMESTAMP_USE_INT64_INLINE == TRUE
>> -  #define _Timestamp64_To_timeval( _timestamp, _timeval  ) \
>> -    _Timestamp64_implementation_To_timeval( _timestamp, _timeval )
>> -#else
>> -  void _Timestamp64_To_timeval(
>> -    const Timestamp64_Control *_timestamp,
>> -    struct timeval            *_timeval
>> -  );
>> -#endif
>> -
>> -#ifdef __cplusplus
>> -}
>> -#endif
>> -
>> -/**@}*/
>> -
>> -#endif
>> -/* end of include file */
>> diff --git a/cpukit/score/include/rtems/score/tod.h b/cpukit/score/include/rtems/score/tod.h
>> index 1972b0f..c0ab5e7 100644
>> --- a/cpukit/score/include/rtems/score/tod.h
>> +++ b/cpukit/score/include/rtems/score/tod.h
>> @@ -24,15 +24,6 @@
>>  extern "C" {
>>  #endif
>>
>> -/**
>> - * @brief Returns the nanoseconds since the last clock tick.
>> - *
>> - * @ingroup ScoreTOD
>> - *
>> - * @return The nanoseconds since the last clock tick.
>> - */
>> -typedef uint32_t ( *TOD_Nanoseconds_since_last_tick_routine )( void );
>> -
>>  #ifdef __cplusplus
>>  }
>>  #endif
>> diff --git a/cpukit/score/include/rtems/score/todimpl.h b/cpukit/score/include/rtems/score/todimpl.h
>> index ad5ed39..4fe85d4 100644
>> --- a/cpukit/score/include/rtems/score/todimpl.h
>> +++ b/cpukit/score/include/rtems/score/todimpl.h
>> @@ -19,8 +19,8 @@
>>  #define _RTEMS_SCORE_TODIMPL_H
>>
>>  #include <rtems/score/tod.h>
>> -#include <rtems/score/isrlock.h>
>>  #include <rtems/score/timestamp.h>
>> +#include <rtems/score/timecounterimpl.h>
>>
>>  #include <sys/time.h>
>>  #include <time.h>
>> @@ -131,25 +131,6 @@ extern "C" {
>>   */
>>  typedef struct {
>>    /**
>> -   * @brief Current time of day value.
>> -   *
>> -   * This field is protected by the lock.
>> -   */
>> -  Timestamp_Control now;
>> -
>> -  /**
>> -   * @brief System uptime.
>> -   *
>> -   * This field is protected by the lock.
>> -   */
>> -  Timestamp_Control uptime;
>> -
>> -  /**
>> -   * @brief Lock to protect the now and uptime fields.
>> -   */
>> -  ISR_lock_Control lock;
>> -
>> -  /**
>>     * @brief Time of day seconds trigger.
>>     *
>>     * This value specifies the nanoseconds since the last time of day second.
>> @@ -159,13 +140,6 @@ typedef struct {
>>    uint32_t seconds_trigger;
>>
>>    /**
>> -   * @brief The current nanoseconds since last tick handler.
>> -   *
>> -   * This field must not be NULL after initialization.
>> -   */
>> -  TOD_Nanoseconds_since_last_tick_routine nanoseconds_since_last_tick;
>> -
>> -  /**
>>     *  @brief Indicates if the time of day is set.
>>     *
>>     *  This is true if the application has set the current
>> @@ -176,12 +150,6 @@ typedef struct {
>>
>>  SCORE_EXTERN TOD_Control _TOD;
>>
>> -#define _TOD_Acquire( _tod, lock_context ) \
>> -  _ISR_lock_ISR_disable_and_acquire( &( _tod )->lock, lock_context )
>> -
>> -#define _TOD_Release( _tod, lock_context ) \
>> -  _ISR_lock_Release_and_ISR_enable( &( _tod )->lock, lock_context )
>> -
>>  /**
>>   *  @brief Initializes the time of day handler.
>>   *
>> @@ -215,32 +183,18 @@ static inline void _TOD_Set(

>>    _TOD_Set_with_timestamp( &tod_as_timestamp );
>>  }
>>
>> -/**
>> - *  @brief Returns a snapshot of a clock.
>> - *
>> - *  This function invokes the nanoseconds extension.
>> - *
>> - *  @param[out] snapshot points to an area that will contain the current
>> - *              TOD plus the BSP nanoseconds since last tick adjustment
>> - *  @param[in] clock contains the current TOD
>> - *
>> - *  @retval @a snapshot
>> - */
>> -Timestamp_Control *_TOD_Get_with_nanoseconds(
>> -  Timestamp_Control *snapshot,
>> -  const Timestamp_Control *clock
>> -);
>> -
>>  static inline void _TOD_Get(
>> -  struct timespec *tod_as_timespec
>> +  Timestamp_Control *time
>>  )
>>  {
>> -  Timestamp_Control  tod_as_timestamp;
>> -  Timestamp_Control *tod_as_timestamp_ptr;
>> +  _Timecounter_Bintime(time);
>> +}
>>
>> -  tod_as_timestamp_ptr =
>> -    _TOD_Get_with_nanoseconds( &tod_as_timestamp, &_TOD.now );
>> -  _Timestamp_To_timespec( tod_as_timestamp_ptr, tod_as_timespec );
>> +static inline void _TOD_Get_as_timespec(
>> +  struct timespec *time
>> +)
>> +{
>> +  _Timecounter_Nanotime(time);
>>  }
>>
>>  /**
>> @@ -255,7 +209,7 @@ static inline void _TOD_Get_uptime(
>>    Timestamp_Control *time
>>  )
>>  {
>> -  _TOD_Get_with_nanoseconds( time, &_TOD.uptime );
>> +  _Timecounter_Binuptime(time);
>>  }
>>
>>  /**
>> @@ -266,9 +220,12 @@ static inline void _TOD_Get_uptime(
>>   *
>>   *  @param[in] time is a pointer to the uptime to be returned
>>   */
>> -void _TOD_Get_uptime_as_timespec(
>> +static inline void _TOD_Get_uptime_as_timespec(
>>    struct timespec *time
>> -);
>> +)
>> +{
>> +  _Timecounter_Nanouptime(time);
>> +}
>>
>>  /**
>>   *  @brief Number of seconds Since RTEMS epoch.
>> @@ -276,7 +233,14 @@ void _TOD_Get_uptime_as_timespec(
>>   *  The following contains the number of seconds from 00:00:00
>>   *  January 1, TOD_BASE_YEAR until the current time of day.
>>   */
>> -uint32_t _TOD_Seconds_since_epoch( void );
>> +static inline uint32_t _TOD_Seconds_since_epoch( void )
>> +{
>> +  struct bintime bt;
>> +
>> +  _Timecounter_Bintime(&bt);
>> +
>> +  return bt.sec;
>> +}
>>
>>  /**
>>   *  @brief Increments time of day at each clock tick.
>> @@ -314,12 +278,7 @@ RTEMS_INLINE_ROUTINE void _TOD_Get_timeval(
>>    struct timeval *time
>>  )
>>  {
>> -  Timestamp_Control  snapshot_as_timestamp;
>> -  Timestamp_Control *snapshot_as_timestamp_ptr;
>> -
>> -  snapshot_as_timestamp_ptr =
>> -    _TOD_Get_with_nanoseconds( &snapshot_as_timestamp, &_TOD.now );
>> -  _Timestamp_To_timeval( snapshot_as_timestamp_ptr, time );
>> +  _Timecounter_Microtime(time);
>>  }
>>
>>  /**
>> @@ -335,18 +294,6 @@ void _TOD_Adjust(
>>  );
>>
>>  /**
>> - * @brief Install the BSP's nanoseconds since clock tick handler
>> - *
>> - * @param[in] routine is the BSP's nanoseconds since clock tick method
>> - */
>> -RTEMS_INLINE_ROUTINE void _TOD_Set_nanoseconds_since_last_tick_handler(
>> -  TOD_Nanoseconds_since_last_tick_routine routine
>> -)
>> -{
>> -  _TOD.nanoseconds_since_last_tick = routine;
>> -}
>> -
>> -/**
>>   * @brief Check if the TOD is Set
>>   *
>>   * @return TRUE is the time is set. FALSE otherwise.
>> diff --git a/cpukit/score/preinstall.am b/cpukit/score/preinstall.am
>> index 75c8be6..b74afb8 100644
>> --- a/cpukit/score/preinstall.am
>> +++ b/cpukit/score/preinstall.am
>> @@ -348,9 +348,13 @@ $(PROJECT_INCLUDE)/rtems/score/timestamp.h: include/rtems/score/timestamp.h $(PR
>>         $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/timestamp.h
>>  PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/timestamp.h
>>
>> -$(PROJECT_INCLUDE)/rtems/score/timestamp64.h: include/rtems/score/timestamp64.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
>> -       $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/timestamp64.h
>> -PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/timestamp64.h
>> +$(PROJECT_INCLUDE)/rtems/score/timecounter.h: include/rtems/score/timecounter.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
>> +       $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/timecounter.h
>> +PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/timecounter.h
>> +
>> +$(PROJECT_INCLUDE)/rtems/score/timecounterimpl.h: include/rtems/score/timecounterimpl.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
>> +       $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/timecounterimpl.h
>> +PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/timecounterimpl.h
>>
>>  $(PROJECT_INCLUDE)/rtems/score/tls.h: include/rtems/score/tls.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
>>         $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/tls.h
>> diff --git a/cpukit/score/src/coretod.c b/cpukit/score/src/coretod.c
>> index 2deeeba..67d5104 100644
>> --- a/cpukit/score/src/coretod.c
>> +++ b/cpukit/score/src/coretod.c
>> @@ -20,23 +20,15 @@
>>
>>  #include <rtems/score/todimpl.h>
>>
>> -static uint32_t _TOD_Nanoseconds_since_tick_default_handler( void )
>> -{
>> -  return 0;
>> -}
>> -
>>  void _TOD_Handler_initialization(void)
>>  {
>> +  struct timespec ts;
>>    TOD_Control *tod = &_TOD;
>>
>> -  _ISR_lock_Initialize( &tod->lock, "TOD" );
>> -
>> -  _Timestamp_Set( &tod->now, TOD_SECONDS_1970_THROUGH_1988, 0 );
>> -
>> -  _Timestamp_Set_to_zero( &tod->uptime );
>> -
>> -  tod->nanoseconds_since_last_tick =
>> -    _TOD_Nanoseconds_since_tick_default_handler;
>> +  ts.tv_sec = TOD_SECONDS_1970_THROUGH_1988;
>> +  ts.tv_nsec = 0;
>> +  _Timecounter_Initialize();
>> +  _Timecounter_Set_clock(&ts);
>>
>>    /* TOD has not been set */
>>    tod->is_set = false;
>> diff --git a/cpukit/score/src/coretodadjust.c b/cpukit/score/src/coretodadjust.c
>> index 09cf01a..6097e20 100644
>> --- a/cpukit/score/src/coretodadjust.c
>> +++ b/cpukit/score/src/coretodadjust.c
>> @@ -25,8 +25,7 @@ void _TOD_Adjust(
>>    const Timestamp_Control delta
>>  )
>>  {
>> -  Timestamp_Control  tod;
>> -  Timestamp_Control *tod_ptr;
>> +  Timestamp_Control tod;
>>
>>    /*
>>     * Currently, RTEMS does the adjustment in one movement.
>> @@ -41,11 +40,11 @@ void _TOD_Adjust(
>>     */
>>    _Thread_Disable_dispatch();
>>
>> -    tod_ptr = _TOD_Get_with_nanoseconds( &tod, &_TOD.now );
>> +    _TOD_Get( &tod );
>>
>> -    _Timestamp_Add_to( tod_ptr, &delta );
>> +    _Timestamp_Add_to( &tod, &delta );
>>
>> -    _TOD_Set_with_timestamp( tod_ptr );
>> +    _TOD_Set_with_timestamp( &tod );
>>
>>    _Thread_Enable_dispatch();
>>  }
>> diff --git a/cpukit/score/src/coretodget.c b/cpukit/score/src/coretodget.c
>> deleted file mode 100644
>> index 70eb238..0000000
>> --- a/cpukit/score/src/coretodget.c
>> +++ /dev/null
>> @@ -1,46 +0,0 @@
>> -/**
>> - * @file
>> - *
>> - * @brief Returns a Current TOD with Nanosecond Granularity
>> - * @ingroup ScoreTOD
>> - */
>> -
>> -/*
>> - *  COPYRIGHT (c) 1989-2014.
>> - *  On-Line Applications Research Corporation (OAR).
>> - *
>> - *  The license and distribution terms for this file may be
>> - *  found in the file LICENSE in this distribution or at
>> - *  http://www.rtems.org/license/LICENSE.
>> - */
>> -
>> -#if HAVE_CONFIG_H
>> -  #include "config.h"
>> -#endif
>> -
>> -#include <rtems/score/todimpl.h>
>> -#include <rtems/score/isrlevel.h>
>> -
>> -Timestamp_Control *_TOD_Get_with_nanoseconds(
>> -  Timestamp_Control *snapshot,
>> -  const Timestamp_Control *clock
>> -)
>> -{
>> -  TOD_Control      *tod = &_TOD;
>> -  ISR_lock_Context  lock_context;
>> -  Timestamp_Control offset;
>> -  Timestamp_Control now;
>> -  uint32_t          nanoseconds;
>> -
>> -  _TOD_Acquire( tod, &lock_context );
>> -    nanoseconds = ( *tod->nanoseconds_since_last_tick )();
>> -    now = *clock;
>> -  _TOD_Release( tod, &lock_context );
>> -
>> -  _Timestamp_Set( &offset, 0, nanoseconds );
>> -  _Timestamp_Add_to( &now, &offset );
>> -
>> -  *snapshot = now;
>> -
>> -  return snapshot;
>> -}
>> diff --git a/cpukit/score/src/coretodgetuptimetimespec.c b/cpukit/score/src/coretodgetuptimetimespec.c
>> deleted file mode 100644
>> index 5980b2f..0000000
>> --- a/cpukit/score/src/coretodgetuptimetimespec.c
>> +++ /dev/null
>> @@ -1,32 +0,0 @@
>> -/**
>> - * @file
>> - *
>> - * @brief Get Uptime as struct timespec
>> - * @ingroup ScoreTOD
>> - */
>> -
>> -/*
>> - *  COPYRIGHT (c) 1989-2014.
>> - *  On-Line Applications Research Corporation (OAR).
>> - *
>> - *  The license and distribution terms for this file may be
>> - *  found in the file LICENSE in this distribution or at
>> - *  http://www.rtems.org/license/LICENSE.
>> - */
>> -
>> -#if HAVE_CONFIG_H
>> -#include "config.h"
>> -#endif
>> -
>> -#include <rtems/score/todimpl.h>
>> -
>> -void _TOD_Get_uptime_as_timespec(
>> -  struct timespec *uptime
>> -)
>> -{
>> -  Timestamp_Control uptime_ts;
>> -
>> -  /* assume time checked for NULL by caller */
>> -  _TOD_Get_uptime( &uptime_ts );
>> -  _Timestamp_To_timespec( &uptime_ts, uptime );
>> -}
>> diff --git a/cpukit/score/src/coretodsecondssinceepoch.c b/cpukit/score/src/coretodsecondssinceepoch.c
>> deleted file mode 100644
>> index b7bd270..0000000
>> --- a/cpukit/score/src/coretodsecondssinceepoch.c
>> +++ /dev/null
>> @@ -1,32 +0,0 @@
>> -/*
>> - * Copyright (c) 2013 embedded brains GmbH.  All rights reserved.
>> - *
>> - *  embedded brains GmbH
>> - *  Dornierstr. 4
>> - *  82178 Puchheim
>> - *  Germany
>> - *  <rtems at embedded-brains.de>
>> - *
>> - * The license and distribution terms for this file may be
>> - * found in the file LICENSE in this distribution or at
>> - * http://www.rtems.org/license/LICENSE.
>> - */
>> -
>> -#if HAVE_CONFIG_H
>> -  #include "config.h"
>> -#endif
>> -
>> -#include <rtems/score/todimpl.h>
>> -
>> -uint32_t _TOD_Seconds_since_epoch( void )
>> -{
>> -  TOD_Control      *tod = &_TOD;
>> -  ISR_lock_Context  lock_context;
>> -  Timestamp_Control now;
>> -
>> -  _TOD_Acquire( tod, &lock_context );
>> -   now = tod->now;
>> -  _TOD_Release( tod, &lock_context );
>> -
>> -  return _Timestamp_Get_seconds( &now );
>> -}
>> diff --git a/cpukit/score/src/coretodset.c b/cpukit/score/src/coretodset.c
>> index 6006e66..8cff81c 100644
>> --- a/cpukit/score/src/coretodset.c
>> +++ b/cpukit/score/src/coretodset.c
>> @@ -27,10 +27,14 @@ void _TOD_Set_with_timestamp(
>>  )
>>  {
>>    TOD_Control *tod = &_TOD;
>> +  struct timespec ts;
>>    uint32_t nanoseconds = _Timestamp_Get_nanoseconds( tod_as_timestamp );
>>    Watchdog_Interval seconds_next = _Timestamp_Get_seconds( tod_as_timestamp );
>>    Watchdog_Interval seconds_now;
>> -  ISR_lock_Context lock_context;
>> +
>> +  bintime2timespec(tod_as_timestamp, &ts);
>> +  nanoseconds = ts.tv_nsec;
>> +  seconds_next = ts.tv_sec;
>>
>>    _Thread_Disable_dispatch();
>>
>> @@ -41,9 +45,7 @@ void _TOD_Set_with_timestamp(
>>    else
>>      _Watchdog_Adjust_seconds( WATCHDOG_FORWARD, seconds_next - seconds_now );
>>
>> -  _TOD_Acquire( tod, &lock_context );
>> -  tod->now = *tod_as_timestamp;
>> -  _TOD_Release( tod, &lock_context );
>> +  _Timecounter_Set_clock(&ts);
>>
>>    tod->seconds_trigger = nanoseconds;
>>    tod->is_set = true;
>> diff --git a/cpukit/score/src/coretodtickle.c b/cpukit/score/src/coretodtickle.c
>> index 9116fc1..3d7c71e 100644
>> --- a/cpukit/score/src/coretodtickle.c
>> +++ b/cpukit/score/src/coretodtickle.c
>> @@ -24,30 +24,10 @@
>>
>>  void _TOD_Tickle_ticks( void )
>>  {
>> -  TOD_Control       *tod = &_TOD;
>> -  ISR_lock_Context   lock_context;
>> -  Timestamp_Control  tick;
>> -  uint32_t           nanoseconds_per_tick;
>> -
>> -  nanoseconds_per_tick = rtems_configuration_get_nanoseconds_per_tick();
>> -
>> -  /* Convert the tick quantum to a timestamp */
>> -  _Timestamp_Set( &tick, 0, nanoseconds_per_tick );
>> -
>>    /* Update the counter of ticks since boot */
>>    _Watchdog_Ticks_since_boot += 1;
>>
>> -  _TOD_Acquire( tod, &lock_context );
>> -
>> -  /* Update the uptime */
>> -  _Timestamp_Add_to( &tod->uptime, &tick );
>> -
>> -  /* Update the current TOD */
>> -  _Timestamp_Add_to( &tod->now, &tick );
>> -
>> -  _TOD_Release( tod, &lock_context );
>> -
>> -  _TOD.seconds_trigger += nanoseconds_per_tick;
>> +  _TOD.seconds_trigger += rtems_configuration_get_nanoseconds_per_tick();
>>    if ( _TOD.seconds_trigger >= 1000000000UL ) {
>>      _TOD.seconds_trigger -= 1000000000UL;
>>      _Watchdog_Tickle_seconds();
>> diff --git a/cpukit/score/src/tcgetscalerandmask.c b/cpukit/score/src/tcgetscalerandmask.c
>> new file mode 100644
>> index 0000000..a2a2db4
>> --- /dev/null
>> +++ b/cpukit/score/src/tcgetscalerandmask.c
>> @@ -0,0 +1,40 @@
>> +/*
>> + * Copyright (c) 2015 embedded brains GmbH.  All rights reserved.
>> + *
>> + *  embedded brains GmbH
>> + *  Dornierstr. 4
>> + *  82178 Puchheim
>> + *  Germany
>> + *  <rtems at embedded-brains.de>
>> + *
>> + * The license and distribution terms for this file may be
>> + * found in the file LICENSE in this distribution or at
>> + * http://www.rtems.org/license/LICENSE.
>> + */
>> +
>> +#if HAVE_CONFIG_H
>> +  #include "config.h"
>> +#endif
>> +
>> +#include <rtems/score/timecounterimpl.h>
>> +
>> +void _Timecounter_Get_binary_scaler_and_mask(
>> +  uint32_t  counter_ticks_per_clock_tick,
>> +  uint64_t *scaler,
>> +  uint32_t *mask
>> +)
>> +{
>> +  uint32_t power_of_two = 1;
>> +  int i;
>> +
>> +  for ( i = 0; i < 32; ++i ) {
>> +    if ( power_of_two >= counter_ticks_per_clock_tick ) {
>> +      break;
>> +    }
>> +
>> +    power_of_two *= 2;
>> +  }
>> +
>> +  *mask = (2 * power_of_two) - 1;
>> +  *scaler = ((uint64_t) power_of_two << 32) / counter_ticks_per_clock_tick;
>> +}
>> diff --git a/cpukit/score/src/ts64addto.c b/cpukit/score/src/ts64addto.c
>> deleted file mode 100644
>> index a0f4b3c..0000000
>> --- a/cpukit/score/src/ts64addto.c
>> +++ /dev/null
>> @@ -1,31 +0,0 @@
>> -/**
>> - * @file score/src/ts64addto.c
>> - *
>> - * @brief Add to a Timestamp
>> - * @ingroup SuperCore
>> - */
>> -
>> -/*
>> - *  COPYRIGHT (c) 1989-2008.
>> - *  On-Line Applications Research Corporation (OAR).
>> - *
>> - *  The license and distribution terms for this file may be
>> - *  found in the file LICENSE in this distribution or at
>> - *  http://www.rtems.org/license/LICENSE.
>> - */
>> -
>> -#if HAVE_CONFIG_H
>> -#include "config.h"
>> -#endif
>> -
>> -#include <rtems/score/timestamp.h>
>> -
>> -#if CPU_TIMESTAMP_USE_INT64 == TRUE
>> -void _Timestamp64_Add_to(
>> -  Timestamp64_Control       *_time,
>> -  const Timestamp64_Control *_add
>> -)
>> -{
>> -  _Timestamp64_implementation_Add_to( _time, _add );
>> -}
>> -#endif
>> diff --git a/cpukit/score/src/ts64divide.c b/cpukit/score/src/ts64divide.c
>> deleted file mode 100644
>> index d9a5099..0000000
>> --- a/cpukit/score/src/ts64divide.c
>> +++ /dev/null
>> @@ -1,51 +0,0 @@
>> -/**
>> - *  @file
>> - *
>> - *  @brief Divide Timestamp
>> - *  @ingroup SuperCore
>> - */
>> -
>> -/*
>> - *  COPYRIGHT (c) 1989-2007.
>> - *  On-Line Applications Research Corporation (OAR).
>> - *
>> - *  The license and distribution terms for this file may be
>> - *  found in the file LICENSE in this distribution or at
>> - *  http://www.rtems.org/license/LICENSE.
>> - */
>> -
>> -#if HAVE_CONFIG_H
>> -#include "config.h"
>> -#endif
>> -
>> -#include <rtems/score/timestamp.h>
>> -
>> -/* This method is never inlined. */
>> -#if CPU_TIMESTAMP_USE_INT64 == TRUE || CPU_TIMESTAMP_USE_INT64_INLINE == TRUE
>> -void _Timestamp64_Divide(
>> -  const Timestamp64_Control *_lhs,
>> -  const Timestamp64_Control *_rhs,
>> -  uint32_t                  *_ival_percentage,
>> -  uint32_t                  *_fval_percentage
>> -)
>> -{
>> -  Timestamp64_Control answer;
>> -
>> -  if ( *_rhs == 0 ) {
>> -    *_ival_percentage = 0;
>> -    *_fval_percentage = 0;
>> -    return;
>> -  }
>> -
>> -  /*
>> -   *  This looks odd but gives the results the proper precision.
>> -   *
>> -   *  TODO: Rounding on the last digit of the fval.
>> -   */
>> -
>> -  answer = (*_lhs * 100000) / *_rhs;
>> -
>> -  *_ival_percentage = answer / 1000;
>> -  *_fval_percentage = answer % 1000;
>> -}
>> -#endif
>> diff --git a/cpukit/score/src/ts64equalto.c b/cpukit/score/src/ts64equalto.c
>> deleted file mode 100644
>> index fd07474..0000000
>> --- a/cpukit/score/src/ts64equalto.c
>> +++ /dev/null
>> @@ -1,31 +0,0 @@
>> -/**
>> - *  @file
>> - *
>> - *  @brief Timestamp equal to Operator
>> - *  @ingroup SuperCore
>> - */
>> -
>> -/*
>> - *  COPYRIGHT (c) 1989-2008.
>> - *  On-Line Applications Research Corporation (OAR).
>> - *
>> - *  The license and distribution terms for this file may be
>> - *  found in the file LICENSE in this distribution or at
>> - *  http://www.rtems.org/license/LICENSE.
>> - */
>> -
>> -#if HAVE_CONFIG_H
>> -#include "config.h"
>> -#endif
>> -
>> -#include <rtems/score/timestamp.h>
>> -
>> -#if CPU_TIMESTAMP_USE_INT64 == TRUE
>> -bool _Timestamp64_Equal_to(
>> -  const Timestamp64_Control *_lhs,
>> -  const Timestamp64_Control *_rhs
>> -)
>> -{
>> -  return _Timestamp64_implementation_Equal_to( _lhs, _rhs );
>> -}
>> -#endif
>> diff --git a/cpukit/score/src/ts64getnanoseconds.c b/cpukit/score/src/ts64getnanoseconds.c
>> deleted file mode 100644
>> index a5da43b..0000000
>> --- a/cpukit/score/src/ts64getnanoseconds.c
>> +++ /dev/null
>> @@ -1,30 +0,0 @@
>> -/**
>> - *  @file  score/src/ts64toticks.c
>> - *
>> - *  @brief Get Nanoseconds Portion of Timestamp
>> - *  @ingroup SuperCore
>> - */
>> -
>> -/*
>> - *  COPYRIGHT (c) 1989-2008.
>> - *  On-Line Applications Research Corporation (OAR).
>> - *
>> - *  The license and distribution terms for this file may be
>> - *  found in the file LICENSE in this distribution or at
>> - *  http://www.rtems.org/license/LICENSE.
>> - */
>> -
>> -#if HAVE_CONFIG_H
>> -#include "config.h"
>> -#endif
>> -
>> -#include <rtems/score/timestamp.h>
>> -
>> -#if CPU_TIMESTAMP_USE_INT64 == TRUE
>> -uint32_t _Timestamp64_Get_nanoseconds(
>> -  const Timestamp64_Control *_time
>> -)
>> -{
>> -  return _Timestamp64_implementation_Get_nanoseconds( _time );
>> -}
>> -#endif
>> diff --git a/cpukit/score/src/ts64getseconds.c b/cpukit/score/src/ts64getseconds.c
>> deleted file mode 100644
>> index eca0536..0000000
>> --- a/cpukit/score/src/ts64getseconds.c
>> +++ /dev/null
>> @@ -1,30 +0,0 @@
>> -/**
>> - * @file
>> - *
>> - * @brief Get Seconds Portion of Timestamp
>> - * @ingroup SuperCore
>> - */
>> -
>> -/*
>> - *  COPYRIGHT (c) 1989-2008.
>> - *  On-Line Applications Research Corporation (OAR).
>> - *
>> - *  The license and distribution terms for this file may be
>> - *  found in the file LICENSE in this distribution or at
>> - *  http://www.rtems.org/license/LICENSE.
>> - */
>> -
>> -#if HAVE_CONFIG_H
>> -#include "config.h"
>> -#endif
>> -
>> -#include <rtems/score/timestamp.h>
>> -
>> -#if CPU_TIMESTAMP_USE_INT64 == TRUE
>> -uint32_t _Timestamp64_Get_seconds(
>> -  const Timestamp64_Control *_time
>> -)
>> -{
>> -  return _Timestamp64_implementation_Get_seconds( _time );
>> -}
>> -#endif
>> diff --git a/cpukit/score/src/ts64lessthan.c b/cpukit/score/src/ts64lessthan.c
>> deleted file mode 100644
>> index d147814..0000000
>> --- a/cpukit/score/src/ts64lessthan.c
>> +++ /dev/null
>> @@ -1,31 +0,0 @@
>> -/**
>> - * @file
>> - *
>> - * @brief Timestamp Less Than Operator
>> - * @ingroup SuperCore Timestamp64
>> -*/
>> -
>> -/*
>> - *  COPYRIGHT (c) 1989-2008.
>> - *  On-Line Applications Research Corporation (OAR).
>> - *
>> - *  The license and distribution terms for this file may be
>> - *  found in the file LICENSE in this distribution or at
>> - *  http://www.rtems.org/license/LICENSE.
>> - */
>> -
>> -#if HAVE_CONFIG_H
>> -#include "config.h"
>> -#endif
>> -
>> -#include <rtems/score/timestamp.h>
>> -
>> -#if CPU_TIMESTAMP_USE_INT64 == TRUE
>> -bool _Timestamp64_Less_than(
>> -  const Timestamp64_Control *_lhs,
>> -  const Timestamp64_Control *_rhs
>> -)
>> -{
>> -  return _Timestamp64_implementation_Less_than( _lhs, _rhs );
>> -}
>> -#endif
>> diff --git a/cpukit/score/src/ts64set.c b/cpukit/score/src/ts64set.c
>> deleted file mode 100644
>> index 22771d6..0000000
>> --- a/cpukit/score/src/ts64set.c
>> +++ /dev/null
>> @@ -1,33 +0,0 @@
>> -/**
>> - * @file
>> - *
>> - * @brief Set Timestamp to Specified Seconds and Nanoseconds
>> - *
>> - * @ingroup SuperCore
>> - */
>> -
>> -/*
>> - *  COPYRIGHT (c) 1989-2008.
>> - *  On-Line Applications Research Corporation (OAR).
>> - *
>> - *  The license and distribution terms for this file may be
>> - *  found in the file LICENSE in this distribution or at
>> - *  http://www.rtems.org/license/LICENSE.
>> - */
>> -
>> -#if HAVE_CONFIG_H
>> -#include "config.h"
>> -#endif
>> -
>> -#include <rtems/score/timestamp.h>
>> -
>> -#if CPU_TIMESTAMP_USE_INT64 == TRUE
>> -void _Timestamp64_Set(
>> -  Timestamp64_Control *_time,
>> -  Timestamp64_Control  _seconds,
>> -  Timestamp64_Control  _nanoseconds
>> -)
>> -{
>> -  _Timestamp64_implementation_Set( _time, _seconds, _nanoseconds );
>> -}
>> -#endif
>> diff --git a/cpukit/score/src/ts64settozero.c b/cpukit/score/src/ts64settozero.c
>> deleted file mode 100644
>> index 7b319df..0000000
>> --- a/cpukit/score/src/ts64settozero.c
>> +++ /dev/null
>> @@ -1,31 +0,0 @@
>> -/**
>> - * @file
>> - *
>> - * @brief Zero a Timestamp64 Instance
>> - *
>> - * @ingroup SuperCore
>> - */
>> -
>> -/*
>> - *  COPYRIGHT (c) 1989-2008.
>> - *  On-Line Applications Research Corporation (OAR).
>> - *
>> - *  The license and distribution terms for this file may be
>> - *  found in the file LICENSE in this distribution or at
>> - *  http://www.rtems.org/license/LICENSE.
>> - */
>> -
>> -#if HAVE_CONFIG_H
>> -#include "config.h"
>> -#endif
>> -
>> -#include <rtems/score/timestamp.h>
>> -
>> -#if CPU_TIMESTAMP_USE_INT64 == TRUE
>> -void _Timestamp64_Set_to_zero(
>> -  Timestamp64_Control *_time
>> -)
>> -{
>> -  _Timestamp64_implementation_Set_to_zero( _time );
>> -}
>> -#endif
>> diff --git a/cpukit/score/src/ts64subtract.c b/cpukit/score/src/ts64subtract.c
>> deleted file mode 100644
>> index 1ee917b..0000000
>> --- a/cpukit/score/src/ts64subtract.c
>> +++ /dev/null
>> @@ -1,31 +0,0 @@
>> -/**
>> - * @file
>> - *
>> - * @brief Subtract Two Timestamps
>> - * @ingroup Timestamp
>> - */
>> -/*
>> - *  COPYRIGHT (c) 1989-2008.
>> - *  On-Line Applications Research Corporation (OAR).
>> - *
>> - *  The license and distribution terms for this file may be
>> - *  found in the file LICENSE in this distribution or at
>> - *  http://www.rtems.org/license/LICENSE.
>> - */
>> -
>> -#if HAVE_CONFIG_H
>> -#include "config.h"
>> -#endif
>> -
>> -#include <rtems/score/timestamp.h>
>> -
>> -#if CPU_TIMESTAMP_USE_INT64 == TRUE
>> -void _Timestamp64_Subtract(
>> -  const Timestamp64_Control *_start,
>> -  const Timestamp64_Control *_end,
>> -  Timestamp64_Control       *_result
>> -)
>> -{
>> -  _Timestamp64_implementation_Subtract( _start, _end, _result );
>> -}
>> -#endif
>> diff --git a/cpukit/score/src/ts64totimespec.c b/cpukit/score/src/ts64totimespec.c
>> deleted file mode 100644
>> index 7e81da7..0000000
>> --- a/cpukit/score/src/ts64totimespec.c
>> +++ /dev/null
>> @@ -1,32 +0,0 @@
>> -/**
>> - * @file
>> - *
>> - * @brief Convert Timestamp to Struct Timespec
>> - *
>> - * @ingroup SuperCore
>> - */
>> -
>> -/*
>> - *  COPYRIGHT (c) 1989-2008.
>> - *  On-Line Applications Research Corporation (OAR).
>> - *
>> - *  The license and distribution terms for this file may be
>> - *  found in the file LICENSE in this distribution or at
>> - *  http://www.rtems.org/license/LICENSE.
>> - */
>> -
>> -#if HAVE_CONFIG_H
>> -#include "config.h"
>> -#endif
>> -
>> -#include <rtems/score/timestamp.h>
>> -
>> -#if CPU_TIMESTAMP_USE_INT64 == TRUE
>> -void _Timestamp64_To_timespec(
>> -  const Timestamp64_Control *_timestamp,
>> -  struct timespec           *_timespec
>> -)
>> -{
>> -  _Timestamp64_implementation_To_timespec( _timestamp, _timespec );
>> -}
>> -#endif
>> diff --git a/cpukit/score/src/ts64totimeval.c b/cpukit/score/src/ts64totimeval.c
>> deleted file mode 100644
>> index 1ac765b..0000000
>> --- a/cpukit/score/src/ts64totimeval.c
>> +++ /dev/null
>> @@ -1,37 +0,0 @@
>> -/**
>> - * @file
>> - *
>> - * @brief Convert 64-bit Timestamp to struct timeval
>> - *
>> - * @ingroup SuperCore
>> - */
>> -
>> -/*
>> - * Copyright (c) 2012 embedded brains GmbH.  All rights reserved.
>> - *
>> - *  embedded brains GmbH
>> - *  Obere Lagerstr. 30
>> - *  82178 Puchheim
>> - *  Germany
>> - *  <rtems at embedded-brains.de>
>> - *
>> - * The license and distribution terms for this file may be
>> - * found in the file LICENSE in this distribution or at
>> - * http://www.rtems.org/license/LICENSE.
>> - */
>> -
>> -#if HAVE_CONFIG_H
>> -  #include "config.h"
>> -#endif
>> -
>> -#include <rtems/score/timestamp.h>
>> -
>> -#if CPU_TIMESTAMP_USE_INT64 == TRUE
>> -void _Timestamp64_To_timeval(
>> -  const Timestamp64_Control *_timestamp,
>> -  struct timeval            *_timeval
>> -)
>> -{
>> -  _Timestamp64_implementation_To_timeval( _timestamp, _timeval );
>> -}
>> -#endif
>> diff --git a/testsuites/sptests/Makefile.am b/testsuites/sptests/Makefile.am
>> index 9025ff3..c3fc443 100644
>> --- a/testsuites/sptests/Makefile.am
>> +++ b/testsuites/sptests/Makefile.am
>> @@ -38,6 +38,8 @@ else
>>  _SUBDIRS += sp29
>>  endif
>>  _SUBDIRS += spintrcritical23
>> +_SUBDIRS += sptimecounter01
>> +_SUBDIRS += sptimecounter02
>>  _SUBDIRS += spatomic01
>>  _SUBDIRS += spintrcritical22
>>  _SUBDIRS += spsem03
>> diff --git a/testsuites/sptests/configure.ac b/testsuites/sptests/configure.ac
>> index ae3c763..dbdd30f 100644
>> --- a/testsuites/sptests/configure.ac
>> +++ b/testsuites/sptests/configure.ac
>> @@ -41,6 +41,8 @@ AM_CONDITIONAL(HAS_SMP,test "$rtems_cv_RTEMS_SMP" = "yes")
>>  # Explicitly list all Makefiles here
>>  AC_CONFIG_FILES([Makefile
>>  spintrcritical23/Makefile
>> +sptimecounter02/Makefile
>> +sptimecounter01/Makefile
>>  spatomic01/Makefile
>>  spglobalcon01/Makefile
>>  spintrcritical22/Makefile
>> diff --git a/testsuites/sptests/spclock_err01/init.c b/testsuites/sptests/spclock_err01/init.c
>> index ab5c00a..087c8d4 100644
>> --- a/testsuites/sptests/spclock_err01/init.c
>> +++ b/testsuites/sptests/spclock_err01/init.c
>> @@ -115,14 +115,6 @@ rtems_task Init(
>>      puts( "TA1 - rtems_clock_get_tod_timeval - RTEMS_NOT_DEFINED" );
>>    }
>>
>> -  puts( "TA1 - rtems_clock_set_nanoseconds_extension - RTEMS_INVALID_ADDRESS" );
>> -  status = rtems_clock_set_nanoseconds_extension( NULL );
>> -  fatal_directive_status(
>> -    status,
>> -    RTEMS_INVALID_ADDRESS,
>> -    "rtems_clock_set_nanoseconds_extension NULL param"
>> -  );
>> -
>>    /* NULL parameter */
>>    status = rtems_clock_set( NULL );
>>    fatal_directive_status(
>> diff --git a/testsuites/sptests/spsize/size.c b/testsuites/sptests/spsize/size.c
>> index f427bd2..3e01466 100644
>> --- a/testsuites/sptests/spsize/size.c
>> +++ b/testsuites/sptests/spsize/size.c
>> @@ -390,9 +390,6 @@ uninitialized =
>>
>>  /*timerimpl.h*/ (sizeof _Timer_Information)               +
>>
>> -/*tod.h*/       (sizeof _TOD.now)                         +
>> -                (sizeof _TOD.uptime)                      +
>> -
>>  /*tqdata.h*/    0                                         +
>>
>>  /*types.h*/     0                                         +
>> diff --git a/testsuites/sptests/sptimecounter02/Makefile.am b/testsuites/sptests/sptimecounter02/Makefile.am
>> new file mode 100644
>> index 0000000..498c24e
>> --- /dev/null
>> +++ b/testsuites/sptests/sptimecounter02/Makefile.am
>> @@ -0,0 +1,19 @@
>> +rtems_tests_PROGRAMS = sptimecounter02
>> +sptimecounter02_SOURCES = init.c
>> +
>> +dist_rtems_tests_DATA = sptimecounter02.scn sptimecounter02.doc
>> +
>> +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP at .cfg
>> +include $(top_srcdir)/../automake/compile.am
>> +include $(top_srcdir)/../automake/leaf.am
>> +
>> +AM_CPPFLAGS += -I$(top_srcdir)/../support/include
>> +
>> +LINK_OBJS = $(sptimecounter02_OBJECTS)
>> +LINK_LIBS = $(sptimecounter02_LDLIBS)
>> +
>> +sptimecounter02$(EXEEXT): $(sptimecounter02_OBJECTS) $(sptimecounter02_DEPENDENCIES)
>> +       @rm -f sptimecounter02$(EXEEXT)
>> +       $(make-exe)
>> +
>> +include $(top_srcdir)/../automake/local.am
>> diff --git a/testsuites/sptests/sptimecounter02/init.c b/testsuites/sptests/sptimecounter02/init.c
>> new file mode 100644
>> index 0000000..781401f
>> --- /dev/null
>> +++ b/testsuites/sptests/sptimecounter02/init.c
>> @@ -0,0 +1,266 @@
>> +/*
>> + * Copyright (c) 2015 embedded brains GmbH.  All rights reserved.
>> + *
>> + *  embedded brains GmbH
>> + *  Dornierstr. 4
>> + *  82178 Puchheim
>> + *  Germany
>> + *  <rtems at embedded-brains.de>
>> + *
>> + * The license and distribution terms for this file may be
>> + * found in the file LICENSE in this distribution or at
>> + * http://www.rtems.org/license/LICENSE.
>> + */
>> +
>> +#ifdef HAVE_CONFIG_H
>> +  #include "config.h"
>> +#endif
>> +
>> +#define _KERNEL
>> +
>> +#include <sys/time.h>
>> +#include <sys/timetc.h>
>> +
>> +#include <stdlib.h>
>> +#include <stdio.h>
>> +#include <inttypes.h>
>> +#include <assert.h>
>> +#include <unistd.h>
>> +
>> +#include <rtems.h>
>> +#include <rtems/counter.h>
>> +#include <rtems/test.h>
>> +
>> +#include <rtems/score/timecounterimpl.h>
>> +#include <rtems/timecounter.h>
>> +
>> +#include "tmacros.h"
>> +
>> +const char rtems_test_name[] = "SPTIMECOUNTER_2";
>> +
>> +#define MASTER_PRIORITY 1
>> +#define WORKER_PRIORITY 2
>> +#define CPU_COUNT 32
>> +#define DURATION_LENGTH 2
>> +
>> +typedef struct {
>> +  rtems_test_parallel_context base;
>> +  struct timecounter tc_soft;
>> +  struct timecounter tc_cpu_counter;
>> +  u_int tc_soft_counter;
>> +  uint32_t binuptime_per_job[CPU_COUNT];
>> +  uint32_t rtemsuptime_per_job[CPU_COUNT];
>> +} timecounter_context;
>> +
>> +typedef struct {
>> +  struct bintime start_bin;
>> +  struct bintime end_bin;
>> +  struct bintime diff;
>> +} test_variables;
>> +
>> +static timecounter_context test_instance;
>> +
>> +static test_variables test_values;
>> +
>> +static rtems_interval test_duration(void)
>> +{
>> +  return DURATION_LENGTH * rtems_clock_get_ticks_per_second();
>> +}
>> +
>> +static u_int test_get_timecount_null(struct timecounter *tc)
>> +{
>> +       return 0;
>> +}
>> +
>> +static u_int test_get_timecount_cpu(struct timecounter *tc)
>> +{
>> +  return 0xffffffff - rtems_counter_read();
>> +}
>> +
>> +static void register_hardware_tc_null(timecounter_context *ctx)
>> +{
>> +  struct timecounter *tc_cpu = &ctx->tc_cpu_counter;
>> +
>> +  tc_cpu->tc_get_timecount = test_get_timecount_null;
>> +  tc_cpu->tc_counter_mask = 0xffffffff;
>> +  tc_cpu->tc_frequency = rtems_counter_nanoseconds_to_ticks(1000000000);
>> +  tc_cpu->tc_quality = 2000;
>> +  _Timecounter_Install(tc_cpu);
>> +}
>> +
>> +/*
>> + * Start of Timers
>> + */
>> +
>> +static rtems_interval test_bintime_init(
>> +  rtems_test_parallel_context *base,
>> +  void *arg,
>> +  size_t active_workers
>> +)
>> +{
>> +  return test_duration();
>> +}
>> +
>> +static void test_bintime_body(
>> +  rtems_test_parallel_context *base,
>> +  void *arg,
>> +  size_t active_workers,
>> +  size_t worker_index
>> +)
>> +{
>> +  timecounter_context *ctx = (timecounter_context *) base;
>> +  struct bintime bt;
>> +  uint32_t counter = 0;
>> +  test_variables *values = &test_values;
>> +
>> +  while (!rtems_test_parallel_stop_job(&ctx->base)) {
>> +    ++counter;
>> +    rtems_binuptime(&bt);
>> +    if (counter == 1){
>> +      values->start_bin = bt;
>> +    }
>> +  }
>> +  values->end_bin = bt;
>> +  values->diff = bt;
>> +  bintime_sub(&values->diff, &values->start_bin);
>> +  printf("\n%" PRIu32 " %" PRIu64 "\n", values->start_bin.sec,
>> +    values->start_bin.frac);
>> +  printf("%" PRIu32 " %" PRIu64 "\n", values->end_bin.sec,
>> +    values->end_bin.frac);
>> +  assert((values->diff.sec == DURATION_LENGTH) ||
>> +   ((values->diff.sec == DURATION_LENGTH - 1) &&
>> +   (values->diff.frac > UINT64_C(18000000000000000000))) ||
>> +   ((values->diff.sec == DURATION_LENGTH + 1) &&
>> +   (values->end_bin.frac < UINT64_C(2000000000000000000)))
>> +   );
>> +  ctx->binuptime_per_job[worker_index] = counter;
>> +}
>> +
>> +static void test_bintime_fini(
>> +  rtems_test_parallel_context *base,
>> +  void *arg,
>> +  size_t active_workers
>> +)
>> +{
>> +  timecounter_context *ctx = (timecounter_context *) base;
>> +  size_t i;
>> +
>> +  printf("  <BinuptimeTest activeWorker=\"%zu\">\n", active_workers);
>> +
>> +  for (i = 0; i < active_workers; ++i) {
>> +    printf(
>> +      "      <Counter worker=\"%zu\">%" PRIu32 "</Counter>\n",
>> +      (i+1), ctx->binuptime_per_job[i]);
>> +  }
>> +  printf("  </BinuptimeTest>\n");
>> +}
>> +
>> +static rtems_interval test_bintime_null_init(
>> +  rtems_test_parallel_context *base,
>> +  void *arg,
>> +  size_t active_workers
>> +)
>> +{
>> +  timecounter_context *ctx = &test_instance;
>> +
>> +  register_hardware_tc_null(ctx);
>> +  return test_duration();
>> +}
>> +
>> +static void test_bintime_null_body(
>> +  rtems_test_parallel_context *base,
>> +  void *arg,
>> +  size_t active_workers,
>> +  size_t worker_index
>> +)
>> +{
>> +  timecounter_context *ctx = (timecounter_context *) base;
>> +  struct bintime bt;
>> +  uint32_t counter = 0;
>> +
>> +  while (!rtems_test_parallel_stop_job(&ctx->base)) {
>> +    ++counter;
>> +    rtems_binuptime(&bt);
>> +  }
>> +
>> +  ctx->binuptime_per_job[worker_index] = counter;
>> +}
>> +
>> +static void test_bintime_null_fini(
>> +  rtems_test_parallel_context *base,
>> +  void *arg,
>> +  size_t active_workers
>> +)
>> +{
>> +  timecounter_context *ctx = (timecounter_context *) base;
>> +  size_t i;
>> +
>> +  printf("  <BinuptimenullTest activeWorker=\"%zu\">\n", active_workers);
>> +
>> +  for (i = 0; i < active_workers; ++i) {
>> +    printf(
>> +      "      <Counter worker=\"%zu\">%" PRIu32 "</Counter>\n",
>> +      (i+1), ctx->binuptime_per_job[i]);
>> +  }
>> +  printf("  </BinuptimenullTest>\n");
>> +}
>> +
>> +static const rtems_test_parallel_job timecounter_jobs[] = {
>> +  {
>> +    .init = test_bintime_init,
>> +    .body = test_bintime_body,
>> +    .fini = test_bintime_fini,
>> +    .cascade = true
>> +  },{
>> +    .init = test_bintime_null_init,
>> +    .body = test_bintime_null_body,
>> +    .fini = test_bintime_null_fini,
>> +    .cascade = true
>> +  }
>> +};
>> +
>> +/*
>> + * Start of Init
>> + */
>> +
>> +static void Init(rtems_task_argument arg)
>> +{
>> +  timecounter_context *ctx = &test_instance;
>> +
>> +  TEST_BEGIN();
>> +
>> +  printf("<TEST>\n");
>> +
>> +  rtems_test_parallel(
>> +    &ctx->base,
>> +    NULL,
>> +    &timecounter_jobs[0],
>> +    RTEMS_ARRAY_SIZE(timecounter_jobs)
>> +  );
>> +
>> +  printf("</TEST>\n");
>> +
>> +  TEST_END();
>> +  rtems_test_exit(0);
>> +}
>> +
>> +#define CONFIGURE_MICROSECONDS_PER_TICK 1000
>> +
>> +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
>> +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
>> +
>> +#define CONFIGURE_MAXIMUM_TASKS (2 + CPU_COUNT - 1)
>> +#define CONFIGURE_MAXIMUM_TIMERS 2
>> +#define CONFIGURE_MAXIMUM_PERIODS 1
>> +
>> +#define CONFIGURE_SMP_APPLICATION
>> +
>> +#define CONFIGURE_SMP_MAXIMUM_PROCESSORS CPU_COUNT
>> +
>> +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
>> +
>> +#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
>> +
>> +#define CONFIGURE_INIT
>> +
>> +#include <rtems/confdefs.h>
>> diff --git a/testsuites/sptests/sptimecounter02/sptimecounter02.doc b/testsuites/sptests/sptimecounter02/sptimecounter02.doc
>> new file mode 100644
>> index 0000000..56e8bb6
>> --- /dev/null
>> +++ b/testsuites/sptests/sptimecounter02/sptimecounter02.doc
>> @@ -0,0 +1,11 @@
>> +This file describes the directives and concepts tested by this test set.
>> +
>> +test set name: sptimecounter02
>> +
>> +directives:
>> +
>> +  TBD
>> +
>> +concepts:
>> +
>> +  TBD
>> diff --git a/testsuites/sptests/sptimecounter02/sptimecounter02.scn b/testsuites/sptests/sptimecounter02/sptimecounter02.scn
>> new file mode 100644
>> index 0000000..e69de29
>> --
>> 1.8.4.5
>>
>> _______________________________________________
>> devel mailing list
>> devel at rtems.org
>> http://lists.rtems.org/mailman/listinfo/devel
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel

-- 
Joel Sherrill, Ph.D.             Director of Research & Development
joel.sherrill at OARcorp.com        On-Line Applications Research
Ask me about RTEMS: a free RTOS  Huntsville AL 35805
Support Available                (256) 722-9985





More information about the devel mailing list