summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/powerpc/shared/startup/panic.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/powerpc/shared/startup/panic.c')
-rw-r--r--c/src/lib/libbsp/powerpc/shared/startup/panic.c122
1 files changed, 122 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/powerpc/shared/startup/panic.c b/c/src/lib/libbsp/powerpc/shared/startup/panic.c
new file mode 100644
index 0000000000..e5fa57c0fb
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/shared/startup/panic.c
@@ -0,0 +1,122 @@
+#include <rtems.h>
+#include <bsp.h>
+#include <bsp/uart.h>
+#include <rtems/bspIo.h>
+#include <libcpu/stackTrace.h>
+
+static void
+rebootQuestion()
+{
+ printk("Press a key to reboot\n");
+ BSP_poll_char_via_serial();
+ rtemsReboot();
+}
+
+void BSP_panic(char *s)
+{
+ printk("%s PANIC %s\n",_RTEMS_version, s);
+ rebootQuestion();
+}
+
+#define THESRC Internal_errors_What_happened.the_source
+#define ISITNL Internal_errors_What_happened.is_internal
+#define THEERR Internal_errors_What_happened.the_error
+
+char *score_status_text(rtems_status_code sc)
+{
+ switch (sc) {
+ case INTERNAL_ERROR_NO_CONFIGURATION_TABLE:
+ return "INTERNAL_ERROR_NO_CONFIGURATION_TABLE";
+ case INTERNAL_ERROR_NO_CPU_TABLE:
+ return "INTERNAL_ERROR_NO_CPU_TABLE";
+ case INTERNAL_ERROR_INVALID_WORKSPACE_ADDRESS:
+ return "INTERNAL_ERROR_INVALID_WORKSPACE_ADDRESS";
+ case INTERNAL_ERROR_TOO_LITTLE_WORKSPACE:
+ return "INTERNAL_ERROR_TOO_LITTLE_WORKSPACE";
+ case INTERNAL_ERROR_WORKSPACE_ALLOCATION:
+ return "INTERNAL_ERROR_WORKSPACE_ALLOCATION";
+ case INTERNAL_ERROR_INTERRUPT_STACK_TOO_SMALL:
+ return "INTERNAL_ERROR_INTERRUPT_STACK_TOO_SMALL";
+ case INTERNAL_ERROR_THREAD_EXITTED:
+ return "INTERNAL_ERROR_THREAD_EXITTED";
+ case INTERNAL_ERROR_INCONSISTENT_MP_INFORMATION:
+ return "INTERNAL_ERROR_INCONSISTENT_MP_INFORMATION";
+ case INTERNAL_ERROR_INVALID_NODE:
+ return "INTERNAL_ERROR_INVALID_NODE";
+ case INTERNAL_ERROR_NO_MPCI:
+ return "INTERNAL_ERROR_NO_MPCI";
+ case INTERNAL_ERROR_BAD_PACKET:
+ return "INTERNAL_ERROR_BAD_PACKET";
+ case INTERNAL_ERROR_OUT_OF_PACKETS:
+ return "INTERNAL_ERROR_OUT_OF_PACKETS";
+ case INTERNAL_ERROR_OUT_OF_GLOBAL_OBJECTS:
+ return "INTERNAL_ERROR_OUT_OF_GLOBAL_OBJECTS";
+ case INTERNAL_ERROR_OUT_OF_PROXIES:
+ return "INTERNAL_ERROR_OUT_OF_PROXIES";
+ case INTERNAL_ERROR_INVALID_GLOBAL_ID:
+ return "INTERNAL_ERROR_INVALID_GLOBAL_ID";
+ case INTERNAL_ERROR_BAD_STACK_HOOK:
+ return "INTERNAL_ERROR_BAD_STACK_HOOK";
+ case INTERNAL_ERROR_BAD_ATTRIBUTES:
+ return "INTERNAL_ERROR_BAD_ATTRIBUTES";
+ case 18: /* not in header (yet) :-( */
+ return "INTERNAL_ERROR_CALLED_FROM_WRONG_ENVIRONMENT";
+ default:
+ break;
+ }
+ return 0;
+}
+
+void _BSP_Fatal_error(unsigned int v)
+{
+unsigned long flags;
+char *err = 0;
+
+ rtems_interrupt_disable(flags);
+ printk("%s\n",_RTEMS_version);
+ printk("FATAL ERROR:\n");
+ printk("Internal error: %s\n", ISITNL? "Yes":"No");
+ printk("Environment:");
+ switch (THESRC) {
+ case INTERNAL_ERROR_CORE:
+ printk(" RTEMS Core\n");
+ err = score_status_text(THEERR);
+ break;
+
+ case INTERNAL_ERROR_RTEMS_API:
+ printk(" RTEMS API\n");
+ err = rtems_status_text(THEERR);
+ break;
+
+ case INTERNAL_ERROR_POSIX_API:
+ printk(" POSIX API (errno)\n");
+ /* could use strerror but I'd rather avoid using this here */
+ break;
+
+ case INTERNAL_ERROR_ITRON_API:
+ printk(" ITRON API\n");
+ /* conversion to string not implemented */
+ break;
+
+ default:
+ printk(" UNKNOWN (0x%x)\n",THESRC);
+ break;
+ }
+ if ( _Thread_Dispatch_disable_level )
+ printk(" Error occurred in a Thread Dispatching DISABLED context (level %i)\n",
+ _Thread_Dispatch_disable_level);
+ else
+ printk("enabled\n");
+ if ( _ISR_Nest_level )
+ printk(" Error occurred from ISR context (ISR nest level %i)\n", _ISR_Nest_level);
+
+ printk("Error %d",THEERR);
+ if (err) {
+ printk(": %s",err);
+ }
+ printk("\n");
+ printk("Stack Trace:\n");
+ CPU_print_stack();
+
+ rebootQuestion();
+}