From f2f39b62a284afefbf8f1840255602162a9b2a01 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 7 Jan 2013 16:01:45 +0100 Subject: sapi: Add rtems_fatal_source_description() --- cpukit/sapi/Makefile.am | 2 +- cpukit/sapi/include/rtems/fatal.h | 10 ++++ cpukit/sapi/src/fatalsrcdesc.c | 53 ++++++++++++++++++++++ doc/user/fatal.t | 27 +++++++++++ testsuites/sptests/spinternalerror02/init.c | 21 ++++++++- .../spinternalerror02/spinternalerror02.scn | 13 ++++++ 6 files changed, 123 insertions(+), 3 deletions(-) create mode 100644 cpukit/sapi/src/fatalsrcdesc.c diff --git a/cpukit/sapi/Makefile.am b/cpukit/sapi/Makefile.am index 232028e63c..f9fd4f9696 100644 --- a/cpukit/sapi/Makefile.am +++ b/cpukit/sapi/Makefile.am @@ -38,7 +38,7 @@ libsapi_a_SOURCES = src/debug.c src/extension.c src/extensioncreate.c \ src/rtemsapi.c src/extensiondata.c src/getversionstring.c \ src/chainappendnotify.c src/chaingetnotify.c src/chaingetwait.c \ src/chainprependnotify.c src/rbheap.c src/interrdesc.c \ - src/fatal2.c + src/fatal2.c src/fatalsrcdesc.c libsapi_a_CPPFLAGS = $(AM_CPPFLAGS) include $(srcdir)/preinstall.am diff --git a/cpukit/sapi/include/rtems/fatal.h b/cpukit/sapi/include/rtems/fatal.h index 64344b36b8..46a7ab9574 100644 --- a/cpukit/sapi/include/rtems/fatal.h +++ b/cpukit/sapi/include/rtems/fatal.h @@ -82,6 +82,16 @@ void rtems_fatal( rtems_fatal_code error ) RTEMS_COMPILER_NO_RETURN_ATTRIBUTE; +/** + * @brief Returns a description for a fatal source. + * + * @param[in] source The fatal source. + * + * @return The fatal source description or "?" in case the passed fatal source + * is invalid. + */ +const char *rtems_fatal_source_description( rtems_fatal_source source ); + /** * @brief Returns a description for an internal error code. * diff --git a/cpukit/sapi/src/fatalsrcdesc.c b/cpukit/sapi/src/fatalsrcdesc.c new file mode 100644 index 0000000000..fbe8485853 --- /dev/null +++ b/cpukit/sapi/src/fatalsrcdesc.c @@ -0,0 +1,53 @@ +/** + * @file + * + * @brief Implementation of rtems_fatal_source_description() + * + * @ingroup ClassicFatal + */ + +/* + * Copyright (c) 2013 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Obere Lagerstr. 30 + * 82178 Puchheim + * Germany + * + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + */ + +#if HAVE_CONFIG_H + #include "config.h" +#endif + +#include + +static const char *const fatal_source_desc [] = { + "INTERNAL_ERROR_CORE", + "INTERNAL_ERROR_RTEMS_API", + "INTERNAL_ERROR_POSIX_API", + "RTEMS_FATAL_SOURCE_BDBUF", + "RTEMS_FATAL_SOURCE_APPLICATION", + "RTEMS_FATAL_SOURCE_EXIT", + "RTEMS_FATAL_SOURCE_BSP_GENERIC", + "RTEMS_FATAL_SOURCE_BSP_SPECIFIC", + "RTEMS_FATAL_SOURCE_ASSERT", + "RTEMS_FATAL_SOURCE_STACK_CHECKER", + "RTEMS_FATAL_SOURCE_EXCEPTION" +}; + +const char *rtems_fatal_source_description( rtems_fatal_source source ) +{ + size_t i = source; + const char *desc = "?"; + + if ( i < RTEMS_ARRAY_SIZE( fatal_source_desc ) ) { + desc = fatal_source_desc [i]; + } + + return desc; +} diff --git a/doc/user/fatal.t b/doc/user/fatal.t index 1b725e89f4..20faa642ba 100644 --- a/doc/user/fatal.t +++ b/doc/user/fatal.t @@ -226,6 +226,33 @@ NONE Prints the exception frame via printk(). +@c +@c +@c +@page +@subsection FATAL_SOURCE_DESCRIPTION - Returns a description for a fatal source + +@cindex fatal error + +@subheading CALLING SEQUENCE: + +@ifset is-C +@findex rtems_fatal_source_description +@example +const char *rtems_fatal_source_description( + rtems_fatal_source source +); +@end example +@end ifset + +@subheading DIRECTIVE STATUS CODES + +The fatal source description or "?" in case the passed fatal source is invalid. + +@subheading DESCRIPTION: + +Returns a description for a fatal source. + @c @c @c diff --git a/testsuites/sptests/spinternalerror02/init.c b/testsuites/sptests/spinternalerror02/init.c index 79b36ca89c..8bfb6503e9 100644 --- a/testsuites/sptests/spinternalerror02/init.c +++ b/testsuites/sptests/spinternalerror02/init.c @@ -20,7 +20,7 @@ #include -static void test(void) +static void test_internal_error_description(void) { rtems_fatal_code error = 0; const char *desc_last = NULL; @@ -36,11 +36,28 @@ static void test(void) rtems_test_assert( error - 3 == INTERNAL_ERROR_CPU_ISR_INSTALL_VECTOR ); } +static void test_fatal_source_description(void) +{ + rtems_fatal_source source = 0; + const char *desc_last = NULL; + const char *desc; + + do { + desc_last = desc; + desc = rtems_fatal_source_description( source ); + ++source; + puts( desc ); + } while ( desc != desc_last ); + + rtems_test_assert( source - 3 == RTEMS_FATAL_SOURCE_EXCEPTION ); +} + static void Init(rtems_task_argument arg) { puts("\n\n*** TEST SPINTERNALERROR 2 ***"); - test(); + test_internal_error_description(); + test_fatal_source_description(); puts("*** END OF TEST SPINTERNALERROR 2 ***"); diff --git a/testsuites/sptests/spinternalerror02/spinternalerror02.scn b/testsuites/sptests/spinternalerror02/spinternalerror02.scn index 6fdbed6083..9d7a722751 100644 --- a/testsuites/sptests/spinternalerror02/spinternalerror02.scn +++ b/testsuites/sptests/spinternalerror02/spinternalerror02.scn @@ -26,4 +26,17 @@ INTERNAL_ERROR_NO_MEMORY_FOR_HEAP INTERNAL_ERROR_CPU_ISR_INSTALL_VECTOR ? ? +INTERNAL_ERROR_CORE +INTERNAL_ERROR_RTEMS_API +INTERNAL_ERROR_POSIX_API +RTEMS_FATAL_SOURCE_BDBUF +RTEMS_FATAL_SOURCE_APPLICATION +RTEMS_FATAL_SOURCE_EXIT +RTEMS_FATAL_SOURCE_BSP_GENERIC +RTEMS_FATAL_SOURCE_BSP_SPECIFIC +RTEMS_FATAL_SOURCE_ASSERT +RTEMS_FATAL_SOURCE_STACK_CHECKER +RTEMS_FATAL_SOURCE_EXCEPTION +? +? *** END OF TEST SPINTERNALERROR 2 *** -- cgit v1.2.3