.extern os_intc_pcb_tbl\r
.extern os_intc_types_tbl\r
.extern os_sys\r
+.extern Os_ArchPanic\r
+\r
+#if defined(CFG_VLE)\r
+#define lis e_lis\r
+#define li se_li\r
+#define lwz e_lwz\r
+#define stwu e_stwu\r
+#define stw e_stw\r
+#define b e_b\r
+#define addi e_addi /* true ?*/\r
+#define subi e_subi /* true ?*/\r
+#endif \r
\r
/* ----------------------------[private define]------------------------------*/\r
\r
-#define INTC_IACKR_PRC0 0xfff48010 /* MPC551x CPU #0 */ \r
-#define INTC_EOIR_PRC0 0xfff48018 /* MPC551x CPU #0 */\r
-#define INTC_IACKR 0xfff48010 /* MPC555x */\r
-#define INTC_EOIR 0xfff48018 /* MPC555x */\r
+#define INTC_IACKR_PRC0 0xfff48010 \r
+#define INTC_EOIR_PRC0 0xfff48018\r
+#define INTC_IACKR 0xfff48010\r
+#define INTC_EOIR 0xfff48018\r
#define INTC_SSCIR0 0xfff48020\r
\r
/* ----------------------------[private macro]-------------------------------*/\r
/* Save context indicator */\r
li r0,FUNC_PATTERN\r
stw r0,FUNC_FRM_PATTERN(sp)\r
- \r
- /* Save registers preserved by function call */\r
+\r
+#if defined(CFG_SPE)\r
stw r14, FUNC_FRM_R14(sp)\r
stw r15, FUNC_FRM_R15(sp)\r
stw r16, FUNC_FRM_R16(sp)\r
stw r30, FUNC_FRM_R30(sp)\r
stw r31, FUNC_FRM_R31(sp)\r
\r
+#else\r
+ /* Save registers preserved by function call */\r
+ stw r14, FUNC_FRM_R14(sp)\r
+ stw r15, FUNC_FRM_R15(sp)\r
+ stw r16, FUNC_FRM_R16(sp)\r
+ stw r17, FUNC_FRM_R17(sp)\r
+ stw r18, FUNC_FRM_R18(sp)\r
+ stw r19, FUNC_FRM_R19(sp)\r
+ stw r20, FUNC_FRM_R20(sp)\r
+ stw r21, FUNC_FRM_R21(sp)\r
+ stw r22, FUNC_FRM_R22(sp)\r
+ stw r23, FUNC_FRM_R23(sp)\r
+ stw r24, FUNC_FRM_R24(sp)\r
+ stw r25, FUNC_FRM_R25(sp)\r
+ stw r26, FUNC_FRM_R26(sp)\r
+ stw r27, FUNC_FRM_R27(sp)\r
+ stw r28, FUNC_FRM_R28(sp)\r
+ stw r29, FUNC_FRM_R29(sp)\r
+ stw r30, FUNC_FRM_R30(sp)\r
+ stw r31, FUNC_FRM_R31(sp)\r
+#endif\r
\r
/* Save stack ptr... */\r
stw sp,PCB_STACK_CURR_P(r3)\r
b Os_ArchPanic\r
\r
restoreFuncContext:\r
+#if defined(CFG_SPE)\r
+ evldd r14, FUNC_FRM_R14(sp)\r
+ evldd r15, FUNC_FRM_R15(sp)\r
+ evldd r16, FUNC_FRM_R16(sp)\r
+ evldd r17, FUNC_FRM_R17(sp)\r
+ evldd r18, FUNC_FRM_R18(sp)\r
+ evldd r19, FUNC_FRM_R19(sp)\r
+ evldd r20, FUNC_FRM_R20(sp)\r
+ evldd r21, FUNC_FRM_R21(sp)\r
+ evldd r22, FUNC_FRM_R22(sp)\r
+ evldd r23, FUNC_FRM_R23(sp)\r
+ evldd r24, FUNC_FRM_R24(sp)\r
+ evldd r25, FUNC_FRM_R25(sp)\r
+ evldd r26, FUNC_FRM_R26(sp)\r
+ evldd r27, FUNC_FRM_R27(sp)\r
+ evldd r28, FUNC_FRM_R28(sp)\r
+ evldd r29, FUNC_FRM_R29(sp)\r
+ evldd r30, FUNC_FRM_R30(sp)\r
+ evldd r31, FUNC_FRM_R31(sp)\r
+ addi sp,sp,(FUNC_FRM_SIZE)\r
+#else \r
lwz r14, FUNC_FRM_R14(sp)\r
lwz r15, FUNC_FRM_R15(sp)\r
lwz r16, FUNC_FRM_R16(sp)\r
lwz r30, FUNC_FRM_R30(sp)\r
lwz r31, FUNC_FRM_R31(sp)\r
addi sp,sp,(FUNC_FRM_SIZE)\r
- \r
+#endif \r
/* TODO: Call Os_PosttaskHook()? */\r
\r
blr\r
\r
li r3,4\r
stw r3, EXC_FRM_VECTOR(sp)\r
+#if defined(CFG_SPE) \r
+\r
+ /* Enable SPE (exceptions turns it off) */\r
+ mfmsr r3\r
+ oris r3,r3,0x0200\r
+ mtmsr r3\r
+ isync\r
+\r
+ /* Create the frame */\r
+ addi sp,sp,-ISR_FRM_SIZE\r
+ evstdd r3, ISR_FRM_R3(sp) /* Save work reg */ \r
+ \r
+ /* SPEFSCR */\r
+ mfspr r3,SPR_SPEFSCR\r
+ clrlwi r3,r3,24 /* Mask off non-status bits */\r
+ stw r3,ISR_FRM_SPE_FSCR(sp)\r
+\r
+ /* Save SPE acc */\r
+ evsubfw r3,r3,r3 /* zero r3 */\r
+ evaddumiaaw r3,r3 /* Add r3 = r3 + acc -> r3 = acc */\r
+ evstdd r3,ISR_FRM_SPE_ACC(r1)\r
\r
+ evstdd r0, ISR_FRM_R0(sp)\r
+ evstdd r4, ISR_FRM_R4(sp)\r
+ evstdd r5, ISR_FRM_R5(sp)\r
+ evstdd r6, ISR_FRM_R6(sp)\r
+ evstdd r7, ISR_FRM_R7(sp)\r
+ evstdd r8, ISR_FRM_R8(sp)\r
+ evstdd r9, ISR_FRM_R9(sp)\r
+ evstdd r10, ISR_FRM_R10(sp)\r
+ evstdd r11, ISR_FRM_R11(sp)\r
+ evstdd r12, ISR_FRM_R12(sp)\r
+ evstdd r14, ISR_FRM_R14(sp)\r
+ evstdd r15, ISR_FRM_R15(sp)\r
+ evstdd r16, ISR_FRM_R16(sp)\r
+ evstdd r17, ISR_FRM_R17(sp)\r
+ evstdd r18, ISR_FRM_R18(sp)\r
+ evstdd r19, ISR_FRM_R19(sp)\r
+ evstdd r20, ISR_FRM_R20(sp)\r
+ evstdd r21, ISR_FRM_R21(sp)\r
+ evstdd r22, ISR_FRM_R22(sp)\r
+ evstdd r23, ISR_FRM_R23(sp)\r
+ evstdd r24, ISR_FRM_R24(sp)\r
+ evstdd r25, ISR_FRM_R25(sp)\r
+ evstdd r26, ISR_FRM_R26(sp)\r
+ evstdd r27, ISR_FRM_R27(sp)\r
+ evstdd r28, ISR_FRM_R28(sp)\r
+ evstdd r29, ISR_FRM_R29(sp)\r
+ evstdd r30, ISR_FRM_R30(sp)\r
+ addi sp,sp,8\r
+ evstdd r31, (ISR_FRM_R31-8)(sp)\r
+ addi sp,sp,-8\r
+#else\r
/* Save the ISR frame */\r
addi sp,sp,-ISR_FRM_SIZE\r
stw r0, ISR_FRM_R0(sp)\r
stw r29, ISR_FRM_R29(sp)\r
stw r30, ISR_FRM_R30(sp)\r
stw r31, ISR_FRM_R31(sp)\r
-\r
+#endif\r
\r
li r3,ISR_PATTERN\r
stw r3,ISR_FRM_PATTERN(sp)\r
- // Save the stack so it later can be saved in the pcb \r
+ /* Save the stack so it later can be saved in the pcb */ \r
mr r4,sp \r
\r
- // Switch to interrupt stack if at depth 0\r
- // Load the value os_sys.int_nest_cnt\r
+ /* Switch to interrupt stack if at depth 0 */\r
+ /* Load the value os_sys.int_nest_cnt */\r
LOAD_IND_32(r3,os_sys+SYS_INT_NEST_CNT)\r
cmpli 0,r3,0\r
bne- on_int_stack\r
\r
- // Load the interrupt stack\r
+ /* Load the interrupt stack */\r
LOAD_IND_32(r3,os_sys+SYS_INT_STACK)\r
\r
on_int_stack:\r
#endif\r
/* Check for 0 entry */\r
mr r5,r6\r
- extrwi r5,r5,9,21\r
cmpli 0,r5,0\r
bne+ vectorOk\r
/* The entry was 0, call panic */\r
b Os_ArchPanic\r
\r
vectorOk:\r
+ extrwi r5,r5,9,21\r
/* Check for soft INT */\r
cmpli 0,r5,7\r
bgt noSoftInt\r
mr sp,r3\r
\r
/* Restore */\r
-restoreIsrContext: \r
+restoreIsrContext:\r
+#if defined(CFG_SPE) \r
+\r
+ // Restore SPE control/status reg.\r
+ lwz r3,ISR_FRM_SPE_FSCR(sp)\r
+ mtspr SPR_CSRR0,r3\r
+\r
+ /* Restore SPE acc */\r
+ evldd r3,ISR_FRM_SPE_ACC(r1)\r
+ evmra r3,r3\r
+ \r
+\r
+ evldd r0, ISR_FRM_R0(sp)\r
+ evldd r3, ISR_FRM_R4(sp)\r
+ evldd r4, ISR_FRM_R4(sp)\r
+ evldd r5, ISR_FRM_R5(sp)\r
+ evldd r6, ISR_FRM_R6(sp)\r
+ evldd r7, ISR_FRM_R7(sp)\r
+ evldd r8, ISR_FRM_R8(sp)\r
+ evldd r9, ISR_FRM_R9(sp)\r
+ evldd r10, ISR_FRM_R10(sp)\r
+ evldd r11, ISR_FRM_R11(sp)\r
+ evldd r12, ISR_FRM_R12(sp)\r
+ evldd r14, ISR_FRM_R14(sp)\r
+ evldd r15, ISR_FRM_R15(sp)\r
+ evldd r16, ISR_FRM_R16(sp)\r
+ evldd r17, ISR_FRM_R17(sp)\r
+ evldd r18, ISR_FRM_R18(sp)\r
+ evldd r19, ISR_FRM_R19(sp)\r
+ evldd r20, ISR_FRM_R20(sp)\r
+ evldd r21, ISR_FRM_R21(sp)\r
+ evldd r22, ISR_FRM_R22(sp)\r
+ evldd r23, ISR_FRM_R23(sp)\r
+ evldd r24, ISR_FRM_R24(sp)\r
+ evldd r25, ISR_FRM_R25(sp)\r
+ evldd r26, ISR_FRM_R26(sp)\r
+ evldd r27, ISR_FRM_R27(sp)\r
+ evldd r28, ISR_FRM_R28(sp)\r
+ evldd r29, ISR_FRM_R29(sp)\r
+ evldd r30, ISR_FRM_R30(sp)\r
+ addi sp,sp,8\r
+ evldd r31, (ISR_FRM_R31-8)(sp)\r
+ addi sp,sp,-8\r
+#else\r
lwz r0, ISR_FRM_R0(sp)\r
lwz r4, ISR_FRM_R4(sp)\r
lwz r5, ISR_FRM_R5(sp)\r
lwz r29, ISR_FRM_R29(sp)\r
lwz r30, ISR_FRM_R30(sp)\r
lwz r31, ISR_FRM_R31(sp)\r
+#endif \r
\r
/* back to the exception frame */\r
addi sp,sp,ISR_FRM_SIZE\r
stwu r3,-8(sp)\r
stw r4,4(sp)\r
\r
- # ack dec int\r
+ /* ack dec int */\r
lis r3,0x0800\r
mtspr SPR_TSR,r3\r
\r
- # Set soft int\r
+ /* Set soft int */\r
li r4,2\r
lis r3, INTC_SSCIR7@ha\r
stb r4, INTC_SSCIR7@l(r3)\r
rfi\r
\r
\r
-\r
-\r
-\r
/* Getting here means that the exception stack is started with:\r
* sp - saved\r
* r3 - saved and contains the exception number \r
handleException:\r
b handleException \r
\r
-# Force this jump table to this address to match the\r
-# value written to z1 IVPR\r
+#if defined(__GNUC__) \r
.section ".exception_tbl","ax"\r
+#elif defined(__CWCC__)\r
+.section .exception_tbl,4,"rw"\r
+#endif\r
.balign 0x1000\r
.global exception_tbl\r
\r
EXC_TABLE_CODE(12)\r
EXC_TABLE_CODE(13)\r
EXC_TABLE_CODE(14)\r
-\r
-\r
-\r
-// ------------------------------------------------------------------\r
-\r
+#if defined(CFG_SPE)\r
+ EXC_TABLE_CODE(32)\r
+ EXC_TABLE_CODE(33)\r
+ EXC_TABLE_CODE(34)\r
+#endif\r
\r
\r
\r