[PATCH 04/16] sapi: Add and use rtems_internal_error_description

Joel Sherrill joel.sherrill at OARcorp.com
Wed Nov 14 16:50:01 UTC 2012


FYI there is a similar table and code in 
libbsp/powerpc/shared/startup/panic.c.

It would be good to remove that and make sure I am not forgetting 
another copy.

Also this adds a public method which needs to be added to the manual

On 11/14/2012 9:46 AM, Sebastian Huber wrote:
> ---
>   cpukit/sapi/Makefile.am                            |    2 +-
>   cpukit/sapi/include/rtems/fatal.h                  |   11 ++++
>   cpukit/sapi/src/interrdesc.c                       |   58 +++++++++++++++++++
>   testsuites/psxtests/psxfatal_support/init.c        |   32 +----------
>   testsuites/sptests/Makefile.am                     |    1 +
>   testsuites/sptests/configure.ac                    |    1 +
>   testsuites/sptests/spfatal_support/init.c          |   32 +----------
>   testsuites/sptests/spinternalerror02/Makefile.am   |   19 ++++++
>   testsuites/sptests/spinternalerror02/init.c        |   61 ++++++++++++++++++++
>   .../spinternalerror02/spinternalerror02.doc        |   11 ++++
>   .../spinternalerror02/spinternalerror02.scn        |   28 +++++++++
>   11 files changed, 193 insertions(+), 63 deletions(-)
>   create mode 100644 cpukit/sapi/src/interrdesc.c
>   create mode 100644 testsuites/sptests/spinternalerror02/Makefile.am
>   create mode 100644 testsuites/sptests/spinternalerror02/init.c
>   create mode 100644 testsuites/sptests/spinternalerror02/spinternalerror02.doc
>   create mode 100644 testsuites/sptests/spinternalerror02/spinternalerror02.scn
>
> diff --git a/cpukit/sapi/Makefile.am b/cpukit/sapi/Makefile.am
> index 67f11eb..4406708 100644
> --- a/cpukit/sapi/Makefile.am
> +++ b/cpukit/sapi/Makefile.am
> @@ -37,7 +37,7 @@ libsapi_a_SOURCES = src/debug.c src/extension.c src/extensioncreate.c \
>       src/iounregisterdriver.c src/iowrite.c src/posixapi.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/chainprependnotify.c src/rbheap.c src/interrdesc.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 4ddb578..8f646a9 100644
> --- a/cpukit/sapi/include/rtems/fatal.h
> +++ b/cpukit/sapi/include/rtems/fatal.h
> @@ -23,6 +23,7 @@
>   #define _RTEMS_FATAL_H
>
>   #include <rtems/score/basedefs.h> /* RTEMS_COMPILER_NO_RETURN_ATTRIBUTE */
> +#include <rtems/extension.h>
>
>   #ifdef __cplusplus
>   extern "C" {
> @@ -42,6 +43,16 @@ void rtems_fatal_error_occurred(
>     uint32_t   the_error
>   ) RTEMS_COMPILER_NO_RETURN_ATTRIBUTE;
>
> +/**
> + * @brief Returns a description for an internal error code.
> + *
> + * @param[in] error The error code.
> + *
> + * @return The error code description or "?" in case the passed error code is
> + * invalid.
> + */
> +const char *rtems_internal_error_description( rtems_fatal_code error );
> +
>   #ifdef __cplusplus
>   }
>   #endif
> diff --git a/cpukit/sapi/src/interrdesc.c b/cpukit/sapi/src/interrdesc.c
> new file mode 100644
> index 0000000..181bcff
> --- /dev/null
> +++ b/cpukit/sapi/src/interrdesc.c
> @@ -0,0 +1,58 @@
> +/*
> + * Copyright (c) 2012 embedded brains GmbH.  All rights reserved.
> + *
> + *  embedded brains GmbH
> + *  Obere Lagerstr. 30
> + *  82178 Puchheim
> + *  Germany
> + *  <rtems at embedded-brains.de>
> + *
> + * 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 <rtems/fatal.h>
> +
> +static const char *const internal_error_desc [] = {
> +  "INTERNAL_ERROR_NO_CONFIGURATION_TABLE",
> +  "INTERNAL_ERROR_NO_CPU_TABLE",
> +  "INTERNAL_ERROR_TOO_LITTLE_WORKSPACE",
> +  "INTERNAL_ERROR_WORKSPACE_ALLOCATION",
> +  "INTERNAL_ERROR_INTERRUPT_STACK_TOO_SMALL",
> +  "INTERNAL_ERROR_THREAD_EXITTED",
> +  "INTERNAL_ERROR_INCONSISTENT_MP_INFORMATION",
> +  "INTERNAL_ERROR_INVALID_NODE",
> +  "INTERNAL_ERROR_NO_MPCI",
> +  "INTERNAL_ERROR_BAD_PACKET",
> +  "INTERNAL_ERROR_OUT_OF_PACKETS",
> +  "INTERNAL_ERROR_OUT_OF_GLOBAL_OBJECTS",
> +  "INTERNAL_ERROR_OUT_OF_PROXIES",
> +  "INTERNAL_ERROR_INVALID_GLOBAL_ID",
> +  "INTERNAL_ERROR_BAD_STACK_HOOK",
> +  "INTERNAL_ERROR_BAD_ATTRIBUTES",
> +  "INTERNAL_ERROR_IMPLEMENTATION_KEY_CREATE_INCONSISTENCY",
> +  "INTERNAL_ERROR_IMPLEMENTATION_BLOCKING_OPERATION_CANCEL",
> +  "INTERNAL_ERROR_MUTEX_OBTAIN_FROM_BAD_STATE",
> +  "INTERNAL_ERROR_UNLIMITED_AND_MAXIMUM_IS_0",
> +  "INTERNAL_ERROR_SHUTDOWN_WHEN_NOT_UP",
> +  "INTERNAL_ERROR_GXX_KEY_ADD_FAILED",
> +  "INTERNAL_ERROR_GXX_MUTEX_INIT_FAILED",
> +  "INTERNAL_ERROR_NO_MEMORY_FOR_HEAP"
> +};
> +
> +const char *rtems_internal_error_description( rtems_fatal_code error )
> +{
> +  size_t i = error;
> +  const char *desc = "?";
> +
> +  if ( i < RTEMS_ARRAY_SIZE( internal_error_desc ) ) {
> +    desc = internal_error_desc [i];
> +  }
> +
> +  return desc;
> +}
> diff --git a/testsuites/psxtests/psxfatal_support/init.c b/testsuites/psxtests/psxfatal_support/init.c
> index e2ab241..abd9a00 100644
> --- a/testsuites/psxtests/psxfatal_support/init.c
> +++ b/testsuites/psxtests/psxfatal_support/init.c
> @@ -68,40 +68,10 @@ char *Errors_Rtems[] = {
>     "RTEMS_NOT_IMPLEMENTED"           /* directive not implemented */
>   };
>
> -char *Errors_Core[] = {
> -  "INTERNAL_ERROR_NO_CONFIGURATION_TABLE",
> -  "INTERNAL_ERROR_NO_CPU_TABLE",
> -  "INTERNAL_ERROR_TOO_LITTLE_WORKSPACE",
> -  "INTERNAL_ERROR_WORKSPACE_ALLOCATION",
> -  "INTERNAL_ERROR_INTERRUPT_STACK_TOO_SMALL",
> -  "INTERNAL_ERROR_THREAD_EXITTED",
> -  "INTERNAL_ERROR_INCONSISTENT_MP_INFORMATION",
> -  "INTERNAL_ERROR_INVALID_NODE",
> -  "INTERNAL_ERROR_NO_MPCI",
> -  "INTERNAL_ERROR_BAD_PACKET",
> -  "INTERNAL_ERROR_OUT_OF_PACKETS",
> -  "INTERNAL_ERROR_OUT_OF_GLOBAL_OBJECTS",
> -  "INTERNAL_ERROR_OUT_OF_PROXIES",
> -  "INTERNAL_ERROR_INVALID_GLOBAL_ID",
> -  "INTERNAL_ERROR_BAD_STACK_HOOK",
> -  "INTERNAL_ERROR_BAD_ATTRIBUTES",
> -  "INTERNAL_ERROR_IMPLEMENTATION_KEY_CREATE_INCONSISTENCY",
> -  "INTERNAL_ERROR_IMPLEMENTATION_BLOCKING_OPERATION_CANCEL",
> -  "INTERNAL_ERROR_MUTEX_OBTAIN_FROM_BAD_STATE",
> -  "INTERNAL_ERROR_UNLIMITED_AND_MAXIMUM_IS_0",
> -  "INTERNAL_ERROR_SHUTDOWN_WHEN_NOT_UP",
> -  "INTERNAL_ERROR_GXX_KEY_ADD_FAILED",
> -  "INTERNAL_ERROR_GXX_MUTEX_INIT_FAILED",
> -  "INTERNAL_ERROR_NO_MEMORY_FOR_HEAP"
> -};
> -
>   void Put_Error( uint32_t source, uint32_t error )
>   {
>     if ( source == INTERNAL_ERROR_CORE ) {
> -    if ( error >  INTERNAL_ERROR_NO_MEMORY_FOR_HEAP )
> -      printk("Unknown Internal Core Error (%d)", error);
> -    else
> -      printk( Errors_Core[ error ] );
> +    printk( rtems_internal_error_description( error ) );
>     }
>     else if (source == INTERNAL_ERROR_RTEMS_API ){
>       if (error >  RTEMS_NOT_IMPLEMENTED )
> diff --git a/testsuites/sptests/Makefile.am b/testsuites/sptests/Makefile.am
> index b596961..1e183eb 100644
> --- a/testsuites/sptests/Makefile.am
> +++ b/testsuites/sptests/Makefile.am
> @@ -31,6 +31,7 @@ SUBDIRS = \
>   SUBDIRS += speventtransient01
>   SUBDIRS += speventsystem01
>   SUBDIRS += spinternalerror01
> +SUBDIRS += spinternalerror02
>
>   include $(top_srcdir)/../automake/subdirs.am
>   include $(top_srcdir)/../automake/local.am
> diff --git a/testsuites/sptests/configure.ac b/testsuites/sptests/configure.ac
> index 0f0c9bd..a71746f 100644
> --- a/testsuites/sptests/configure.ac
> +++ b/testsuites/sptests/configure.ac
> @@ -27,6 +27,7 @@ AC_CHECK_SIZEOF([time_t])
>
>   # Explicitly list all Makefiles here
>   AC_CONFIG_FILES([Makefile
> +spinternalerror02/Makefile
>   spinternalerror01/Makefile
>   speventsystem01/Makefile
>   speventtransient01/Makefile
> diff --git a/testsuites/sptests/spfatal_support/init.c b/testsuites/sptests/spfatal_support/init.c
> index 9822b13..c9fb7f7 100644
> --- a/testsuites/sptests/spfatal_support/init.c
> +++ b/testsuites/sptests/spfatal_support/init.c
> @@ -69,40 +69,10 @@ char *Errors_Rtems[] = {
>     "RTEMS_NOT_IMPLEMENTED"           /* directive not implemented */
>   };
>
> -char *Errors_Core[] = {
> -  "INTERNAL_ERROR_NO_CONFIGURATION_TABLE",
> -  "INTERNAL_ERROR_NO_CPU_TABLE",
> -  "INTERNAL_ERROR_TOO_LITTLE_WORKSPACE",
> -  "INTERNAL_ERROR_WORKSPACE_ALLOCATION",
> -  "INTERNAL_ERROR_INTERRUPT_STACK_TOO_SMALL",
> -  "INTERNAL_ERROR_THREAD_EXITTED",
> -  "INTERNAL_ERROR_INCONSISTENT_MP_INFORMATION",
> -  "INTERNAL_ERROR_INVALID_NODE",
> -  "INTERNAL_ERROR_NO_MPCI",
> -  "INTERNAL_ERROR_BAD_PACKET",
> -  "INTERNAL_ERROR_OUT_OF_PACKETS",
> -  "INTERNAL_ERROR_OUT_OF_GLOBAL_OBJECTS",
> -  "INTERNAL_ERROR_OUT_OF_PROXIES",
> -  "INTERNAL_ERROR_INVALID_GLOBAL_ID",
> -  "INTERNAL_ERROR_BAD_STACK_HOOK",
> -  "INTERNAL_ERROR_BAD_ATTRIBUTES",
> -  "INTERNAL_ERROR_IMPLEMENTATION_KEY_CREATE_INCONSISTENCY",
> -  "INTERNAL_ERROR_IMPLEMENTATION_BLOCKING_OPERATION_CANCEL",
> -  "INTERNAL_ERROR_MUTEX_OBTAIN_FROM_BAD_STATE",
> -  "INTERNAL_ERROR_UNLIMITED_AND_MAXIMUM_IS_0",
> -  "INTERNAL_ERROR_SHUTDOWN_WHEN_NOT_UP",
> -  "INTERNAL_ERROR_GXX_KEY_ADD_FAILED",
> -  "INTERNAL_ERROR_GXX_MUTEX_INIT_FAILED",
> -  "INTERNAL_ERROR_NO_MEMORY_FOR_HEAP"
> -};
> -
>   void Put_Error( uint32_t source, uint32_t error )
>   {
>     if ( source == INTERNAL_ERROR_CORE ) {
> -    if ( error >  INTERNAL_ERROR_NO_MEMORY_FOR_HEAP )
> -      printk("Unknown Internal Core Error (%d)", error);
> -    else
> -      printk( Errors_Core[ error ] );
> +    printk( rtems_internal_error_description( error ) );
>     }
>     else if (source == INTERNAL_ERROR_RTEMS_API ){
>       if (error >  RTEMS_NOT_IMPLEMENTED )
> diff --git a/testsuites/sptests/spinternalerror02/Makefile.am b/testsuites/sptests/spinternalerror02/Makefile.am
> new file mode 100644
> index 0000000..600e74b
> --- /dev/null
> +++ b/testsuites/sptests/spinternalerror02/Makefile.am
> @@ -0,0 +1,19 @@
> +rtems_tests_PROGRAMS = spinternalerror02
> +spinternalerror02_SOURCES = init.c
> +
> +dist_rtems_tests_DATA = spinternalerror02.scn spinternalerror02.doc
> +
> +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP at .cfg
> +include $(top_srcdir)/../automake/compile.am
> +include $(top_srcdir)/../automake/leaf.am
> +
> +AM_CPPFLAGS += -I$(top_srcdir)/../support/include
> +
> +LINK_OBJS = $(spinternalerror02_OBJECTS)
> +LINK_LIBS = $(spinternalerror02_LDLIBS)
> +
> +spinternalerror02$(EXEEXT): $(spinternalerror02_OBJECTS) $(spinternalerror02_DEPENDENCIES)
> +       @rm -f spinternalerror02$(EXEEXT)
> +       $(make-exe)
> +
> +include $(top_srcdir)/../automake/local.am
> diff --git a/testsuites/sptests/spinternalerror02/init.c b/testsuites/sptests/spinternalerror02/init.c
> new file mode 100644
> index 0000000..357ea5b
> --- /dev/null
> +++ b/testsuites/sptests/spinternalerror02/init.c
> @@ -0,0 +1,61 @@
> +/*
> + * Copyright (c) 2012 embedded brains GmbH.  All rights reserved.
> + *
> + *  embedded brains GmbH
> + *  Obere Lagerstr. 30
> + *  82178 Puchheim
> + *  Germany
> + *  <rtems at embedded-brains.de>
> + *
> + * 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.
> + */
> +
> +#ifdef HAVE_CONFIG_H
> +  #include "config.h"
> +#endif
> +
> +#include "tmacros.h"
> +
> +#include <rtems.h>
> +
> +static void test(void)
> +{
> +  rtems_fatal_code error = 0;
> +  const char *desc_last = NULL;
> +  const char *desc;
> +
> +  do {
> +    desc_last = desc;
> +    desc = rtems_internal_error_description( error );
> +    ++error;
> +    puts( desc );
> +  } while ( desc != desc_last );
> +
> +  rtems_test_assert( error - 3 == INTERNAL_ERROR_NO_MEMORY_FOR_HEAP );
> +}
> +
> +static void Init(rtems_task_argument arg)
> +{
> +  puts("\n\n*** TEST SPINTERNALERROR 2 ***");
> +
> +  test();
> +
> +  puts("*** END OF TEST SPINTERNALERROR 2 ***");
> +
> +  rtems_test_exit(0);
> +}
> +
> +#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
> +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
> +
> +#define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM
> +
> +#define CONFIGURE_MAXIMUM_TASKS 1
> +
> +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
> +
> +#define CONFIGURE_INIT
> +
> +#include <rtems/confdefs.h>
> diff --git a/testsuites/sptests/spinternalerror02/spinternalerror02.doc b/testsuites/sptests/spinternalerror02/spinternalerror02.doc
> new file mode 100644
> index 0000000..ebae4f0
> --- /dev/null
> +++ b/testsuites/sptests/spinternalerror02/spinternalerror02.doc
> @@ -0,0 +1,11 @@
> +This file describes the directives and concepts tested by this test set.
> +
> +test set name: spinternalerror02
> +
> +directives:
> +
> +  rtems_internal_error_description()
> +
> +concepts:
> +
> +  - Ensure that rtems_internal_error_description() works for some values.
> diff --git a/testsuites/sptests/spinternalerror02/spinternalerror02.scn b/testsuites/sptests/spinternalerror02/spinternalerror02.scn
> new file mode 100644
> index 0000000..c1152c4
> --- /dev/null
> +++ b/testsuites/sptests/spinternalerror02/spinternalerror02.scn
> @@ -0,0 +1,28 @@
> +*** TEST SPINTERNALERROR 2 ***
> +INTERNAL_ERROR_NO_CONFIGURATION_TABLE
> +INTERNAL_ERROR_NO_CPU_TABLE
> +INTERNAL_ERROR_TOO_LITTLE_WORKSPACE
> +INTERNAL_ERROR_WORKSPACE_ALLOCATION
> +INTERNAL_ERROR_INTERRUPT_STACK_TOO_SMALL
> +INTERNAL_ERROR_THREAD_EXITTED
> +INTERNAL_ERROR_INCONSISTENT_MP_INFORMATION
> +INTERNAL_ERROR_INVALID_NODE
> +INTERNAL_ERROR_NO_MPCI
> +INTERNAL_ERROR_BAD_PACKET
> +INTERNAL_ERROR_OUT_OF_PACKETS
> +INTERNAL_ERROR_OUT_OF_GLOBAL_OBJECTS
> +INTERNAL_ERROR_OUT_OF_PROXIES
> +INTERNAL_ERROR_INVALID_GLOBAL_ID
> +INTERNAL_ERROR_BAD_STACK_HOOK
> +INTERNAL_ERROR_BAD_ATTRIBUTES
> +INTERNAL_ERROR_IMPLEMENTATION_KEY_CREATE_INCONSISTENCY
> +INTERNAL_ERROR_IMPLEMENTATION_BLOCKING_OPERATION_CANCEL
> +INTERNAL_ERROR_MUTEX_OBTAIN_FROM_BAD_STATE
> +INTERNAL_ERROR_UNLIMITED_AND_MAXIMUM_IS_0
> +INTERNAL_ERROR_SHUTDOWN_WHEN_NOT_UP
> +INTERNAL_ERROR_GXX_KEY_ADD_FAILED
> +INTERNAL_ERROR_GXX_MUTEX_INIT_FAILED
> +INTERNAL_ERROR_NO_MEMORY_FOR_HEAP
> +?
> +?
> +*** END OF TEST SPINTERNALERROR 2 ***
> --
> 1.7.7
>
> _______________________________________________
> rtems-devel mailing list
> rtems-devel at rtems.org
> http://www.rtems.org/mailman/listinfo/rtems-devel


-- 
Joel Sherrill, Ph.D.             Director of Research&  Development
joel.sherrill at OARcorp.com        On-Line Applications Research
Ask me about RTEMS: a free RTOS  Huntsville AL 35805
     Support Available             (256) 722-9985




More information about the devel mailing list