summaryrefslogtreecommitdiffstats
path: root/cpukit/score/cpu/powerpc/rtems/score
diff options
context:
space:
mode:
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