diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-06-22 13:45:02 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-06-22 14:00:27 +0200 |
commit | 655ce0fb00c75c523dd81466a2dcf611171e4650 (patch) | |
tree | 91713d5a3efc4b935efb16101e449fb298caa238 /cpukit/score/cpu | |
parent | sptests/sp20: Use printer task (diff) | |
download | rtems-655ce0fb00c75c523dd81466a2dcf611171e4650.tar.bz2 |
sparc: Optimize CPU counter support
Diffstat (limited to 'cpukit/score/cpu')
-rw-r--r-- | cpukit/score/cpu/sparc/Makefile.am | 1 | ||||
-rw-r--r-- | cpukit/score/cpu/sparc/preinstall.am | 4 | ||||
-rw-r--r-- | cpukit/score/cpu/sparc/rtems/score/cpu.h | 39 | ||||
-rw-r--r-- | cpukit/score/cpu/sparc/rtems/score/sparcimpl.h | 90 | ||||
-rw-r--r-- | cpukit/score/cpu/sparc/sparc-counter.c | 2 |
5 files changed, 98 insertions, 38 deletions
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( |