File indexing completed on 2025-05-11 08:23:57
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049 #include <bsp.h>
0050 #include <bsp/vectors.h>
0051 #include <bsp/bootcard.h>
0052 #include <libcpu/spr.h>
0053 #include <bsp/pci.h>
0054 #include <rtems/bspIo.h>
0055 #include <rtems/score/percpu.h>
0056 #include <threads.h>
0057 #include <inttypes.h>
0058
0059 #include <bsp/bspException.h>
0060
0061 #define SRR1_TEA_EXC (1<<(31-13))
0062 #define SRR1_MCP_EXC (1<<(31-12))
0063
0064 static thread_local volatile BSP_ExceptionExtension BSP_exceptionExtension = 0;
0065
0066 BSP_ExceptionExtension
0067 BSP_exceptionHandlerInstall(BSP_ExceptionExtension e)
0068 {
0069 volatile BSP_ExceptionExtension test;
0070 test = BSP_exceptionExtension;
0071 BSP_exceptionExtension = e;
0072 return test;
0073 }
0074
0075 void
0076 BSP_exceptionHandler(BSP_Exception_frame* excPtr)
0077 {
0078 BSP_ExceptionExtension ext=0;
0079 rtems_id id=0;
0080 int recoverable = 0;
0081 char *fmt="Uhuuuh, Exception %d in unknown task???\n";
0082 int quiet=0;
0083
0084 if (!quiet) printk("In BSP_exceptionHandler()\n");
0085
0086
0087
0088 if (rtems_interrupt_is_in_progress()) {
0089 fmt="Aieeh, Exception %d in interrupt handler\n";
0090 } else if ( !_Thread_Executing) {
0091 fmt="Aieeh, Exception %d in initialization code\n";
0092 } else {
0093
0094 if (RTEMS_SUCCESSFUL==rtems_task_ident(RTEMS_SELF,RTEMS_LOCAL,&id)) {
0095 ext = BSP_exceptionExtension;
0096 if (ext)
0097 quiet=ext->quiet;
0098 if (!quiet) {
0099 printk("Task (Id 0x%08" PRIx32 ") got ",id);
0100 }
0101 fmt="exception %d\n";
0102 }
0103 }
0104
0105 if (ext && ext->lowlevelHook && ext->lowlevelHook(excPtr,ext,0)) {
0106
0107 printk("they did all the work and want us to do nothing!\n");
0108 return;
0109 }
0110
0111 if (!quiet) {
0112
0113 printk(fmt, excPtr->_EXC_number);
0114
0115 printk("\t Next PC or Address of fault = %" PRIxPTR ", ", excPtr->EXC_SRR0);
0116 printk("Mvme5500 Saved MSR = %" PRIxPTR "\n", excPtr->EXC_SRR1);
0117 printk("\t R0 = %08" PRIxPTR, excPtr->GPR0);
0118 printk(" R1 = %08" PRIxPTR, excPtr->GPR1);
0119 printk(" R2 = %08" PRIxPTR, excPtr->GPR2);
0120 printk(" R3 = %08" PRIxPTR "\n", excPtr->GPR3);
0121 printk("\t R4 = %08" PRIxPTR, excPtr->GPR4);
0122 printk(" R5 = %08" PRIxPTR, excPtr->GPR5);
0123 printk(" R6 = %08" PRIxPTR, excPtr->GPR6);
0124 printk(" R7 = %08" PRIxPTR "\n", excPtr->GPR7);
0125 printk("\t R8 = %08" PRIxPTR, excPtr->GPR8);
0126 printk(" R9 = %08" PRIxPTR, excPtr->GPR9);
0127 printk(" R10 = %08" PRIxPTR, excPtr->GPR10);
0128 printk(" R11 = %08" PRIxPTR "\n", excPtr->GPR11);
0129 printk("\t R12 = %08" PRIxPTR, excPtr->GPR12);
0130 printk(" R13 = %08" PRIxPTR, excPtr->GPR13);
0131 printk(" R14 = %08" PRIxPTR, excPtr->GPR14);
0132 printk(" R15 = %08" PRIxPTR "\n", excPtr->GPR15);
0133 printk("\t R16 = %08" PRIxPTR, excPtr->GPR16);
0134 printk(" R17 = %08" PRIxPTR, excPtr->GPR17);
0135 printk(" R18 = %08" PRIxPTR, excPtr->GPR18);
0136 printk(" R19 = %08" PRIxPTR "\n", excPtr->GPR19);
0137 printk("\t R20 = %08" PRIxPTR, excPtr->GPR20);
0138 printk(" R21 = %08" PRIxPTR, excPtr->GPR21);
0139 printk(" R22 = %08" PRIxPTR, excPtr->GPR22);
0140 printk(" R23 = %08" PRIxPTR "\n", excPtr->GPR23);
0141 printk("\t R24 = %08" PRIxPTR, excPtr->GPR24);
0142 printk(" R25 = %08" PRIxPTR, excPtr->GPR25);
0143 printk(" R26 = %08" PRIxPTR, excPtr->GPR26);
0144 printk(" R27 = %08" PRIxPTR "\n", excPtr->GPR27);
0145 printk("\t R28 = %08" PRIxPTR, excPtr->GPR28);
0146 printk(" R29 = %08" PRIxPTR, excPtr->GPR29);
0147 printk(" R30 = %08" PRIxPTR, excPtr->GPR30);
0148 printk(" R31 = %08" PRIxPTR "\n", excPtr->GPR31);
0149 printk("\t CR = %08" PRIx32 "\n", excPtr->EXC_CR);
0150 printk("\t CTR = %08" PRIxPTR "\n", excPtr->EXC_CTR);
0151 printk("\t XER = %08" PRIx32 "\n", excPtr->EXC_XER);
0152 printk("\t LR = %08" PRIxPTR "\n", excPtr->EXC_LR);
0153
0154 BSP_printStackTrace(excPtr);
0155 }
0156
0157 if (ASM_MACH_VECTOR == excPtr->_EXC_number) {
0158
0159
0160
0161 if (!quiet)
0162 printk("Machine check; reason:");
0163 if ( ! (excPtr->EXC_SRR1 & (SRR1_TEA_EXC | SRR1_MCP_EXC)) ) {
0164 if (!quiet)
0165 printk("SRR1\n");
0166 } else {
0167 if (excPtr->EXC_SRR1 & (SRR1_TEA_EXC)) {
0168 if (!quiet)
0169 printk(" TEA");
0170 }
0171 if (excPtr->EXC_SRR1 & (SRR1_MCP_EXC)) {
0172 unsigned long gerr;
0173
0174 if (!quiet) printk(" MCP\n");
0175
0176
0177 gerr=_BSP_clear_hostbridge_errors(0,0);
0178 if (gerr&0x80000000) printk("GT64260 Parity error\n");
0179 if (gerr&0x40000000) printk("GT64260 SysErr\n");
0180 if ((!quiet) && (!gerr)) printk("GT64260 host bridge seems OK\n");
0181 }
0182 }
0183 } else if (ASM_DEC_VECTOR == excPtr->_EXC_number) {
0184 recoverable = 1;
0185 } else if (ASM_SYS_VECTOR == excPtr->_EXC_number) {
0186 #ifdef TEST_RAW_EXCEPTION_CODE
0187 recoverable = 1;
0188 #else
0189 recoverable = 0;
0190 #endif
0191 }
0192
0193
0194
0195
0196 if (ext && ext->lowlevelHook && ext->lowlevelHook(excPtr, ext, 1))
0197 return;
0198
0199 if (!recoverable) {
0200 if (id) {
0201
0202 if (ext && ext->highlevelHook) {
0203 excPtr->EXC_SRR0 = (uint32_t)ext->highlevelHook;
0204 excPtr->GPR3 = (uint32_t)ext;
0205 return;
0206 }
0207 if (excPtr->EXC_SRR1 & MSR_FP) {
0208
0209
0210
0211 _write_MSR( _read_MSR() | MSR_FP );
0212 __asm__ __volatile__("isync");
0213 }
0214 printk("unrecoverable exception!!! task %08" PRIx32 " suspended\n",id);
0215 rtems_task_suspend(id);
0216 } else {
0217 printk("PANIC, rebooting...\n");
0218 bsp_reset(RTEMS_FATAL_SOURCE_BSP, 0);
0219 }
0220 }
0221 }