[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