source: rtems/cpukit/score/include/rtems/score/interr.h @ 7e119990

4.115
Last change on this file since 7e119990 was 3f5f2ce, checked in by Sebastian Huber <sebastian.huber@…>, on 03/28/14 at 12:44:18

score: PR788: Add INTERNAL_ERROR_RESOURCE_IN_USE

Issue a fatal error in case a thread is deleted which still owns
resources (e.g. a binary semaphore with priority inheritance or ceiling
protocol). The resource count must be checked quite late since RTEMS
task variable destructors, POSIX key destructors, POSIX cleanup handler,
the Newlib thread termination extension or other thread termination
extensions may release resources. In this context it would be quite
difficult to return an error status to the caller.

An alternative would be to place threads with a non-zero resource count
not on the zombie chain. Thus we have a resource leak instead of a
fatal error. The terminator thread can see this error if we return an
RTEMS_RESOURCE_IN_USE status for the rtems_task_delete() for example.

  • Property mode set to 100644
File size: 6.1 KB
Line 
1/**
2 *  @file  rtems/score/interr.h
3 *
4 *  @brief Constants and Prototypes Related to the Internal Error Handler
5 *
6 *  This include file contains constants and prototypes related
7 *  to the Internal Error Handler.
8 */
9
10/*
11 *  COPYRIGHT (c) 1989-2009.
12 *  On-Line Applications Research Corporation (OAR).
13 *
14 *  The license and distribution terms for this file may be
15 *  found in the file LICENSE in this distribution or at
16 *  http://www.rtems.org/license/LICENSE.
17 */
18
19#ifndef _RTEMS_SCORE_INTERR_H
20#define _RTEMS_SCORE_INTERR_H
21
22#include <stdbool.h>
23#include <stdint.h>
24
25#include <rtems/system.h>
26
27/**
28 *  @defgroup ScoreIntErr Internal Error Handler
29 *
30 *  @ingroup Score
31 *
32 *  This handler encapsulates functionality which provides the foundation
33 *  Semaphore services used in all of the APIs supported by RTEMS.
34 */
35/**@{*/
36
37#ifdef __cplusplus
38extern "C" {
39#endif
40
41/**
42 *  @brief This type lists the possible sources from which an error
43 *  can be reported.
44 */
45typedef enum {
46  INTERNAL_ERROR_CORE,
47  INTERNAL_ERROR_RTEMS_API,
48  INTERNAL_ERROR_POSIX_API,
49
50  /**
51   * @brief Fatal source for the block device cache.
52   *
53   * @see rtems_bdbuf_fatal_code.
54   */
55  RTEMS_FATAL_SOURCE_BDBUF,
56
57  /**
58   * @brief Fatal source for application specific errors.
59   *
60   * The fatal code is application specific.
61   */
62  RTEMS_FATAL_SOURCE_APPLICATION,
63
64  /**
65   * @brief Fatal source of exit().
66   *
67   * The fatal code is the exit() status code.
68   */
69  RTEMS_FATAL_SOURCE_EXIT,
70
71  /**
72   * @brief Fatal source for BSP errors.
73   *
74   * The fatal codes are defined in <bsp/fatal.h>.  Examples are interrupt and
75   * exception initialization.
76   *
77   * @see bsp_fatal_code and bsp_fatal().
78   */
79  RTEMS_FATAL_SOURCE_BSP,
80
81  /**
82   * @brief Fatal source of assert().
83   *
84   * The fatal code is the pointer value of the assert context.
85   *
86   * @see rtems_assert_context.
87   */
88  RTEMS_FATAL_SOURCE_ASSERT,
89
90  /**
91   * @brief Fatal source of the stack checker.
92   *
93   * The fatal code is the object name of the executing task.
94   */
95  RTEMS_FATAL_SOURCE_STACK_CHECKER,
96
97  /**
98   * @brief Fatal source of the exceptions.
99   *
100   * The fatal code is the pointer value of the exception frame pointer.
101   *
102   * @see rtems_exception_frame and rtems_exception_frame_print().
103   */
104  RTEMS_FATAL_SOURCE_EXCEPTION,
105
106  /**
107   * @brief Fatal source of SMP domain.
108   *
109   * @see SMP_Fatal_code.
110   */
111  RTEMS_FATAL_SOURCE_SMP,
112
113  /**
114   * @brief The last available fatal source.
115   *
116   * This enum value ensures that the enum type needs at least 32-bits for
117   * architectures with short enums.
118   */
119  RTEMS_FATAL_SOURCE_LAST = 0xffffffff
120} Internal_errors_Source;
121
122/**
123 *  A list of errors which are generated internally by the executive core.
124 */
125typedef enum {
126  INTERNAL_ERROR_NO_CONFIGURATION_TABLE,
127  INTERNAL_ERROR_NO_CPU_TABLE,
128  INTERNAL_ERROR_TOO_LITTLE_WORKSPACE,
129  INTERNAL_ERROR_WORKSPACE_ALLOCATION,
130  INTERNAL_ERROR_INTERRUPT_STACK_TOO_SMALL,
131  INTERNAL_ERROR_THREAD_EXITTED,
132  INTERNAL_ERROR_INCONSISTENT_MP_INFORMATION,
133  INTERNAL_ERROR_INVALID_NODE,
134  INTERNAL_ERROR_NO_MPCI,
135  INTERNAL_ERROR_BAD_PACKET,
136  INTERNAL_ERROR_OUT_OF_PACKETS,
137  INTERNAL_ERROR_OUT_OF_GLOBAL_OBJECTS,
138  INTERNAL_ERROR_OUT_OF_PROXIES,
139  INTERNAL_ERROR_INVALID_GLOBAL_ID,
140  INTERNAL_ERROR_BAD_STACK_HOOK,
141  INTERNAL_ERROR_BAD_ATTRIBUTES,
142  INTERNAL_ERROR_IMPLEMENTATION_KEY_CREATE_INCONSISTENCY,
143  INTERNAL_ERROR_IMPLEMENTATION_BLOCKING_OPERATION_CANCEL,
144  INTERNAL_ERROR_MUTEX_OBTAIN_FROM_BAD_STATE,
145  INTERNAL_ERROR_UNLIMITED_AND_MAXIMUM_IS_0,
146  OBSOLETE_INTERNAL_ERROR_SHUTDOWN_WHEN_NOT_UP,
147  INTERNAL_ERROR_GXX_KEY_ADD_FAILED,
148  INTERNAL_ERROR_GXX_MUTEX_INIT_FAILED,
149  INTERNAL_ERROR_NO_MEMORY_FOR_HEAP,
150  INTERNAL_ERROR_CPU_ISR_INSTALL_VECTOR,
151  INTERNAL_ERROR_RESOURCE_IN_USE
152} Internal_errors_Core_list;
153
154typedef uint32_t Internal_errors_t;
155
156/**
157 *  This type holds the fatal error information.
158 */
159typedef struct {
160  /** This is the source of the error. */
161  Internal_errors_Source  the_source;
162  /** This indicates if the error is internal of external. */
163  bool                    is_internal;
164  /** This is the error code. */
165  Internal_errors_t       the_error;
166} Internal_errors_Information;
167
168/**
169 *  When a fatal error occurs, the error information is stored here.
170 */
171extern Internal_errors_Information _Internal_errors_What_happened;
172
173/**
174 * @brief Initiates system termination.
175 *
176 * This routine is invoked when the application or the executive itself
177 * determines that a fatal error has occurred or a final system state is
178 * reached (for example after exit()).
179 *
180 * The first action is to disable interrupts.
181 *
182 * The second action of this function is to call the fatal handler of the user
183 * extensions.  For the initial extensions the following conditions are
184 * required
185 * - a valid stack pointer and enough stack space,
186 * - a valid code memory, and
187 * - valid read-only data.
188 *
189 * For the initial extensions the read-write data (including BSS segment) is
190 * not required on single processor configurations.  On SMP configurations
191 * however the read-write data must be initialized since this function must
192 * determine the state of the other processors and request them to shut-down if
193 * necessary.
194 *
195 * Non-initial extensions require in addition valid read-write data.  The BSP
196 * may install an initial extension that performs a system reset.  In this case
197 * the non-initial extensions will be not called.
198 *
199 * Once all fatal handler executed the error information will be stored to
200 * _Internal_errors_What_happened and the system state is set to
201 * SYSTEM_STATE_TERMINATED.
202 *
203 * The final step is to call the CPU specific _CPU_Fatal_halt().
204 *
205 * @param[in] the_source The fatal source indicating the subsystem the fatal
206 * condition originated in.
207 * @param[in] is_internal Indicates if the fatal condition was generated
208 * internally to the executive.
209 * @param[in] the_error The fatal error code.  This value must be interpreted
210 * with respect to the source.
211 *
212 * @see rtems_fatal_error_occurred() and rtems_fatal().
213 */
214void _Terminate(
215  Internal_errors_Source  the_source,
216  bool                    is_internal,
217  Internal_errors_t       the_error
218) RTEMS_COMPILER_NO_RETURN_ATTRIBUTE;
219
220#ifdef __cplusplus
221}
222#endif
223
224/**@}*/
225
226#endif
227/* end of include file */
Note: See TracBrowser for help on using the repository browser.