summaryrefslogtreecommitdiffstats
path: root/cpukit/score
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2018-05-23 14:17:25 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2018-06-15 13:02:44 +0200
commit65f868cac6f7fd5c3ad02046574c19f8f4673255 (patch)
tree15103fb87ed2e7161c17006e2c077f35e3506a95 /cpukit/score
parentAdd RTEMS_SYSINIT_CPU_COUNTER (diff)
downloadrtems-65f868cac6f7fd5c3ad02046574c19f8f4673255.tar.bz2
Add _CPU_Counter_frequency()
Add rtems_counter_frequency() API function. Use it to initialize the counter value converter via the new system initialization step (RTEMS_SYSINIT_CPU_COUNTER). This decouples the counter implementation and the counter converter. It avoids an unnecessary pull in of the 64-bit integer division from libgcc. Update #3456.
Diffstat (limited to 'cpukit/score')
-rw-r--r--cpukit/score/cpu/arm/include/rtems/score/cpu.h2
-rw-r--r--cpukit/score/cpu/bfin/Makefile.am1
-rw-r--r--cpukit/score/cpu/bfin/include/rtems/score/cpu.h2
-rw-r--r--cpukit/score/cpu/epiphany/Makefile.am1
-rw-r--r--cpukit/score/cpu/epiphany/include/rtems/score/cpu.h2
-rw-r--r--cpukit/score/cpu/i386/Makefile.am1
-rw-r--r--cpukit/score/cpu/i386/include/rtems/score/cpu.h2
-rw-r--r--cpukit/score/cpu/lm32/Makefile.am1
-rw-r--r--cpukit/score/cpu/lm32/include/rtems/score/cpu.h2
-rw-r--r--cpukit/score/cpu/m32c/Makefile.am1
-rw-r--r--cpukit/score/cpu/m32c/include/rtems/score/cpu.h2
-rw-r--r--cpukit/score/cpu/m68k/Makefile.am1
-rw-r--r--cpukit/score/cpu/m68k/include/rtems/score/cpu.h2
-rw-r--r--cpukit/score/cpu/mips/Makefile.am1
-rw-r--r--cpukit/score/cpu/mips/include/rtems/score/cpu.h2
-rw-r--r--cpukit/score/cpu/moxie/Makefile.am1
-rw-r--r--cpukit/score/cpu/moxie/include/rtems/score/cpu.h2
-rw-r--r--cpukit/score/cpu/nios2/Makefile.am1
-rw-r--r--cpukit/score/cpu/nios2/include/rtems/score/cpu.h2
-rw-r--r--cpukit/score/cpu/no_cpu/Makefile.am1
-rw-r--r--cpukit/score/cpu/no_cpu/cpucounterfrequency.c20
-rw-r--r--cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h7
-rw-r--r--cpukit/score/cpu/or1k/Makefile.am3
-rw-r--r--cpukit/score/cpu/or1k/include/rtems/score/cpu.h4
-rw-r--r--cpukit/score/cpu/powerpc/include/rtems/score/cpu.h2
-rw-r--r--cpukit/score/cpu/riscv/Makefile.am1
-rw-r--r--cpukit/score/cpu/riscv/include/rtems/score/cpu.h2
-rw-r--r--cpukit/score/cpu/sh/Makefile.am1
-rw-r--r--cpukit/score/cpu/sh/include/rtems/score/cpu.h2
-rw-r--r--cpukit/score/cpu/sparc/include/rtems/score/cpu.h2
-rw-r--r--cpukit/score/cpu/sparc64/Makefile.am1
-rw-r--r--cpukit/score/cpu/sparc64/include/rtems/score/cpu.h2
-rw-r--r--cpukit/score/cpu/v850/Makefile.am1
-rw-r--r--cpukit/score/cpu/v850/include/rtems/score/cpu.h2
34 files changed, 77 insertions, 3 deletions
diff --git a/cpukit/score/cpu/arm/include/rtems/score/cpu.h b/cpukit/score/cpu/arm/include/rtems/score/cpu.h
index 728a43c528..7ea6980959 100644
--- a/cpukit/score/cpu/arm/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/arm/include/rtems/score/cpu.h
@@ -596,6 +596,8 @@ static inline uint16_t CPU_swap_u16( uint16_t value )
typedef uint32_t CPU_Counter_ticks;
+uint32_t _CPU_Counter_frequency( void );
+
CPU_Counter_ticks _CPU_Counter_read( void );
CPU_Counter_ticks _CPU_Counter_difference(
diff --git a/cpukit/score/cpu/bfin/Makefile.am b/cpukit/score/cpu/bfin/Makefile.am
index 3d7483a220..7febda59b6 100644
--- a/cpukit/score/cpu/bfin/Makefile.am
+++ b/cpukit/score/cpu/bfin/Makefile.am
@@ -2,6 +2,7 @@ include $(top_srcdir)/automake/compile.am
noinst_LIBRARIES = libscorecpu.a
libscorecpu_a_SOURCES = cpu.c cpu_asm.S
+libscorecpu_a_SOURCES += ../no_cpu/cpucounterfrequency.c
libscorecpu_a_SOURCES += ../no_cpu/cpucounterread.c
libscorecpu_a_SOURCES += bfin-exception-frame-print.c
libscorecpu_a_CPPFLAGS = $(AM_CPPFLAGS)
diff --git a/cpukit/score/cpu/bfin/include/rtems/score/cpu.h b/cpukit/score/cpu/bfin/include/rtems/score/cpu.h
index d2c2cade08..a361e023ed 100644
--- a/cpukit/score/cpu/bfin/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/bfin/include/rtems/score/cpu.h
@@ -982,6 +982,8 @@ static inline uint32_t CPU_swap_u32(
typedef uint32_t CPU_Counter_ticks;
+uint32_t _CPU_Counter_frequency( void );
+
CPU_Counter_ticks _CPU_Counter_read( void );
static inline CPU_Counter_ticks _CPU_Counter_difference(
diff --git a/cpukit/score/cpu/epiphany/Makefile.am b/cpukit/score/cpu/epiphany/Makefile.am
index 659dd6f554..0c75bcdcd5 100644
--- a/cpukit/score/cpu/epiphany/Makefile.am
+++ b/cpukit/score/cpu/epiphany/Makefile.am
@@ -8,6 +8,7 @@ libscorecpu_a_SOURCES = cpu.c
libscorecpu_a_SOURCES += epiphany-exception-handler.S
libscorecpu_a_SOURCES += epiphany-context-switch.S
libscorecpu_a_SOURCES += epiphany-context-initialize.c
+libscorecpu_a_SOURCES += ../no_cpu/cpucounterfrequency.c
libscorecpu_a_SOURCES += setjmp.S
libscorecpu_a_CPPFLAGS = $(AM_CPPFLAGS)
diff --git a/cpukit/score/cpu/epiphany/include/rtems/score/cpu.h b/cpukit/score/cpu/epiphany/include/rtems/score/cpu.h
index 8979381259..84565d15d2 100644
--- a/cpukit/score/cpu/epiphany/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/epiphany/include/rtems/score/cpu.h
@@ -854,6 +854,8 @@ static inline void _CPU_Context_validate( uintptr_t pattern )
typedef uint32_t CPU_Counter_ticks;
+uint32_t _CPU_Counter_frequency( void );
+
CPU_Counter_ticks _CPU_Counter_read( void );
static inline CPU_Counter_ticks _CPU_Counter_difference(
diff --git a/cpukit/score/cpu/i386/Makefile.am b/cpukit/score/cpu/i386/Makefile.am
index fe7fa5582c..b03d8593c4 100644
--- a/cpukit/score/cpu/i386/Makefile.am
+++ b/cpukit/score/cpu/i386/Makefile.am
@@ -2,6 +2,7 @@ include $(top_srcdir)/automake/compile.am
noinst_LIBRARIES = libscorecpu.a
libscorecpu_a_SOURCES = cpu.c cpu_asm.S
+libscorecpu_a_SOURCES += ../no_cpu/cpucounterfrequency.c
libscorecpu_a_SOURCES += ../no_cpu/cpucounterread.c
libscorecpu_a_CPPFLAGS = $(AM_CPPFLAGS)
diff --git a/cpukit/score/cpu/i386/include/rtems/score/cpu.h b/cpukit/score/cpu/i386/include/rtems/score/cpu.h
index 42958c00f0..0986663be1 100644
--- a/cpukit/score/cpu/i386/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/i386/include/rtems/score/cpu.h
@@ -697,6 +697,8 @@ void _CPU_Exception_frame_print( const CPU_Exception_frame *frame );
typedef uint32_t CPU_Counter_ticks;
+uint32_t _CPU_Counter_frequency( void );
+
CPU_Counter_ticks _CPU_Counter_read( void );
static inline CPU_Counter_ticks _CPU_Counter_difference(
diff --git a/cpukit/score/cpu/lm32/Makefile.am b/cpukit/score/cpu/lm32/Makefile.am
index 75bcba5793..795a6be283 100644
--- a/cpukit/score/cpu/lm32/Makefile.am
+++ b/cpukit/score/cpu/lm32/Makefile.am
@@ -2,6 +2,7 @@ include $(top_srcdir)/automake/compile.am
noinst_LIBRARIES = libscorecpu.a
libscorecpu_a_SOURCES = cpu.c cpu_asm.S irq.c
+libscorecpu_a_SOURCES += ../no_cpu/cpucounterfrequency.c
libscorecpu_a_SOURCES += ../no_cpu/cpucounterread.c
libscorecpu_a_SOURCES += lm32-exception-frame-print.c
libscorecpu_a_CPPFLAGS = $(AM_CPPFLAGS)
diff --git a/cpukit/score/cpu/lm32/include/rtems/score/cpu.h b/cpukit/score/cpu/lm32/include/rtems/score/cpu.h
index f36e00e404..fe8107c51b 100644
--- a/cpukit/score/cpu/lm32/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/lm32/include/rtems/score/cpu.h
@@ -1018,6 +1018,8 @@ static inline uint16_t CPU_swap_u16(uint16_t v)
typedef uint32_t CPU_Counter_ticks;
+uint32_t _CPU_Counter_frequency( void );
+
CPU_Counter_ticks _CPU_Counter_read( void );
static inline CPU_Counter_ticks _CPU_Counter_difference(
diff --git a/cpukit/score/cpu/m32c/Makefile.am b/cpukit/score/cpu/m32c/Makefile.am
index 22bec7fce0..6695d35c77 100644
--- a/cpukit/score/cpu/m32c/Makefile.am
+++ b/cpukit/score/cpu/m32c/Makefile.am
@@ -3,6 +3,7 @@ include $(top_srcdir)/automake/compile.am
noinst_LIBRARIES = libscorecpu.a
libscorecpu_a_SOURCES = cpu.c cpu_asm.c context_switch.S context_init.c \
varvects.S
+libscorecpu_a_SOURCES += ../no_cpu/cpucounterfrequency.c
libscorecpu_a_SOURCES += ../no_cpu/cpucounterread.c
libscorecpu_a_SOURCES += m32c-exception-frame-print.c
libscorecpu_a_CPPFLAGS = $(AM_CPPFLAGS)
diff --git a/cpukit/score/cpu/m32c/include/rtems/score/cpu.h b/cpukit/score/cpu/m32c/include/rtems/score/cpu.h
index ec0e71c286..c5486e80d6 100644
--- a/cpukit/score/cpu/m32c/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/m32c/include/rtems/score/cpu.h
@@ -968,6 +968,8 @@ static inline uint32_t CPU_swap_u32(
typedef uint32_t CPU_Counter_ticks;
+uint32_t _CPU_Counter_frequency( void );
+
CPU_Counter_ticks _CPU_Counter_read( void );
static inline CPU_Counter_ticks _CPU_Counter_difference(
diff --git a/cpukit/score/cpu/m68k/Makefile.am b/cpukit/score/cpu/m68k/Makefile.am
index 68fd3a253a..e02b4ab600 100644
--- a/cpukit/score/cpu/m68k/Makefile.am
+++ b/cpukit/score/cpu/m68k/Makefile.am
@@ -4,6 +4,7 @@ noinst_LIBRARIES = libscorecpu.a
libscorecpu_a_CPPFLAGS = $(AM_CPPFLAGS)
libscorecpu_a_SOURCES = cpu.c cpu_asm.S
+libscorecpu_a_SOURCES += ../no_cpu/cpucounterfrequency.c
libscorecpu_a_SOURCES += ../no_cpu/cpucounterread.c
libscorecpu_a_SOURCES += m68k-exception-frame-print.c
libscorecpu_a_SOURCES += __m68k_read_tp.c
diff --git a/cpukit/score/cpu/m68k/include/rtems/score/cpu.h b/cpukit/score/cpu/m68k/include/rtems/score/cpu.h
index 9b140d0da3..459ef8a9cd 100644
--- a/cpukit/score/cpu/m68k/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/m68k/include/rtems/score/cpu.h
@@ -679,6 +679,8 @@ void _CPU_Exception_frame_print(
typedef uint32_t CPU_Counter_ticks;
+uint32_t _CPU_Counter_frequency( void );
+
CPU_Counter_ticks _CPU_Counter_read( void );
static inline CPU_Counter_ticks _CPU_Counter_difference(
diff --git a/cpukit/score/cpu/mips/Makefile.am b/cpukit/score/cpu/mips/Makefile.am
index fe7fa5582c..b03d8593c4 100644
--- a/cpukit/score/cpu/mips/Makefile.am
+++ b/cpukit/score/cpu/mips/Makefile.am
@@ -2,6 +2,7 @@ include $(top_srcdir)/automake/compile.am
noinst_LIBRARIES = libscorecpu.a
libscorecpu_a_SOURCES = cpu.c cpu_asm.S
+libscorecpu_a_SOURCES += ../no_cpu/cpucounterfrequency.c
libscorecpu_a_SOURCES += ../no_cpu/cpucounterread.c
libscorecpu_a_CPPFLAGS = $(AM_CPPFLAGS)
diff --git a/cpukit/score/cpu/mips/include/rtems/score/cpu.h b/cpukit/score/cpu/mips/include/rtems/score/cpu.h
index acc4ef81ec..46d1eb28e8 100644
--- a/cpukit/score/cpu/mips/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/mips/include/rtems/score/cpu.h
@@ -988,6 +988,8 @@ static inline uint32_t CPU_swap_u32(
typedef uint32_t CPU_Counter_ticks;
+uint32_t _CPU_Counter_frequency( void );
+
CPU_Counter_ticks _CPU_Counter_read( void );
static inline CPU_Counter_ticks _CPU_Counter_difference(
diff --git a/cpukit/score/cpu/moxie/Makefile.am b/cpukit/score/cpu/moxie/Makefile.am
index 29c9a656c5..d5e8952693 100644
--- a/cpukit/score/cpu/moxie/Makefile.am
+++ b/cpukit/score/cpu/moxie/Makefile.am
@@ -6,6 +6,7 @@ include $(top_srcdir)/automake/compile.am
noinst_LIBRARIES = libscorecpu.a
libscorecpu_a_SOURCES = cpu.c moxie-exception-frame-print.c cpu_asm.S
+libscorecpu_a_SOURCES += ../no_cpu/cpucounterfrequency.c
libscorecpu_a_SOURCES += ../no_cpu/cpucounterread.c
libscorecpu_a_CPPFLAGS = $(AM_CPPFLAGS)
diff --git a/cpukit/score/cpu/moxie/include/rtems/score/cpu.h b/cpukit/score/cpu/moxie/include/rtems/score/cpu.h
index 7ab3e373b4..403b05f9fb 100644
--- a/cpukit/score/cpu/moxie/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/moxie/include/rtems/score/cpu.h
@@ -835,6 +835,8 @@ static inline uint32_t CPU_swap_u32(
typedef uint32_t CPU_Counter_ticks;
+uint32_t _CPU_Counter_frequency( void );
+
CPU_Counter_ticks _CPU_Counter_read( void );
static inline CPU_Counter_ticks _CPU_Counter_difference(
diff --git a/cpukit/score/cpu/nios2/Makefile.am b/cpukit/score/cpu/nios2/Makefile.am
index 3d6a35905c..a0ecab3345 100644
--- a/cpukit/score/cpu/nios2/Makefile.am
+++ b/cpukit/score/cpu/nios2/Makefile.am
@@ -5,6 +5,7 @@ CLEANFILES =
noinst_LIBRARIES = libscorecpu.a
libscorecpu_a_SOURCES =
+libscorecpu_a_SOURCES += ../no_cpu/cpucounterfrequency.c
libscorecpu_a_SOURCES += ../no_cpu/cpucounterread.c
libscorecpu_a_SOURCES += nios2-context-initialize.c
libscorecpu_a_SOURCES += nios2-context-switch.S
diff --git a/cpukit/score/cpu/nios2/include/rtems/score/cpu.h b/cpukit/score/cpu/nios2/include/rtems/score/cpu.h
index c7fdb92d01..1d088ed058 100644
--- a/cpukit/score/cpu/nios2/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/nios2/include/rtems/score/cpu.h
@@ -353,6 +353,8 @@ static inline uint32_t CPU_swap_u32( uint32_t value )
typedef uint32_t CPU_Counter_ticks;
+uint32_t _CPU_Counter_frequency( void );
+
CPU_Counter_ticks _CPU_Counter_read( void );
static inline CPU_Counter_ticks _CPU_Counter_difference(
diff --git a/cpukit/score/cpu/no_cpu/Makefile.am b/cpukit/score/cpu/no_cpu/Makefile.am
index 556d3dea34..0d89f5af2b 100644
--- a/cpukit/score/cpu/no_cpu/Makefile.am
+++ b/cpukit/score/cpu/no_cpu/Makefile.am
@@ -2,6 +2,7 @@ include $(top_srcdir)/automake/compile.am
noinst_LIBRARIES = libscorecpu.a
libscorecpu_a_SOURCES = cpu.c cpu_asm.c
+libscorecpu_a_SOURCES += cpucounterfrequency.c
libscorecpu_a_SOURCES += cpucounterread.c
libscorecpu_a_CPPFLAGS = $(AM_CPPFLAGS)
diff --git a/cpukit/score/cpu/no_cpu/cpucounterfrequency.c b/cpukit/score/cpu/no_cpu/cpucounterfrequency.c
new file mode 100644
index 0000000000..bbb8c127fe
--- /dev/null
+++ b/cpukit/score/cpu/no_cpu/cpucounterfrequency.c
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2018 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.org/license/LICENSE.
+ */
+
+#include <rtems/score/cpu.h>
+
+uint32_t _CPU_Counter_frequency( void )
+{
+ return 1000000000;
+}
diff --git a/cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h b/cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h
index 5902b4ef36..45edbaa3cf 100644
--- a/cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/no_cpu/include/rtems/score/cpu.h
@@ -1329,6 +1329,13 @@ static inline uint32_t CPU_swap_u32(
typedef uint32_t CPU_Counter_ticks;
/**
+ * @brief Returns the current CPU counter frequency in Hz.
+ *
+ * @return The current CPU counter frequency in Hz.
+ */
+uint32_t _CPU_Counter_frequency( void );
+
+/**
* @brief Returns the current CPU counter value.
*
* A CPU counter is some free-running counter. It ticks usually with a
diff --git a/cpukit/score/cpu/or1k/Makefile.am b/cpukit/score/cpu/or1k/Makefile.am
index ac83acf9b3..732f7c3d69 100644
--- a/cpukit/score/cpu/or1k/Makefile.am
+++ b/cpukit/score/cpu/or1k/Makefile.am
@@ -6,8 +6,9 @@ noinst_LIBRARIES = libscorecpu.a
libscorecpu_a_SOURCES =
libscorecpu_a_SOURCES += cpu.c
-libscorecpu_a_SOURCES += or1k-context-switch.S
+libscorecpu_a_SOURCES += ../no_cpu/cpucounterfrequency.c
libscorecpu_a_SOURCES += or1k-context-initialize.c
+libscorecpu_a_SOURCES += or1k-context-switch.S
libscorecpu_a_SOURCES += or1k-context-validate.S
libscorecpu_a_SOURCES += or1k-context-volatile-clobber.S
libscorecpu_a_SOURCES += or1k-exception-default.c
diff --git a/cpukit/score/cpu/or1k/include/rtems/score/cpu.h b/cpukit/score/cpu/or1k/include/rtems/score/cpu.h
index 648a7a6b9c..1dedeb6629 100644
--- a/cpukit/score/cpu/or1k/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/or1k/include/rtems/score/cpu.h
@@ -665,8 +665,6 @@ void _CPU_Context_Initialize(
#define CPU_MAXIMUM_PROCESSORS 32
#ifndef ASM
-typedef uint32_t CPU_Counter_ticks;
-
typedef struct {
uint32_t r[32];
@@ -856,6 +854,8 @@ static inline unsigned int CPU_swap_u32(
typedef uint32_t CPU_Counter_ticks;
+uint32_t _CPU_Counter_frequency( void );
+
CPU_Counter_ticks _CPU_Counter_read( void );
CPU_Counter_ticks _CPU_Counter_difference(
diff --git a/cpukit/score/cpu/powerpc/include/rtems/score/cpu.h b/cpukit/score/cpu/powerpc/include/rtems/score/cpu.h
index 31e74aba95..db2479b210 100644
--- a/cpukit/score/cpu/powerpc/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/powerpc/include/rtems/score/cpu.h
@@ -803,6 +803,8 @@ static inline uint32_t CPU_swap_u32(
typedef uint32_t CPU_Counter_ticks;
+uint32_t _CPU_Counter_frequency( void );
+
static inline CPU_Counter_ticks _CPU_Counter_read( void )
{
CPU_Counter_ticks value;
diff --git a/cpukit/score/cpu/riscv/Makefile.am b/cpukit/score/cpu/riscv/Makefile.am
index 3630c038a7..e7714686f2 100644
--- a/cpukit/score/cpu/riscv/Makefile.am
+++ b/cpukit/score/cpu/riscv/Makefile.am
@@ -2,6 +2,7 @@ include $(top_srcdir)/automake/compile.am
noinst_LIBRARIES = libscorecpu.a
libscorecpu_a_CPPFLAGS = $(AM_CPPFLAGS)
libscorecpu_a_SOURCES = cpu.c
+libscorecpu_a_SOURCES += ../no_cpu/cpucounterfrequency.c
libscorecpu_a_SOURCES += riscv-exception-handler.S
libscorecpu_a_SOURCES += riscv-exception-default.c
libscorecpu_a_SOURCES += riscv-exception-frame-print.c
diff --git a/cpukit/score/cpu/riscv/include/rtems/score/cpu.h b/cpukit/score/cpu/riscv/include/rtems/score/cpu.h
index 6f286e0bd8..663dd090f2 100644
--- a/cpukit/score/cpu/riscv/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/riscv/include/rtems/score/cpu.h
@@ -474,6 +474,8 @@ static inline void _CPU_Context_validate( uintptr_t pattern )
typedef uint32_t CPU_Counter_ticks;
+uint32_t _CPU_Counter_frequency( void );
+
CPU_Counter_ticks _CPU_Counter_read( void );
#ifdef RTEMS_SMP
diff --git a/cpukit/score/cpu/sh/Makefile.am b/cpukit/score/cpu/sh/Makefile.am
index 6a19ce4cb8..37188443ff 100644
--- a/cpukit/score/cpu/sh/Makefile.am
+++ b/cpukit/score/cpu/sh/Makefile.am
@@ -2,6 +2,7 @@ include $(top_srcdir)/automake/compile.am
noinst_LIBRARIES = libscorecpu.a
libscorecpu_a_SOURCES = cpu.c context.c
+libscorecpu_a_SOURCES += ../no_cpu/cpucounterfrequency.c
libscorecpu_a_SOURCES += ../no_cpu/cpucounterread.c
libscorecpu_a_SOURCES += sh-exception-frame-print.c
libscorecpu_a_CPPFLAGS = $(AM_CPPFLAGS)
diff --git a/cpukit/score/cpu/sh/include/rtems/score/cpu.h b/cpukit/score/cpu/sh/include/rtems/score/cpu.h
index aeef5defdd..79453bc1ac 100644
--- a/cpukit/score/cpu/sh/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/sh/include/rtems/score/cpu.h
@@ -721,6 +721,8 @@ void _CPU_Exception_frame_print( const CPU_Exception_frame *frame );
typedef uint32_t CPU_Counter_ticks;
+uint32_t _CPU_Counter_frequency( void );
+
CPU_Counter_ticks _CPU_Counter_read( void );
static inline CPU_Counter_ticks _CPU_Counter_difference(
diff --git a/cpukit/score/cpu/sparc/include/rtems/score/cpu.h b/cpukit/score/cpu/sparc/include/rtems/score/cpu.h
index be02dcf9d3..76c8e429e0 100644
--- a/cpukit/score/cpu/sparc/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/sparc/include/rtems/score/cpu.h
@@ -1158,6 +1158,8 @@ static inline uint32_t CPU_swap_u32(
typedef uint32_t CPU_Counter_ticks;
+uint32_t _CPU_Counter_frequency( void );
+
typedef CPU_Counter_ticks ( *SPARC_Counter_read )( void );
typedef CPU_Counter_ticks ( *SPARC_Counter_difference )(
diff --git a/cpukit/score/cpu/sparc64/Makefile.am b/cpukit/score/cpu/sparc64/Makefile.am
index 6cd23f0c95..711036e41a 100644
--- a/cpukit/score/cpu/sparc64/Makefile.am
+++ b/cpukit/score/cpu/sparc64/Makefile.am
@@ -5,6 +5,7 @@ libscorecpu_a_SOURCES =
libscorecpu_a_SOURCES += context.S
libscorecpu_a_SOURCES += cpu.c
libscorecpu_a_SOURCES += interrupt.S
+libscorecpu_a_SOURCES += ../no_cpu/cpucounterfrequency.c
libscorecpu_a_SOURCES += ../no_cpu/cpucounterread.c
libscorecpu_a_SOURCES += sparc64-exception-frame-print.c
libscorecpu_a_SOURCES += sparc64-syscall.S
diff --git a/cpukit/score/cpu/sparc64/include/rtems/score/cpu.h b/cpukit/score/cpu/sparc64/include/rtems/score/cpu.h
index 9db7cc3134..f1412e0bbb 100644
--- a/cpukit/score/cpu/sparc64/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/sparc64/include/rtems/score/cpu.h
@@ -1032,6 +1032,8 @@ static inline uint32_t CPU_swap_u32(
typedef uint32_t CPU_Counter_ticks;
+uint32_t _CPU_Counter_frequency( void );
+
CPU_Counter_ticks _CPU_Counter_read( void );
static inline CPU_Counter_ticks _CPU_Counter_difference(
diff --git a/cpukit/score/cpu/v850/Makefile.am b/cpukit/score/cpu/v850/Makefile.am
index 15867801a5..8db039c9f5 100644
--- a/cpukit/score/cpu/v850/Makefile.am
+++ b/cpukit/score/cpu/v850/Makefile.am
@@ -3,6 +3,7 @@ include $(top_srcdir)/automake/compile.am
noinst_LIBRARIES = libscorecpu.a
libscorecpu_a_SOURCES = cpu.c
libscorecpu_a_SOURCES += cpu_asm.S
+libscorecpu_a_SOURCES += ../no_cpu/cpucounterfrequency.c
libscorecpu_a_SOURCES += ../no_cpu/cpucounterread.c
libscorecpu_a_SOURCES += v850-exception-frame-print.c
libscorecpu_a_CPPFLAGS = $(AM_CPPFLAGS)
diff --git a/cpukit/score/cpu/v850/include/rtems/score/cpu.h b/cpukit/score/cpu/v850/include/rtems/score/cpu.h
index 620d228146..5c65f8532f 100644
--- a/cpukit/score/cpu/v850/include/rtems/score/cpu.h
+++ b/cpukit/score/cpu/v850/include/rtems/score/cpu.h
@@ -934,6 +934,8 @@ static inline uint16_t CPU_swap_u16( uint16_t value )
typedef uint32_t CPU_Counter_ticks;
+uint32_t _CPU_Counter_frequency( void );
+
CPU_Counter_ticks _CPU_Counter_read( void );
static inline CPU_Counter_ticks _CPU_Counter_difference(