Index: cpukit/sapi/Makefile.am
===================================================================
--- cpukit/sapi/Makefile.am	(revision bab16de2671cc5b35e3df9b343e8645b632e3b1d)
+++ cpukit/sapi/Makefile.am	(revision 24bf11eca11947d961cc9bb5f7d92dabff169e93)
@@ -7,4 +7,5 @@
 include_rtems_HEADERS += include/rtems/chain.h
 include_rtems_HEADERS += include/rtems/config.h
+include_rtems_HEADERS += include/rtems/counter.h
 include_rtems_HEADERS += include/rtems/extension.h
 include_rtems_HEADERS += include/rtems/extensionimpl.h
@@ -33,4 +34,7 @@
     src/fatal2.c src/fatalsrctext.c
 libsapi_a_SOURCES += src/chainsmp.c
+libsapi_a_SOURCES += src/cpucounterconverter.c
+libsapi_a_SOURCES += src/delayticks.c
+libsapi_a_SOURCES += src/delaynano.c
 libsapi_a_CPPFLAGS = $(AM_CPPFLAGS)
 
Index: cpukit/sapi/include/rtems/counter.h
===================================================================
--- cpukit/sapi/include/rtems/counter.h	(revision 24bf11eca11947d961cc9bb5f7d92dabff169e93)
+++ cpukit/sapi/include/rtems/counter.h	(revision 24bf11eca11947d961cc9bb5f7d92dabff169e93)
@@ -0,0 +1,160 @@
+/**
+ * @file
+ *
+ * @ingroup ClassicCounter
+ * 
+ * @brief Free-Running Counter and Busy Wait Delay API
+ */
+
+/*
+ * Copyright (c) 2014 embedded brains GmbH.  All rights reserved.
+ *
+ *  embedded brains GmbH
+ *  Dornierstr. 4
+ *  82178 Puchheim
+ *  Germany
+ *  <rtems@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.com/license/LICENSE.
+ */
+
+#ifndef _RTEMS_SAPI_COUNTER_H
+#define _RTEMS_SAPI_COUNTER_H
+
+#include <rtems/score/cpu.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @defgroup ClassicCounter Free-Running Counter and Busy Wait Delay
+ *
+ * @ingroup ClassicRTEMS
+ *
+ * @brief Free-running counter and busy wait delay functions.
+ *
+ * The RTEMS counter is some free-running counter.  It ticks usually with a
+ * frequency close to the CPU or system bus clock.
+ *
+ * The counter can be used in case the overhead of the
+ * rtems_clock_get_uptime_nanoseconds() is too high.  The step from counter
+ * ticks to/from nanoseconds is explicit in this API unlike to
+ * rtems_clock_get_uptime_nanoseconds() which performs the conversion on each
+ * invocation.
+ *
+ * This counter works without a clock driver and during system initialization.
+ *
+ * The counter can be used to profile low-level operations like SMP locks or
+ * interrupt disabled critical sections.  The counter can act also as an
+ * entropy source for a random number generator. 
+ *
+ * The period of the counter depends on the actual hardware.
+ *
+ * @{
+ */
+
+/**
+ * @brief Unsigned integer type for counter values.
+ */
+typedef CPU_Counter_ticks rtems_counter_ticks;
+
+/**
+ * @brief Reads the current counter values.
+ *
+ * @return The current counter values.
+ */
+static inline rtems_counter_ticks rtems_counter_read( void )
+{
+  return _CPU_Counter_read();
+}
+
+/**
+ * @brief Returns the difference between the second and first CPU counter
+ * value.
+ *
+ * This operation may be carried out as a modulo operation depending on the
+ * range of the CPU counter device.
+ *
+ * @param[in] second The second CPU counter value.
+ * @param[in] first The first CPU counter value.
+ *
+ * @return Returns second minus first modulo counter period.
+ */
+static inline rtems_counter_ticks rtems_counter_difference(
+  rtems_counter_ticks second,
+  rtems_counter_ticks first
+)
+{
+  return _CPU_Counter_difference( second, first );
+}
+
+/**
+ * brief Converts counter ticks into nanoseconds.
+ *
+ * @param[in] ticks Some counter ticks.
+ *
+ * @return The nanoseconds corresponding to the counter ticks.  The value is
+ * rounded up.
+ */
+uint64_t rtems_counter_ticks_to_nanoseconds(
+  rtems_counter_ticks ticks
+);
+
+/**
+ * brief Converts nanoseconds into counter ticks.
+ *
+ * @param[in] nanoseconds Some nanoseconds.
+ *
+ * @return The counter ticks corresponding to the nanoseconds.  The value is
+ * rounded up.
+ */
+rtems_counter_ticks rtems_counter_nanoseconds_to_ticks(
+  uint32_t nanoseconds
+);
+
+/**
+ * brief Initializes the counter ticks to/from nanoseconds converter functions.
+ *
+ * This function must be used to initialize the
+ * rtems_counter_ticks_to_nanoseconds() and
+ * rtems_counter_nanoseconds_to_ticks() functions.  It should be called during
+ * system initialization by the board support package.
+ *
+ * @param[in] uint32_t frequency The current counter frequency in Hz.
+ */
+void rtems_counter_initialize_converter( uint32_t frequency );
+
+/**
+ * @brief Busy wait for some counter ticks.
+ *
+ * This function does not disable interrupts.  Thus task switches and
+ * interrupts can interfere with this busy wait may prolong the delay.  This
+ * function busy waits at least the specified time.  Due to some overhead the
+ * actual delay may be longer.
+ *
+ * @param[in] ticks The minimum busy wait time in counter ticks.
+ */
+void rtems_counter_delay_ticks( rtems_counter_ticks ticks );
+
+/**
+ * @brief Busy wait for some nanoseconds.
+ *
+ * This function does not disable interrupts.  Thus task switches and
+ * interrupts can interfere with this busy wait may prolong the delay.  This
+ * function busy waits at least the specified time.  Due to some overhead the
+ * actual delay may be longer.
+ *
+ * @param[in] nanoseconds The minimum busy wait time in nanoseconds.
+ */
+void rtems_counter_delay_nanoseconds( uint32_t nanoseconds );
+
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _RTEMS_SAPI_COUNTER_H */
Index: cpukit/sapi/preinstall.am
===================================================================
--- cpukit/sapi/preinstall.am	(revision bab16de2671cc5b35e3df9b343e8645b632e3b1d)
+++ cpukit/sapi/preinstall.am	(revision 24bf11eca11947d961cc9bb5f7d92dabff169e93)
@@ -40,4 +40,8 @@
 	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/config.h
 PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/config.h
+
+$(PROJECT_INCLUDE)/rtems/counter.h: include/rtems/counter.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
+	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/counter.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/counter.h
 
 $(PROJECT_INCLUDE)/rtems/extension.h: include/rtems/extension.h $(PROJECT_INCLUDE)/rtems/$(dirstamp)
Index: cpukit/sapi/src/cpucounterconverter.c
===================================================================
--- cpukit/sapi/src/cpucounterconverter.c	(revision 24bf11eca11947d961cc9bb5f7d92dabff169e93)
+++ cpukit/sapi/src/cpucounterconverter.c	(revision 24bf11eca11947d961cc9bb5f7d92dabff169e93)
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2014 embedded brains GmbH.  All rights reserved.
+ *
+ *  embedded brains GmbH
+ *  Dornierstr. 4
+ *  82178 Puchheim
+ *  Germany
+ *  <rtems@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.com/license/LICENSE.
+ */
+
+#include <rtems/counter.h>
+
+RTEMS_STATIC_ASSERT(sizeof(rtems_counter_ticks) <= sizeof(uint32_t), type);
+
+static uint64_t to_ns_scaler = UINT64_C(1) << 32;
+
+static uint64_t from_ns_scaler = UINT64_C(1) << 32;
+
+uint64_t rtems_counter_ticks_to_nanoseconds( rtems_counter_ticks counter )
+{
+  return (uint32_t) ((counter * to_ns_scaler) >> 32);
+}
+
+rtems_counter_ticks rtems_counter_nanoseconds_to_ticks( uint32_t nanoseconds )
+{
+  return (rtems_counter_ticks) ((nanoseconds * from_ns_scaler) >> 32);
+}
+
+void rtems_counter_initialize_converter( uint32_t frequency )
+{
+  uint64_t ns_per_s = UINT64_C(1000000000);
+
+  to_ns_scaler = ((ns_per_s << 32) + frequency - 1) / frequency;
+  from_ns_scaler = ((UINT64_C(1) << 32) * frequency + ns_per_s - 1) / ns_per_s;
+}
Index: cpukit/sapi/src/delaynano.c
===================================================================
--- cpukit/sapi/src/delaynano.c	(revision 24bf11eca11947d961cc9bb5f7d92dabff169e93)
+++ cpukit/sapi/src/delaynano.c	(revision 24bf11eca11947d961cc9bb5f7d92dabff169e93)
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2014 embedded brains GmbH.  All rights reserved.
+ *
+ *  embedded brains GmbH
+ *  Dornierstr. 4
+ *  82178 Puchheim
+ *  Germany
+ *  <rtems@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.com/license/LICENSE.
+ */
+
+#ifdef HAVE_CONFIG_H
+  #include "config.h"
+#endif
+
+#include <rtems/counter.h>
+
+void rtems_counter_delay_nanoseconds( uint32_t nanoseconds )
+{
+  rtems_counter_ticks ticks =
+    rtems_counter_nanoseconds_to_ticks( nanoseconds );
+
+  rtems_counter_delay_ticks( ticks );
+}
Index: cpukit/sapi/src/delayticks.c
===================================================================
--- cpukit/sapi/src/delayticks.c	(revision 24bf11eca11947d961cc9bb5f7d92dabff169e93)
+++ cpukit/sapi/src/delayticks.c	(revision 24bf11eca11947d961cc9bb5f7d92dabff169e93)
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2014 embedded brains GmbH.  All rights reserved.
+ *
+ *  embedded brains GmbH
+ *  Dornierstr. 4
+ *  82178 Puchheim
+ *  Germany
+ *  <rtems@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.com/license/LICENSE.
+ */
+
+#ifdef HAVE_CONFIG_H
+  #include "config.h"
+#endif
+
+#include <rtems/counter.h>
+
+void rtems_counter_delay_ticks( rtems_counter_ticks ticks )
+{
+  rtems_counter_ticks a = rtems_counter_read();
+  rtems_counter_ticks delta = 0;
+
+  do {
+    rtems_counter_ticks b;
+
+    ticks -= delta;
+
+    b = rtems_counter_read();
+    delta = rtems_counter_difference( b, a );
+    a = b;
+  } while ( ticks > delta );
+}
