powerpc: Add CPU_Exception_frame

The powerpc port uses now a unified CPU_Exception_frame.  This resulted
in a CPU_Exception_frame layout change for the MPC5XX.
This commit is contained in:
Sebastian Huber
2012-11-26 18:04:12 +01:00
parent f0e3cc0a0a
commit d2202ac56d
4 changed files with 154 additions and 125 deletions

View File

@@ -34,42 +34,42 @@
#define SRR0_FRAME_OFFSET 8 #define SRR0_FRAME_OFFSET 8
#define SRR1_FRAME_OFFSET 12 #define SRR1_FRAME_OFFSET 12
#define EXCEPTION_NUMBER_OFFSET 16 #define EXCEPTION_NUMBER_OFFSET 16
#define GPR0_OFFSET 20 #define EXC_CR_OFFSET 20
#define GPR1_OFFSET 24 #define EXC_CTR_OFFSET 24
#define GPR2_OFFSET 28 #define EXC_XER_OFFSET 28
#define GPR3_OFFSET 32 #define EXC_LR_OFFSET 32
#define GPR4_OFFSET 36 #define GPR0_OFFSET 36
#define GPR5_OFFSET 40 #define GPR1_OFFSET 40
#define GPR6_OFFSET 44 #define GPR2_OFFSET 44
#define GPR7_OFFSET 48 #define GPR3_OFFSET 48
#define GPR8_OFFSET 52 #define GPR4_OFFSET 52
#define GPR9_OFFSET 56 #define GPR5_OFFSET 56
#define GPR10_OFFSET 60 #define GPR6_OFFSET 60
#define GPR11_OFFSET 64 #define GPR7_OFFSET 64
#define GPR12_OFFSET 68 #define GPR8_OFFSET 68
#define GPR13_OFFSET 72 #define GPR9_OFFSET 72
#define GPR14_OFFSET 76 #define GPR10_OFFSET 76
#define GPR15_OFFSET 80 #define GPR11_OFFSET 80
#define GPR16_OFFSET 84 #define GPR12_OFFSET 84
#define GPR17_OFFSET 88 #define GPR13_OFFSET 88
#define GPR18_OFFSET 92 #define GPR14_OFFSET 92
#define GPR19_OFFSET 96 #define GPR15_OFFSET 96
#define GPR20_OFFSET 100 #define GPR16_OFFSET 100
#define GPR21_OFFSET 104 #define GPR17_OFFSET 104
#define GPR22_OFFSET 108 #define GPR18_OFFSET 108
#define GPR23_OFFSET 112 #define GPR19_OFFSET 112
#define GPR24_OFFSET 116 #define GPR20_OFFSET 116
#define GPR25_OFFSET 120 #define GPR21_OFFSET 120
#define GPR26_OFFSET 124 #define GPR22_OFFSET 124
#define GPR27_OFFSET 128 #define GPR23_OFFSET 128
#define GPR28_OFFSET 132 #define GPR24_OFFSET 132
#define GPR29_OFFSET 136 #define GPR25_OFFSET 136
#define GPR30_OFFSET 140 #define GPR26_OFFSET 140
#define GPR31_OFFSET 144 #define GPR27_OFFSET 144
#define EXC_CR_OFFSET 148 #define GPR28_OFFSET 148
#define EXC_CTR_OFFSET 152 #define GPR29_OFFSET 152
#define EXC_XER_OFFSET 156 #define GPR30_OFFSET 156
#define EXC_LR_OFFSET 160 #define GPR31_OFFSET 160
/* /*
* maintain the EABI requested 8 bytes aligment * maintain the EABI requested 8 bytes aligment
* As SVR4 ABI requires 16, make it 16 (as some * As SVR4 ABI requires 16, make it 16 (as some
@@ -78,6 +78,9 @@
#define EXCEPTION_FRAME_END 176 #define EXCEPTION_FRAME_END 176
#ifndef ASM #ifndef ASM
#include <rtems.h>
/* /*
* default raw exception handlers * default raw exception handlers
*/ */
@@ -86,49 +89,6 @@ extern void default_exception_vector_code_prolog();
extern int default_exception_vector_code_prolog_size; extern int default_exception_vector_code_prolog_size;
extern void initialize_exceptions(); extern void initialize_exceptions();
typedef struct {
unsigned EXC_SRR0;
unsigned EXC_SRR1;
unsigned _EXC_number;
unsigned GPR0;
unsigned GPR1;
unsigned GPR2;
unsigned GPR3;
unsigned GPR4;
unsigned GPR5;
unsigned GPR6;
unsigned GPR7;
unsigned GPR8;
unsigned GPR9;
unsigned GPR10;
unsigned GPR11;
unsigned GPR12;
unsigned GPR13;
unsigned GPR14;
unsigned GPR15;
unsigned GPR16;
unsigned GPR17;
unsigned GPR18;
unsigned GPR19;
unsigned GPR20;
unsigned GPR21;
unsigned GPR22;
unsigned GPR23;
unsigned GPR24;
unsigned GPR25;
unsigned GPR26;
unsigned GPR27;
unsigned GPR28;
unsigned GPR29;
unsigned GPR30;
unsigned GPR31;
unsigned EXC_CR;
unsigned EXC_CTR;
unsigned EXC_XER;
unsigned EXC_LR;
}CPU_Exception_frame;
typedef void rtems_exception_handler_t (CPU_Exception_frame* excPtr); typedef void rtems_exception_handler_t (CPU_Exception_frame* excPtr);
/*DEBUG typedef rtems_exception_handler_t cpuExcHandlerType; */ /*DEBUG typedef rtems_exception_handler_t cpuExcHandlerType; */

