summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-06-22 13:45:02 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-06-22 14:00:27 +0200
commit655ce0fb00c75c523dd81466a2dcf611171e4650 (patch)
tree91713d5a3efc4b935efb16101e449fb298caa238
parent3d9fd2ce55575e603fa9e781cc66f553e917fd3b (diff)
downloadrtems-655ce0fb00c75c523dd81466a2dcf611171e4650.tar.bz2
sparc: Optimize CPU counter support
-rw-r--r--c/src/lib/libbsp/sparc/erc32/clock/ckinit.c7
-rw-r--r--c/src/lib/libbsp/sparc/leon2/clock/ckinit.c7
-rw-r--r--c/src/lib/libbsp/sparc/leon3/startup/cpucounter.c7
-rw-r--r--cpukit/score/cpu/sparc/Makefile.am1
-rw-r--r--cpukit/score/cpu/sparc/preinstall.am4
-rw-r--r--cpukit/score/cpu/sparc/rtems/score/cpu.h39
-rw-r--r--cpukit/score/cpu/sparc/rtems/score/sparcimpl.h90
-rw-r--r--cpukit/score/cpu/sparc/sparc-counter.c2
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 cb5cee86fc..fd05a2cf59 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 f21bd18720..ced5d3fa06 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 53d921a66a..7aaf98a2fc 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 11b5d11d7f..2de5fcad73 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 a2bb01bfd2..c2df31c6c5 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 c87618db85..5823544a80 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 0000000000..9f9999b063
--- /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@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\",@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 658a47c37e..9bc4061e9e 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(