source: rtems/c/src/lib/libbsp/m68k/mvme167/fatal/bspfatal.c @ 4f38ab05

4.104.114.84.95
Last change on this file since 4f38ab05 was 4f38ab05, checked in by Joel Sherrill <joel.sherrill@…>, on 05/01/02 at 23:09:09

2002-05-01 Eric Norum <eric.norum@…>

  • console/console.c, fatal/bspfatal.c, startup/bspclean.c, startup/page_table.c: Per PR200 fix multi-line inline assembly to satisfy gcc 3.1 and newer.
  • Property mode set to 100644
File size: 3.4 KB
Line 
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 */
33static 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 */
65User_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 
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"       
126    :: "d" (the_error), "a" (&my_p_str) );
127}
Note: See TracBrowser for help on using the repository browser.