[rtems commit] sparc: Optimize CPU counter support

Sebastian Huber sebh at rtems.org
Wed Jun 22 12:13:54 UTC 2016


Module:    rtems
Branch:    master
Commit:    655ce0fb00c75c523dd81466a2dcf611171e4650
Changeset: http://git.rtems.org/rtems/commit/?id=655ce0fb00c75c523dd81466a2dcf611171e4650

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Wed Jun 22 13:45:02 2016 +0200

sparc: Optimize CPU counter support

---

 c/src/lib/libbsp/sparc/erc32/clock/ckinit.c       |  7 +-
 c/src/lib/libbsp/sparc/leon2/clock/ckinit.c       |  7 +-
 c/src/lib/libbsp/sparc/leon3/startup/cpucounter.c |  7 +-
 cpukit/score/cpu/sparc/Makefile.am                |  1 +
 cpukit/score/cpu/sparc/preinstall.am              |  4 +
 cpukit/score/cpu/sparc/rtems/score/cpu.h          | 39 +---------
 cpukit/score/cpu/sparc/rtems/score/sparcimpl.h    | 90 +++++++++++++++++++++++
 cpukit/score/cpu/sparc/sparc-counter.c            |  2 +-
 8 files changed, 104 insertions(+), 53 deletions(-)

diff --git a/c/src/lib/libbsp/sparc/erc32/clock/ckinit.c b/c/src/lib/libbsp/sparc/erc32/clock/ckinit.c
index cb5cee8..fd05a2c 100644
--- a/c/src/lib/libbsp/sparc/erc32/clock/ckinit.c
+++ b/c/src/lib/libbsp/sparc/erc32/clock/ckinit.c
@@ -26,6 +26,7 @@
 #include <bspopts.h>
 #include <rtems/counter.h>
 #include <rtems/timecounter.h>
+#include <rtems/score/sparcimpl.h>
 
 #if SIMSPARC_FAST_IDLE==1
 #define CLOCK_DRIVER_USE_FAST_IDLE 1
@@ -133,8 +134,4 @@ static void erc32_counter_initialize( uint32_t frequency )
 
 #include "../../../shared/clockdrv_shell.h"
 
-SPARC_Counter _SPARC_Counter = {
-  .counter_read = _SPARC_Counter_read_address,
-  .counter_difference = _SPARC_Counter_difference_one,
-  .counter_address = (uint32_t *) &_SPARC_Counter
-};
+SPARC_COUNTER_DEFINITION;
diff --git a/c/src/lib/libbsp/sparc/leon2/clock/ckinit.c b/c/src/lib/libbsp/sparc/leon2/clock/ckinit.c
index f21bd18..ced5d3f 100644
--- a/c/src/lib/libbsp/sparc/leon2/clock/ckinit.c
+++ b/c/src/lib/libbsp/sparc/leon2/clock/ckinit.c
@@ -25,6 +25,7 @@
 #include <bsp.h>
 #include <bspopts.h>
 #include <rtems/timecounter.h>
+#include <rtems/score/sparcimpl.h>
 
 #if SIMSPARC_FAST_IDLE==1
 #define CLOCK_DRIVER_USE_FAST_IDLE 1
@@ -106,8 +107,4 @@ extern int CLOCK_SPEED;
 
 #include "../../../shared/clockdrv_shell.h"
 
-SPARC_Counter _SPARC_Counter = {
-  .counter_read = _SPARC_Counter_read_address,
-  .counter_difference = _SPARC_Counter_difference_one,
-  .counter_address = (uint32_t *) &_SPARC_Counter
-};
+SPARC_COUNTER_DEFINITION;
diff --git a/c/src/lib/libbsp/sparc/leon3/startup/cpucounter.c b/c/src/lib/libbsp/sparc/leon3/startup/cpucounter.c
index 53d921a..7aaf98a 100644
--- a/c/src/lib/libbsp/sparc/leon3/startup/cpucounter.c
+++ b/c/src/lib/libbsp/sparc/leon3/startup/cpucounter.c
@@ -16,6 +16,7 @@
 
 #include <rtems/counter.h>
 #include <rtems/sysinit.h>
