summaryrefslogtreecommitdiffstats
path: root/cpukit/score/cpu/powerpc/cpu.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/score/cpu/powerpc/cpu.c')
-rw-r--r--cpukit/score/cpu/powerpc/cpu.c227
1 files changed, 222 insertions, 5 deletions
diff --git a/cpukit/score/cpu/powerpc/cpu.c b/cpukit/score/cpu/powerpc/cpu.c
index 5383a8ee24..fafc9a686b 100644
--- a/cpukit/score/cpu/powerpc/cpu.c
+++ b/cpukit/score/cpu/powerpc/cpu.c
@@ -5,9 +5,11 @@
*/
/*
- * 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.
+ * Copyright (C) 2009, 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.
*/
/*
@@ -19,8 +21,7 @@
#include "config.h"
#endif
-#include <rtems/system.h>
-#include <rtems/score/cpu.h>
+#include <rtems/score/cpuimpl.h>
#define PPC_ASSERT_OFFSET(field, off) \
RTEMS_STATIC_ASSERT( \
@@ -102,3 +103,219 @@ RTEMS_STATIC_ASSERT(
sizeof(Context_Control) % PPC_DEFAULT_CACHE_LINE_SIZE == 0,
ppc_context_size
);
+
+#define PPC_EXC_ASSERT_OFFSET(field, off) \
+ RTEMS_STATIC_ASSERT( \
+ offsetof(CPU_Exception_frame, field) + FRAME_LINK_SPACE == off, \
+ CPU_Exception_frame_offset_ ## field \
+ )
+
+#define PPC_EXC_ASSERT_CANONIC_OFFSET(field) \
+ PPC_EXC_ASSERT_OFFSET(field, field ## _OFFSET)
+
+#define PPC_EXC_MIN_ASSERT_OFFSET(field, off) \
+ RTEMS_STATIC_ASSERT( \
+ offsetof(CPU_Interrupt_frame, field) == off, \
+ CPU_Interrupt_frame_offset_ ## field \
+ )
+
+#define PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(field) \
+ PPC_EXC_MIN_ASSERT_OFFSET(field, field ## _OFFSET)
+
+PPC_EXC_ASSERT_OFFSET(EXC_SRR0, SRR0_FRAME_OFFSET);
+PPC_EXC_ASSERT_OFFSET(EXC_SRR1, SRR1_FRAME_OFFSET);
+PPC_EXC_ASSERT_OFFSET(_EXC_number, EXCEPTION_NUMBER_OFFSET);
+PPC_EXC_ASSERT_CANONIC_OFFSET(EXC_CR);
+PPC_EXC_ASSERT_CANONIC_OFFSET(EXC_CTR);
+PPC_EXC_ASSERT_CANONIC_OFFSET(EXC_XER);
+PPC_EXC_ASSERT_CANONIC_OFFSET(EXC_LR);
+#ifdef __SPE__
+ PPC_EXC_ASSERT_OFFSET(EXC_SPEFSCR, PPC_EXC_SPEFSCR_OFFSET);
+ PPC_EXC_ASSERT_OFFSET(EXC_ACC, PPC_EXC_ACC_OFFSET);
+#endif
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR0);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR1);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR2);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR3);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR4);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR5);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR6);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR7);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR8);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR9);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR10);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR11);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR12);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR13);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR14);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR15);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR16);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR17);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR18);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR19);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR20);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR21);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR22);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR23);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR24);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR25);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR26);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR27);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR28);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR29);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR30);
+PPC_EXC_ASSERT_CANONIC_OFFSET(GPR31);
+
+PPC_EXC_MIN_ASSERT_OFFSET(EXC_SRR0, SRR0_FRAME_OFFSET);
+PPC_EXC_MIN_ASSERT_OFFSET(EXC_SRR1, SRR1_FRAME_OFFSET);
+PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(EXC_CR);
+PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(EXC_CTR);
+PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(EXC_XER);
+PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(EXC_LR);
+#ifdef __SPE__
+ PPC_EXC_MIN_ASSERT_OFFSET(EXC_SPEFSCR, PPC_EXC_SPEFSCR_OFFSET);
+ PPC_EXC_MIN_ASSERT_OFFSET(EXC_ACC, PPC_EXC_ACC_OFFSET);
+#endif
+PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(GPR0);
+PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(GPR1);
+PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(GPR2);
+PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(GPR3);
+PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(GPR4);
+PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(GPR5);
+PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(GPR6);
+PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(GPR7);
+PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(GPR8);
+PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(GPR9);
+PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(GPR10);
+PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(GPR11);
+PPC_EXC_MIN_ASSERT_CANONIC_OFFSET(GPR12);
+
+#ifdef PPC_MULTILIB_ALTIVEC
+PPC_EXC_ASSERT_OFFSET(VSCR, PPC_EXC_VSCR_OFFSET);
+PPC_EXC_ASSERT_OFFSET(VRSAVE, PPC_EXC_VRSAVE_OFFSET);
+RTEMS_STATIC_ASSERT(PPC_EXC_VR_OFFSET(0) % 16 == 0, PPC_EXC_VR_OFFSET);
+PPC_EXC_ASSERT_OFFSET(V0, PPC_EXC_VR_OFFSET(0));
+PPC_EXC_ASSERT_OFFSET(V1, PPC_EXC_VR_OFFSET(1));
+PPC_EXC_ASSERT_OFFSET(V2, PPC_EXC_VR_OFFSET(2));
+PPC_EXC_ASSERT_OFFSET(V3, PPC_EXC_VR_OFFSET(3));
+PPC_EXC_ASSERT_OFFSET(V4, PPC_EXC_VR_OFFSET(4));
+PPC_EXC_ASSERT_OFFSET(V5, PPC_EXC_VR_OFFSET(5));
+PPC_EXC_ASSERT_OFFSET(V6, PPC_EXC_VR_OFFSET(6));
+PPC_EXC_ASSERT_OFFSET(V7, PPC_EXC_VR_OFFSET(7));
+PPC_EXC_ASSERT_OFFSET(V8, PPC_EXC_VR_OFFSET(8));
+PPC_EXC_ASSERT_OFFSET(V9, PPC_EXC_VR_OFFSET(9));
+PPC_EXC_ASSERT_OFFSET(V10, PPC_EXC_VR_OFFSET(10));
+PPC_EXC_ASSERT_OFFSET(V11, PPC_EXC_VR_OFFSET(11));
+PPC_EXC_ASSERT_OFFSET(V12, PPC_EXC_VR_OFFSET(12));
+PPC_EXC_ASSERT_OFFSET(V13, PPC_EXC_VR_OFFSET(13));
+PPC_EXC_ASSERT_OFFSET(V14, PPC_EXC_VR_OFFSET(14));
+PPC_EXC_ASSERT_OFFSET(V15, PPC_EXC_VR_OFFSET(15));
+PPC_EXC_ASSERT_OFFSET(V16, PPC_EXC_VR_OFFSET(16));
+PPC_EXC_ASSERT_OFFSET(V17, PPC_EXC_VR_OFFSET(17));
+PPC_EXC_ASSERT_OFFSET(V18, PPC_EXC_VR_OFFSET(18));
+PPC_EXC_ASSERT_OFFSET(V19, PPC_EXC_VR_OFFSET(19));
+PPC_EXC_ASSERT_OFFSET(V20, PPC_EXC_VR_OFFSET(20));
+PPC_EXC_ASSERT_OFFSET(V21, PPC_EXC_VR_OFFSET(21));
+PPC_EXC_ASSERT_OFFSET(V22, PPC_EXC_VR_OFFSET(22));
+PPC_EXC_ASSERT_OFFSET(V23, PPC_EXC_VR_OFFSET(23));
+PPC_EXC_ASSERT_OFFSET(V24, PPC_EXC_VR_OFFSET(24));
+PPC_EXC_ASSERT_OFFSET(V25, PPC_EXC_VR_OFFSET(25));
+PPC_EXC_ASSERT_OFFSET(V26, PPC_EXC_VR_OFFSET(26));
+PPC_EXC_ASSERT_OFFSET(V27, PPC_EXC_VR_OFFSET(27));
+PPC_EXC_ASSERT_OFFSET(V28, PPC_EXC_VR_OFFSET(28));
+PPC_EXC_ASSERT_OFFSET(V29, PPC_EXC_VR_OFFSET(29));
+PPC_EXC_ASSERT_OFFSET(V30, PPC_EXC_VR_OFFSET(30));
+PPC_EXC_ASSERT_OFFSET(V31, PPC_EXC_VR_OFFSET(31));
+
+PPC_EXC_MIN_ASSERT_OFFSET(VSCR, PPC_EXC_MIN_VSCR_OFFSET);
+RTEMS_STATIC_ASSERT(PPC_EXC_MIN_VR_OFFSET(0) % 16 == 0, PPC_EXC_MIN_VR_OFFSET);
+PPC_EXC_MIN_ASSERT_OFFSET(V0, PPC_EXC_MIN_VR_OFFSET(0));
+PPC_EXC_MIN_ASSERT_OFFSET(V1, PPC_EXC_MIN_VR_OFFSET(1));
+PPC_EXC_MIN_ASSERT_OFFSET(V2, PPC_EXC_MIN_VR_OFFSET(2));
+PPC_EXC_MIN_ASSERT_OFFSET(V3, PPC_EXC_MIN_VR_OFFSET(3));
+PPC_EXC_MIN_ASSERT_OFFSET(V4, PPC_EXC_MIN_VR_OFFSET(4));
+PPC_EXC_MIN_ASSERT_OFFSET(V5, PPC_EXC_MIN_VR_OFFSET(5));
+PPC_EXC_MIN_ASSERT_OFFSET(V6, PPC_EXC_MIN_VR_OFFSET(6));
+PPC_EXC_MIN_ASSERT_OFFSET(V7, PPC_EXC_MIN_VR_OFFSET(7));
+PPC_EXC_MIN_ASSERT_OFFSET(V8, PPC_EXC_MIN_VR_OFFSET(8));
+PPC_EXC_MIN_ASSERT_OFFSET(V9, PPC_EXC_MIN_VR_OFFSET(9));
+PPC_EXC_MIN_ASSERT_OFFSET(V10, PPC_EXC_MIN_VR_OFFSET(10));
+PPC_EXC_MIN_ASSERT_OFFSET(V11, PPC_EXC_MIN_VR_OFFSET(11));
+PPC_EXC_MIN_ASSERT_OFFSET(V12, PPC_EXC_MIN_VR_OFFSET(12));
+PPC_EXC_MIN_ASSERT_OFFSET(V13, PPC_EXC_MIN_VR_OFFSET(13));
+PPC_EXC_MIN_ASSERT_OFFSET(V14, PPC_EXC_MIN_VR_OFFSET(14));
+PPC_EXC_MIN_ASSERT_OFFSET(V15, PPC_EXC_MIN_VR_OFFSET(15));
+PPC_EXC_MIN_ASSERT_OFFSET(V16, PPC_EXC_MIN_VR_OFFSET(16));
+PPC_EXC_MIN_ASSERT_OFFSET(V17, PPC_EXC_MIN_VR_OFFSET(17));
+PPC_EXC_MIN_ASSERT_OFFSET(V18, PPC_EXC_MIN_VR_OFFSET(18));
+PPC_EXC_MIN_ASSERT_OFFSET(V19, PPC_EXC_MIN_VR_OFFSET(19));
+#endif
+
+#ifdef PPC_MULTILIB_FPU
+RTEMS_STATIC_ASSERT(PPC_EXC_FR_OFFSET(0) % 8 == 0, PPC_EXC_FR_OFFSET);
+PPC_EXC_ASSERT_OFFSET(F0, PPC_EXC_FR_OFFSET(0));
+PPC_EXC_ASSERT_OFFSET(F1, PPC_EXC_FR_OFFSET(1));
+PPC_EXC_ASSERT_OFFSET(F2, PPC_EXC_FR_OFFSET(2));
+PPC_EXC_ASSERT_OFFSET(F3, PPC_EXC_FR_OFFSET(3));
+PPC_EXC_ASSERT_OFFSET(F4, PPC_EXC_FR_OFFSET(4));
+PPC_EXC_ASSERT_OFFSET(F5, PPC_EXC_FR_OFFSET(5));
+PPC_EXC_ASSERT_OFFSET(F6, PPC_EXC_FR_OFFSET(6));
+PPC_EXC_ASSERT_OFFSET(F7, PPC_EXC_FR_OFFSET(7));
+PPC_EXC_ASSERT_OFFSET(F8, PPC_EXC_FR_OFFSET(8));
+PPC_EXC_ASSERT_OFFSET(F9, PPC_EXC_FR_OFFSET(9));
+PPC_EXC_ASSERT_OFFSET(F10, PPC_EXC_FR_OFFSET(10));
+PPC_EXC_ASSERT_OFFSET(F11, PPC_EXC_FR_OFFSET(11));
+PPC_EXC_ASSERT_OFFSET(F12, PPC_EXC_FR_OFFSET(12));
+PPC_EXC_ASSERT_OFFSET(F13, PPC_EXC_FR_OFFSET(13));
+PPC_EXC_ASSERT_OFFSET(F14, PPC_EXC_FR_OFFSET(14));
+PPC_EXC_ASSERT_OFFSET(F15, PPC_EXC_FR_OFFSET(15));
+PPC_EXC_ASSERT_OFFSET(F16, PPC_EXC_FR_OFFSET(16));
+PPC_EXC_ASSERT_OFFSET(F17, PPC_EXC_FR_OFFSET(17));
+PPC_EXC_ASSERT_OFFSET(F18, PPC_EXC_FR_OFFSET(18));
+PPC_EXC_ASSERT_OFFSET(F19, PPC_EXC_FR_OFFSET(19));
+PPC_EXC_ASSERT_OFFSET(F20, PPC_EXC_FR_OFFSET(20));
+PPC_EXC_ASSERT_OFFSET(F21, PPC_EXC_FR_OFFSET(21));
+PPC_EXC_ASSERT_OFFSET(F22, PPC_EXC_FR_OFFSET(22));
+PPC_EXC_ASSERT_OFFSET(F23, PPC_EXC_FR_OFFSET(23));
+PPC_EXC_ASSERT_OFFSET(F24, PPC_EXC_FR_OFFSET(24));
+PPC_EXC_ASSERT_OFFSET(F25, PPC_EXC_FR_OFFSET(25));
+PPC_EXC_ASSERT_OFFSET(F26, PPC_EXC_FR_OFFSET(26));
+PPC_EXC_ASSERT_OFFSET(F27, PPC_EXC_FR_OFFSET(27));
+PPC_EXC_ASSERT_OFFSET(F28, PPC_EXC_FR_OFFSET(28));
+PPC_EXC_ASSERT_OFFSET(F29, PPC_EXC_FR_OFFSET(29));
+PPC_EXC_ASSERT_OFFSET(F30, PPC_EXC_FR_OFFSET(30));
+PPC_EXC_ASSERT_OFFSET(F31, PPC_EXC_FR_OFFSET(31));
+PPC_EXC_ASSERT_OFFSET(FPSCR, PPC_EXC_FPSCR_OFFSET);
+
+RTEMS_STATIC_ASSERT(PPC_EXC_MIN_FR_OFFSET(0) % 8 == 0, PPC_EXC_MIN_FR_OFFSET);
+PPC_EXC_MIN_ASSERT_OFFSET(F0, PPC_EXC_MIN_FR_OFFSET(0));
+PPC_EXC_MIN_ASSERT_OFFSET(F1, PPC_EXC_MIN_FR_OFFSET(1));
+PPC_EXC_MIN_ASSERT_OFFSET(F2, PPC_EXC_MIN_FR_OFFSET(2));
+PPC_EXC_MIN_ASSERT_OFFSET(F3, PPC_EXC_MIN_FR_OFFSET(3));
+PPC_EXC_MIN_ASSERT_OFFSET(F4, PPC_EXC_MIN_FR_OFFSET(4));
+PPC_EXC_MIN_ASSERT_OFFSET(F5, PPC_EXC_MIN_FR_OFFSET(5));
+PPC_EXC_MIN_ASSERT_OFFSET(F6, PPC_EXC_MIN_FR_OFFSET(6));
+PPC_EXC_MIN_ASSERT_OFFSET(F7, PPC_EXC_MIN_FR_OFFSET(7));
+PPC_EXC_MIN_ASSERT_OFFSET(F8, PPC_EXC_MIN_FR_OFFSET(8));
+PPC_EXC_MIN_ASSERT_OFFSET(F9, PPC_EXC_MIN_FR_OFFSET(9));
+PPC_EXC_MIN_ASSERT_OFFSET(F10, PPC_EXC_MIN_FR_OFFSET(10));
+PPC_EXC_MIN_ASSERT_OFFSET(F11, PPC_EXC_MIN_FR_OFFSET(11));
+PPC_EXC_MIN_ASSERT_OFFSET(F12, PPC_EXC_MIN_FR_OFFSET(12));
+PPC_EXC_MIN_ASSERT_OFFSET(F13, PPC_EXC_MIN_FR_OFFSET(13));
+PPC_EXC_MIN_ASSERT_OFFSET(FPSCR, PPC_EXC_MIN_FPSCR_OFFSET);
+#endif
+
+RTEMS_STATIC_ASSERT(
+ CPU_INTERRUPT_FRAME_SIZE % CPU_STACK_ALIGNMENT == 0,
+ CPU_INTERRUPT_FRAME_SIZE
+);
+
+RTEMS_STATIC_ASSERT(
+ PPC_EXC_FRAME_SIZE % CPU_STACK_ALIGNMENT == 0,
+ PPC_EXC_FRAME_SIZE
+);
+
+RTEMS_STATIC_ASSERT(
+ sizeof(CPU_Exception_frame) + FRAME_LINK_SPACE <= PPC_EXC_FRAME_SIZE,
+ CPU_Exception_frame
+);