View File

@@ -27,6 +27,74 @@
#include <bsp/vectors.h> #include <bsp/vectors.h>
#include <bsp/bootcard.h> #include <bsp/bootcard.h>
#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)
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);
RTEMS_STATIC_ASSERT(
PPC_EXC_MINIMAL_FRAME_SIZE % CPU_STACK_ALIGNMENT == 0,
PPC_EXC_MINIMAL_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
);
uint32_t ppc_exc_cache_wb_check = 1; uint32_t ppc_exc_cache_wb_check = 1;
#define MTIVPR(prefix) __asm__ volatile ("mtivpr %0" : : "r" (prefix)) #define MTIVPR(prefix) __asm__ volatile ("mtivpr %0" : : "r" (prefix))

View File

@@ -246,51 +246,7 @@ extern "C" {
* @{ * @{
*/ */
typedef struct { typedef CPU_Exception_frame BSP_Exception_frame;
unsigned EXC_SRR0;
unsigned EXC_SRR1;
unsigned _EXC_number;
unsigned EXC_CR;
unsigned EXC_CTR;
unsigned EXC_XER;
unsigned EXC_LR;
#ifdef __SPE__
uint32_t EXC_SPEFSCR;
uint64_t EXC_ACC;
#endif
PPC_GPR_TYPE GPR0;
PPC_GPR_TYPE GPR1;
PPC_GPR_TYPE GPR2;
PPC_GPR_TYPE GPR3;
PPC_GPR_TYPE GPR4;
PPC_GPR_TYPE GPR5;
PPC_GPR_TYPE GPR6;
PPC_GPR_TYPE GPR7;
PPC_GPR_TYPE GPR8;
PPC_GPR_TYPE GPR9;
PPC_GPR_TYPE GPR10;
PPC_GPR_TYPE GPR11;
PPC_GPR_TYPE GPR12;
PPC_GPR_TYPE GPR13;
PPC_GPR_TYPE GPR14;
PPC_GPR_TYPE GPR15;
PPC_GPR_TYPE GPR16;
PPC_GPR_TYPE GPR17;
PPC_GPR_TYPE GPR18;
PPC_GPR_TYPE GPR19;
PPC_GPR_TYPE GPR20;
PPC_GPR_TYPE GPR21;
PPC_GPR_TYPE GPR22;
PPC_GPR_TYPE GPR23;
PPC_GPR_TYPE GPR24;
PPC_GPR_TYPE GPR25;
PPC_GPR_TYPE GPR26;
PPC_GPR_TYPE GPR27;
PPC_GPR_TYPE GPR28;
PPC_GPR_TYPE GPR29;
PPC_GPR_TYPE GPR30;
PPC_GPR_TYPE GPR31;
} BSP_Exception_frame;
/** @} */ /** @} */
@@ -534,7 +490,6 @@ int ppc_exc_alignment_handler(BSP_Exception_frame *frame, unsigned excNum);
/* /*
* Compatibility with pc386 * Compatibility with pc386
*/ */
typedef BSP_Exception_frame CPU_Exception_frame;
typedef exception_handler_t cpuExcHandlerType; typedef exception_handler_t cpuExcHandlerType;
#endif /* ASM */ #endif /* ASM */

View File

@@ -990,6 +990,52 @@ void _CPU_Context_restore_fp(
Context_Control_fp **fp_context_ptr Context_Control_fp **fp_context_ptr
); );
typedef struct {
uint32_t EXC_SRR0;
uint32_t EXC_SRR1;
uint32_t _EXC_number;
uint32_t EXC_CR;
uint32_t EXC_CTR;
uint32_t EXC_XER;
uint32_t EXC_LR;
#ifdef __SPE__
uint32_t EXC_SPEFSCR;
uint64_t EXC_ACC;
#endif
PPC_GPR_TYPE GPR0;
PPC_GPR_TYPE GPR1;
PPC_GPR_TYPE GPR2;
PPC_GPR_TYPE GPR3;
PPC_GPR_TYPE GPR4;
PPC_GPR_TYPE GPR5;
PPC_GPR_TYPE GPR6;
PPC_GPR_TYPE GPR7;
PPC_GPR_TYPE GPR8;
PPC_GPR_TYPE GPR9;
PPC_GPR_TYPE GPR10;
PPC_GPR_TYPE GPR11;
PPC_GPR_TYPE GPR12;
PPC_GPR_TYPE GPR13;
PPC_GPR_TYPE GPR14;
PPC_GPR_TYPE GPR15;
PPC_GPR_TYPE GPR16;
PPC_GPR_TYPE GPR17;
PPC_GPR_TYPE GPR18;
PPC_GPR_TYPE GPR19;
PPC_GPR_TYPE GPR20;
PPC_GPR_TYPE GPR21;
PPC_GPR_TYPE GPR22;
PPC_GPR_TYPE GPR23;
PPC_GPR_TYPE GPR24;
PPC_GPR_TYPE GPR25;
PPC_GPR_TYPE GPR26;
PPC_GPR_TYPE GPR27;
PPC_GPR_TYPE GPR28;
PPC_GPR_TYPE GPR29;
PPC_GPR_TYPE GPR30;
PPC_GPR_TYPE GPR31;
} CPU_Exception_frame;
/* /*
* _CPU_Initialize_altivec() * _CPU_Initialize_altivec()
* *