[5d02459] | 1 | /* fatal.c |
---|
| 2 | * |
---|
| 3 | * User-define fatal error handler. |
---|
| 4 | * |
---|
| 5 | * Copyright (c) 1998, National Research Council of Canada |
---|
| 6 | * |
---|
| 7 | * The license and distribution terms for this file may be |
---|
| 8 | * found in the file LICENSE in this distribution or at |
---|
| 9 | * http://www.OARcorp.com/rtems/license.html. |
---|
| 10 | * |
---|
| 11 | * $Id$ |
---|
| 12 | */ |
---|
| 13 | |
---|
| 14 | #include <bsp.h> |
---|
| 15 | #include <fatal.h> |
---|
| 16 | |
---|
| 17 | /* |
---|
| 18 | * mystrcat |
---|
| 19 | * |
---|
| 20 | * Can't rely on libc being operational. So we provide our own strcat-like |
---|
| 21 | * function. |
---|
| 22 | * |
---|
| 23 | * Input parameters: |
---|
| 24 | * destination - string (buffer) to append to |
---|
| 25 | * source - string to append to the end of destination |
---|
| 26 | * |
---|
| 27 | * Output parameters: |
---|
| 28 | * destination - source is appended to the end |
---|
| 29 | * |
---|
| 30 | * Return values: |
---|
| 31 | * Number of characters appended. |
---|
| 32 | */ |
---|
| 33 | static int mystrcat( |
---|
| 34 | char *destination, |
---|
| 35 | const char *source |
---|
| 36 | ) |
---|
| 37 | { |
---|
| 38 | int i; |
---|
| 39 | |
---|
| 40 | for ( i = 0; ( *destination++ = *source++) != '\0'; i++ ); |
---|
| 41 | return i; |
---|
| 42 | } |
---|
| 43 | |
---|
| 44 | |
---|
| 45 | /* |
---|
| 46 | * bsp_fatal_error_occurred |
---|
| 47 | * |
---|
| 48 | * Called when rtems_fatal_error_occurred() is called. Returns control to |
---|
| 49 | * 167Bug. The _Internal_error_Occurred() function has already saved the |
---|
| 50 | * parameters in Internal_errors_What_happened. If the function returns, |
---|
| 51 | * RTEMS will halt the CPU. |
---|
| 52 | * |
---|
| 53 | * Make sure the CPU is |
---|
| 54 | * |
---|
| 55 | * Input parameters: |
---|
| 56 | * the_source - what subsystem the error originated in |
---|
| 57 | * is_internal - if the error was internally generated |
---|
| 58 | * the_error - fatal error status code |
---|
| 59 | * |
---|
| 60 | * Output parameters: |
---|
| 61 | * output to the 167Bug console |
---|
| 62 | * |
---|
| 63 | * Return values: NONE. |
---|
| 64 | */ |
---|
| 65 | User_extensions_routine bsp_fatal_error_occurred( |
---|
| 66 | Internal_errors_Source the_source, |
---|
| 67 | rtems_boolean is_internal, |
---|
| 68 | rtems_unsigned32 the_error |
---|
| 69 | ) |
---|
| 70 | { |
---|
| 71 | struct { |
---|
| 72 | char index; /* First byte is number of chars in strbuf */ |
---|
| 73 | char strbuf[254]; /* In case count is bumped up by one by 167Bug */ |
---|
| 74 | } my_p_str; |
---|
| 75 | |
---|
| 76 | my_p_str.index = 0; |
---|
| 77 | my_p_str.index += mystrcat( |
---|
| 78 | my_p_str.strbuf + my_p_str.index, |
---|
| 79 | "\r\nRTEMS Fatal Error Occurred:\r\n the_source = " ); |
---|
| 80 | |
---|
| 81 | switch ( the_source ) { |
---|
| 82 | case INTERNAL_ERROR_CORE: |
---|
| 83 | my_p_str.index += mystrcat( |
---|
| 84 | my_p_str.strbuf + my_p_str.index, |
---|
| 85 | "INTERNAL_ERROR_CORE\r\n is_internal = " ); |
---|
| 86 | break; |
---|
| 87 | |
---|
| 88 | case INTERNAL_ERROR_RTEMS_API: |
---|
| 89 | my_p_str.index += mystrcat( |
---|
| 90 | my_p_str.strbuf + my_p_str.index, |
---|
| 91 | "INTERNAL_ERROR_RTEMS_API\r\n is_internal = " ); |
---|
| 92 | break; |
---|
| 93 | |
---|
| 94 | case INTERNAL_ERROR_POSIX_API: |
---|
| 95 | my_p_str.index += mystrcat( |
---|
| 96 | my_p_str.strbuf + my_p_str.index, |
---|
| 97 | "INTERNAL_ERROR_POSIX_API\r\n is_internal = " ); |
---|
| 98 | break; |
---|
| 99 | |
---|
| 100 | default: |
---|
| 101 | my_p_str.index += mystrcat( |
---|
| 102 | my_p_str.strbuf + my_p_str.index, |
---|
| 103 | "UNKNOWN\r\n is_internal = " ); |
---|
| 104 | break; |
---|
| 105 | } |
---|
| 106 | |
---|
| 107 | if ( is_internal ) |
---|
| 108 | my_p_str.index += mystrcat( |
---|
| 109 | my_p_str.strbuf + my_p_str.index, |
---|
| 110 | "TRUE\r\n the_error = 0x|10,8|\r\n" ); |
---|
| 111 | else |
---|
| 112 | my_p_str.index += mystrcat( |
---|
| 113 | my_p_str.strbuf + my_p_str.index, |
---|
| 114 | "FALSE\r\n the_error = 0x|10,8|\r\n" ); |
---|
| 115 | |
---|
| 116 | lcsr->intr_ena = 0; /* disable interrupts */ |
---|
| 117 | m68k_set_vbr(0xFFE00000); /* restore 167Bug vectors */ |
---|
| 118 | |
---|
[4f38ab05] | 119 | asm volatile( "movel %0, -(%%a7)\n\t" |
---|
| 120 | "pea (%%a7)\n\t" |
---|
| 121 | "pea (%1)\n\t" |
---|
| 122 | "trap #15\n\t" /* trap to 167Bug (.WRITDLN) */ |
---|
| 123 | ".short 0x25\n\t" |
---|
| 124 | "trap #15\n\t" |
---|
| 125 | ".short 0x63" |
---|
[5d02459] | 126 | :: "d" (the_error), "a" (&my_p_str) ); |
---|
| 127 | } |
---|