summaryrefslogtreecommitdiffstats
path: root/cpukit/score/cpu/powerpc/rtems/score
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-11-09 14:59:33 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-11-10 09:58:37 +0100
commit38a1449fd47be848cc40593abd40262e9ad2030d (patch)
treee559758984306acb4b4f0e0f88e9a133213557f0 /cpukit/score/cpu/powerpc/rtems/score
parentscore: Move _CPU_Get_current_per_CPU_control() (diff)
downloadrtems-38a1449fd47be848cc40593abd40262e9ad2030d.tar.bz2
powerpc: Add _CPU_Get_current_per_CPU_control()
Add _CPU_Get_current_per_CPU_control() on SMP configurations. Use SPRG0 for the current per-CPU control. This reduces the code size by three instructions and is slightly faster. Update #2805.
Diffstat (limited to 'cpukit/score/cpu/powerpc/rtems/score')
-rw-r--r--cpukit/score/cpu/powerpc/rtems/score/cpuimpl.h27
1 files changed, 27 insertions, 0 deletions
diff --git a/cpukit/score/cpu/powerpc/rtems/score/cpuimpl.h b/cpukit/score/cpu/powerpc/rtems/score/cpuimpl.h
index 6b8b601cb0..6b8886d42a 100644
--- a/cpukit/score/cpu/powerpc/rtems/score/cpuimpl.h
+++ b/cpukit/score/cpu/powerpc/rtems/score/cpuimpl.h
@@ -5,6 +5,8 @@
*/
/*
+ * Copyright (c) 2016 embedded brains GmbH
+ *
* 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.
@@ -15,12 +17,37 @@
#include <rtems/score/cpu.h>
+#ifdef RTEMS_SMP
+
+/* Use SPRG0 for the per-CPU control of the current processor */
+#define PPC_PER_CPU_CONTROL_REGISTER 272
+
+#endif /* RTEMS_SMP */
+
#ifndef ASM
#ifdef __cplusplus
extern "C" {
#endif
+#ifdef RTEMS_SMP
+
+static inline struct Per_CPU_Control *_PPC_Get_current_per_CPU_control( void )
+{
+ struct Per_CPU_Control *cpu_self;
+
+ __asm__ volatile (
+ "mfspr %0, " RTEMS_XSTRING( PPC_PER_CPU_CONTROL_REGISTER )
+ : "=r" ( cpu_self )
+ );
+
+ return cpu_self;
+}
+
+#define _CPU_Get_current_per_CPU_control() _PPC_Get_current_per_CPU_control()
+
+#endif /* RTEMS_SMP */
+
#ifdef __cplusplus
}
#endif