+#include <rtems/score/sparcimpl.h>
 
 static void leon3_counter_initialize(void)
 {
@@ -73,8 +74,4 @@ RTEMS_SYSINIT_ITEM(
   RTEMS_SYSINIT_ORDER_THIRD
 );
 
-SPARC_Counter _SPARC_Counter = {
-  .counter_read = _SPARC_Counter_read_address,
-  .counter_difference = _SPARC_Counter_difference_one,
-  .counter_address = (uint32_t *) &_SPARC_Counter
-};
+SPARC_COUNTER_DEFINITION;
diff --git a/cpukit/score/cpu/sparc/Makefile.am b/cpukit/score/cpu/sparc/Makefile.am
index 11b5d11..2de5fca 100644
--- a/cpukit/score/cpu/sparc/Makefile.am
+++ b/cpukit/score/cpu/sparc/Makefile.am
@@ -6,6 +6,7 @@ include_rtems_HEADERS = rtems/asm.h
 include_rtems_scoredir = $(includedir)/rtems/score
 include_rtems_score_HEADERS = rtems/score/sparc.h
 include_rtems_score_HEADERS += rtems/score/cpu.h
+include_rtems_score_HEADERS += rtems/score/sparcimpl.h
 include_rtems_score_HEADERS += rtems/score/types.h
 include_rtems_score_HEADERS += rtems/score/cpuatomic.h
 
diff --git a/cpukit/score/cpu/sparc/preinstall.am b/cpukit/score/cpu/sparc/preinstall.am
index a2bb01b..c2df31c 100644
--- a/cpukit/score/cpu/sparc/preinstall.am
+++ b/cpukit/score/cpu/sparc/preinstall.am
@@ -35,6 +35,10 @@ $(PROJECT_INCLUDE)/rtems/score/cpu.h: rtems/score/cpu.h $(PROJECT_INCLUDE)/rtems
 	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/cpu.h
 PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/cpu.h
 
+$(PROJECT_INCLUDE)/rtems/score/sparcimpl.h: rtems/score/sparcimpl.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
+	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/sparcimpl.h
+PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/sparcimpl.h
+
 $(PROJECT_INCLUDE)/rtems/score/types.h: rtems/score/types.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
 	$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/types.h
 PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/types.h
diff --git a/cpukit/score/cpu/sparc/rtems/score/cpu.h b/cpukit/score/cpu/sparc/rtems/score/cpu.h
index c87618d..5823544 100644
--- a/cpukit/score/cpu/sparc/rtems/score/cpu.h
+++ b/cpukit/score/cpu/sparc/rtems/score/cpu.h
@@ -1306,7 +1306,7 @@ typedef uint32_t CPU_Counter_ticks;
 
 typedef CPU_Counter_ticks ( *SPARC_Counter_read )( void );
 
-typedef CPU_Counter_ticks (*SPARC_Counter_difference)(
+typedef CPU_Counter_ticks ( *SPARC_Counter_difference )(
   CPU_Counter_ticks second,
   CPU_Counter_ticks first
 );
@@ -1324,42 +1324,7 @@ typedef struct {
   volatile const CPU_Counter_ticks *counter_address;
 } SPARC_Counter;
 
-extern SPARC_Counter _SPARC_Counter;
-
-CPU_Counter_ticks _SPARC_Counter_read_address( void );
-
-CPU_Counter_ticks _SPARC_Counter_read_asr23( void );
-
-CPU_Counter_ticks _SPARC_Counter_difference_normal(
-  CPU_Counter_ticks second,
-  CPU_Counter_ticks first
-);
-
-CPU_Counter_ticks _SPARC_Counter_difference_clock_period(
-  CPU_Counter_ticks second,
-  CPU_Counter_ticks first
-);
-
-/*
- * Returns always a value of one regardless of the parameters.  This prevents
- * an infinite loop in rtems_counter_delay_ticks().  Its only a reasonably safe
- * default.
- */
-CPU_Counter_ticks _SPARC_Counter_difference_one(
-  CPU_Counter_ticks second,
-  CPU_Counter_ticks first
-);
-
-static inline void _SPARC_Counter_initialize(
-  SPARC_Counter_read                counter_read,
-  SPARC_Counter_difference          counter_difference,
-  volatile const CPU_Counter_ticks *counter_address
-)
-{
-  _SPARC_Counter.counter_read = counter_read;
-  _SPARC_Counter.counter_difference = counter_difference;
-  _SPARC_Counter.counter_address = counter_address;
-}
+extern const SPARC_Counter _SPARC_Counter;
 
 static inline CPU_Counter_ticks _CPU_Counter_read( void )
 {
diff --git a/cpukit/score/cpu/sparc/rtems/score/sparcimpl.h b/cpukit/score/cpu/sparc/rtems/score/sparcimpl.h
new file mode 100644
index 0000000..9f9999b
--- /dev/null
+++ b/cpukit/score/cpu/sparc/rtems/score/sparcimpl.h
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2016 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_SPARCIMPL_H
+#define _RTEMS_SCORE_SPARCIMPL_H
+
+#include <rtems/score/cpu.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*
+ * Provides a mutable alias to _SPARC_Counter for use in
+ * _SPARC_Counter_initialize().  The _SPARC_Counter and _SPARC_Counter_mutable
+ * are defined via the SPARC_COUNTER_DEFINITION define.
+ */
+extern SPARC_Counter _SPARC_Counter_mutable;
+
+CPU_Counter_ticks _SPARC_Counter_read_address( void );
+
+CPU_Counter_ticks _SPARC_Counter_read_asr23( void );
+
+CPU_Counter_ticks _SPARC_Counter_difference_normal(
+  CPU_Counter_ticks second,
+  CPU_Counter_ticks first
+);
+
+CPU_Counter_ticks _SPARC_Counter_difference_clock_period(
+  CPU_Counter_ticks second,
+  CPU_Counter_ticks first
+);
+
+/*
+ * Returns always a value of one regardless of the parameters.  This prevents
+ * an infinite loop in rtems_counter_delay_ticks().  Its only a reasonably safe
+ * default.
+ */
+CPU_Counter_ticks _SPARC_Counter_difference_one(
+  CPU_Counter_ticks second,
+  CPU_Counter_ticks first
+);
+
+static inline void _SPARC_Counter_initialize(
+  SPARC_Counter_read                counter_read,
+  SPARC_Counter_difference          counter_difference,
+  volatile const CPU_Counter_ticks *counter_address
+)
+{
+  _SPARC_Counter_mutable.counter_read = counter_read;
+  _SPARC_Counter_mutable.counter_difference = counter_difference;
+  _SPARC_Counter_mutable.counter_address = counter_address;
+}
+
+/*
+ * Defines the _SPARC_Counter and _SPARC_Counter_mutable global variables.
+ * Place this define in the global file scope of the CPU counter support file
+ * of the BSP.
+ */
+#define SPARC_COUNTER_DEFINITION \
+  __asm__ ( \
+    "\t.global\t_SPARC_Counter\n" \
+    "\t.global\t_SPARC_Counter_mutable\n" \
+    "\t.section\t.data._SPARC_Counter,\"aw\", at progbits\n" \
+    "\t.align\t4\n" \
+    "\t.type\t_SPARC_Counter, #object\n" \
+    "\t.size\t_SPARC_Counter, 12\n" \
+    "_SPARC_Counter:\n" \
+    "_SPARC_Counter_mutable:\n" \
+    "\t.long\t_SPARC_Counter_read_address\n" \
+    "\t.long\t_SPARC_Counter_difference_one\n" \
+    "\t.long\t_SPARC_Counter\n" \
+  )
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _RTEMS_SCORE_SPARCIMPL_H */
diff --git a/cpukit/score/cpu/sparc/sparc-counter.c b/cpukit/score/cpu/sparc/sparc-counter.c
index 658a47c..9bc4061 100644
--- a/cpukit/score/cpu/sparc/sparc-counter.c
+++ b/cpukit/score/cpu/sparc/sparc-counter.c
@@ -16,7 +16,7 @@
   #include "config.h"
 #endif
 
-#include <rtems/score/cpu.h>
+#include <rtems/score/sparcimpl.h>
 #include <rtems/config.h>
 
 CPU_Counter_ticks _SPARC_Counter_difference_normal(



More information about the vc mailing list