source: rtems/c/src/lib/libbsp/powerpc/shared/startup/panic.c @ 559aebce

4.104.115
Last change on this file since 559aebce was 559aebce, checked in by Till Straumann <strauman@…>, on 12/02/09 at 00:31:13

2009-12-01 Till Straumann <strauman@…>

  • shared/startup/panic.c: Fixed compiler warning.
  • Property mode set to 100644
File size: 3.4 KB
Line 
1#include <rtems.h>
2#include <bsp.h>
3#include <bsp/bootcard.h>
4#include <bsp/uart.h>
5#include <rtems/bspIo.h>
6#include <rtems/error.h>
7#include <libcpu/stackTrace.h>
8
9static void
10rebootQuestion(void)
11{
12        printk("Press a key to reboot\n");
13        BSP_poll_char_via_serial();
14        bsp_reset();
15}
16
17void BSP_panic(char *s)
18{
19  printk("%s PANIC %s\n",_RTEMS_version, s);
20  rebootQuestion();
21}
22
23#define THESRC _Internal_errors_What_happened.the_source
24#define ISITNL _Internal_errors_What_happened.is_internal
25#define THEERR _Internal_errors_What_happened.the_error
26
27char *score_status_text(rtems_status_code sc)
28{
29        switch (sc) {
30        case INTERNAL_ERROR_NO_CONFIGURATION_TABLE:
31                return "INTERNAL_ERROR_NO_CONFIGURATION_TABLE";
32        case INTERNAL_ERROR_NO_CPU_TABLE:
33                return "INTERNAL_ERROR_NO_CPU_TABLE";
34        case INTERNAL_ERROR_INVALID_WORKSPACE_ADDRESS:
35                return "INTERNAL_ERROR_INVALID_WORKSPACE_ADDRESS";
36        case INTERNAL_ERROR_TOO_LITTLE_WORKSPACE:
37                return "INTERNAL_ERROR_TOO_LITTLE_WORKSPACE";
38        case INTERNAL_ERROR_WORKSPACE_ALLOCATION:
39                return "INTERNAL_ERROR_WORKSPACE_ALLOCATION";
40        case INTERNAL_ERROR_INTERRUPT_STACK_TOO_SMALL:
41                return "INTERNAL_ERROR_INTERRUPT_STACK_TOO_SMALL";
42        case INTERNAL_ERROR_THREAD_EXITTED:
43                return "INTERNAL_ERROR_THREAD_EXITTED";
44        case INTERNAL_ERROR_INCONSISTENT_MP_INFORMATION:
45                return "INTERNAL_ERROR_INCONSISTENT_MP_INFORMATION";
46        case INTERNAL_ERROR_INVALID_NODE:
47                return "INTERNAL_ERROR_INVALID_NODE";
48        case INTERNAL_ERROR_NO_MPCI:
49                return "INTERNAL_ERROR_NO_MPCI";
50        case INTERNAL_ERROR_BAD_PACKET:
51                return "INTERNAL_ERROR_BAD_PACKET";
52        case INTERNAL_ERROR_OUT_OF_PACKETS:
53                return "INTERNAL_ERROR_OUT_OF_PACKETS";
54        case INTERNAL_ERROR_OUT_OF_GLOBAL_OBJECTS:
55                return "INTERNAL_ERROR_OUT_OF_GLOBAL_OBJECTS";
56        case INTERNAL_ERROR_OUT_OF_PROXIES:
57                return "INTERNAL_ERROR_OUT_OF_PROXIES";
58        case INTERNAL_ERROR_INVALID_GLOBAL_ID:
59                return "INTERNAL_ERROR_INVALID_GLOBAL_ID";
60        case INTERNAL_ERROR_BAD_STACK_HOOK:
61                return "INTERNAL_ERROR_BAD_STACK_HOOK";
62        case INTERNAL_ERROR_BAD_ATTRIBUTES:
63                return "INTERNAL_ERROR_BAD_ATTRIBUTES";
64        case 18: /* not in header (yet) :-( */
65                return "INTERNAL_ERROR_CALLED_FROM_WRONG_ENVIRONMENT";
66        default:
67                        break;
68        }
69        return 0;
70}
71
72void _BSP_Fatal_error(unsigned int v)
73{
74unsigned long flags;
75const char *err = 0;
76
77  rtems_interrupt_disable(flags);
78  printk("%s\n",_RTEMS_version);
79  printk("FATAL ERROR:\n");
80  printk("Internal error: %s\n", ISITNL? "Yes":"No");
81  printk("Environment:");
82  switch (THESRC) {
83        case INTERNAL_ERROR_CORE:
84                printk(" RTEMS Core\n");
85                err = score_status_text(THEERR);
86        break;
87
88        case INTERNAL_ERROR_RTEMS_API:
89                printk(" RTEMS API\n");
90                err = rtems_status_text(THEERR);
91        break;
92
93        case INTERNAL_ERROR_POSIX_API:
94                printk(" POSIX API (errno)\n");
95                /* could use strerror but I'd rather avoid using this here */
96        break;
97
98        case INTERNAL_ERROR_ITRON_API:
99                printk(" ITRON API\n");
100                /* conversion to string not implemented */
101        break;
102
103        default:
104                printk("  UNKNOWN (0x%x)\n",THESRC);
105        break;
106  }
107  if ( _Thread_Dispatch_disable_level )
108                printk("  Error occurred in a Thread Dispatching DISABLED context (level %i)\n",
109                        _Thread_Dispatch_disable_level);
110        else
111                printk("enabled\n");
112  if ( _ISR_Nest_level )
113        printk("  Error occurred from ISR context (ISR nest level %i)\n", _ISR_Nest_level);
114
115  printk("Error %d",THEERR);
116  if (err) {
117        printk(": %s",err);
118  }
119  printk("\n");
120  printk("Stack Trace:\n");
121  CPU_print_stack();
122
123  rebootQuestion();
124}
Note: See TracBrowser for help on using the repository browser.