Update #4524. --- cpukit/doxygen/appl-config.h | 13 +++++ cpukit/include/rtems/rtems/config.h | 29 +++++++++- cpukit/include/rtems/score/interr.h | 1 + cpukit/sapi/src/interrtext.c | 3 +- cpukit/sapi/src/malloctaskstackforidle.c | 59 +++++++++++++++++++++ spec/build/cpukit/librtemscpu.yml | 1 + spec/build/testsuites/sptests/grp.yml | 2 + spec/build/testsuites/sptests/spfatal36.yml | 19 +++++++ testsuites/sptests/spfatal36/init.c | 52 ++++++++++++++++++ testsuites/sptests/spfatal36/spfatal36.doc | 11 ++++ testsuites/sptests/spinternalerror02/init.c | 2 +- testsuites/sptests/sptls04/init.c | 2 + 12 files changed, 191 insertions(+), 3 deletions(-) create mode 100644 cpukit/sapi/src/malloctaskstackforidle.c create mode 100644 spec/build/testsuites/sptests/spfatal36.yml create mode 100644 testsuites/sptests/spfatal36/init.c create mode 100644 testsuites/sptests/spfatal36/spfatal36.doc
diff --git a/cpukit/doxygen/appl-config.h b/cpukit/doxygen/appl-config.h index aa6dbae648..ee647dc961 100644 --- a/cpukit/doxygen/appl-config.h +++ b/cpukit/doxygen/appl-config.h @@ -4842,6 +4842,19 @@ * configuration options. It is assumed that any memory allocated for the * stack of an IDLE task will not be from the RTEMS Workspace or the memory * statically allocated by default. + * + * For applications with a thread-local storage size which is completely + * unknown at the time the application configuration is defined, RTEMS provides + * an IDLE task stack allocator which uses rtems_malloc(). The size of the + * allocated thread storage area is the sum of stack size defined by the + * #CONFIGURE_IDLE_TASK_STACK_SIZE configuration option and the actual + * thread-local storage size of the application. Define this configuration + * option to ``rtems_malloc_task_stack_for_idle`` to use this allocator. If + * the memory allocation fails, then the system terminates with the + * INTERNAL_ERROR_CORE fatal source and the + * INTERNAL_ERROR_NO_MEMORY_FOR_IDLE_TASK_STACK fatal code during system + * initialization. + * @endparblock */ #define CONFIGURE_TASK_STACK_ALLOCATOR_FOR_IDLE diff --git a/cpukit/include/rtems/rtems/config.h b/cpukit/include/rtems/rtems/config.h index 3d813c55b6..7c7f1e3aa3 100644 --- a/cpukit/include/rtems/rtems/config.h +++ b/cpukit/include/rtems/rtems/config.h @@ -10,7 +10,7 @@ */ /* - * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de) + * Copyright (C) 2020, 2022 embedded brains GmbH (http://www.embedded-brains.de) * Copyright (C) 1989, 2008 On-Line Applications Research Corporation (OAR) * * Redistribution and use in source and binary forms, with or without @@ -58,6 +58,7 @@ #define _RTEMS_RTEMS_CONFIG_H #include <stdbool.h> +#include <stddef.h> #include <stdint.h> #include <rtems/rtems/tasks.h> @@ -328,6 +329,32 @@ uint32_t rtems_configuration_get_maximum_tasks( void ); */ uint32_t rtems_configuration_get_maximum_timers( void ); +/* Generated from spec:/rtems/config/if/malloc-task-stack-for-idle */ + +/** + * @ingroup RTEMSAPIConfig + * + * @brief Allocates a thread storage area for an IDLE task using + * rtems_malloc(). + * + * @param unused is an unused parameter. + * + * @param[in,out] size is the pointer to an size_t object. At function entry, + * the object contains the size of the thread storage area not accounting for + * the thread-local storage size. When the directive call is successful, the + * size of the allocated thread storage area will be stored in this object. + * + * The thread storage size is determined by the #CONFIGURE_IDLE_TASK_STACK_SIZE + * application configuration option and the actual thread-local storage size of + * the application. The memory is allocated using rtems_malloc(). + * + * @return Returns the begin address of the allocated thread storage area. + * + * @par Notes + * See #CONFIGURE_TASK_STACK_ALLOCATOR_FOR_IDLE. + */ +void *rtems_malloc_task_stack_for_idle( uint32_t unused, size_t *size ); + #ifdef __cplusplus } #endif diff --git a/cpukit/include/rtems/score/interr.h b/cpukit/include/rtems/score/interr.h index ae4966d6d8..6e6926ab61 100644 --- a/cpukit/include/rtems/score/interr.h +++ b/cpukit/include/rtems/score/interr.h @@ -229,6 +229,7 @@ typedef enum { INTERNAL_ERROR_NO_MEMORY_FOR_PER_CPU_DATA = 40, INTERNAL_ERROR_TOO_LARGE_TLS_SIZE = 41, INTERNAL_ERROR_RTEMS_INIT_TASK_CONSTRUCT_FAILED = 42, + INTERNAL_ERROR_NO_MEMORY_FOR_IDLE_TASK_STACK = 43 } Internal_errors_Core_list; typedef CPU_Uint32ptr Internal_errors_t; diff --git a/cpukit/sapi/src/interrtext.c b/cpukit/sapi/src/interrtext.c index 383cc5bc0a..005cdc4508 100644 --- a/cpukit/sapi/src/interrtext.c +++ b/cpukit/sapi/src/interrtext.c @@ -83,7 +83,8 @@ static const char *const internal_error_text[] = { "INTERNAL_ERROR_ARC4RANDOM_GETENTROPY_FAIL", "INTERNAL_ERROR_NO_MEMORY_FOR_PER_CPU_DATA", "INTERNAL_ERROR_TOO_LARGE_TLS_SIZE", - "INTERNAL_ERROR_RTEMS_INIT_TASK_CONSTRUCT_FAILED" + "INTERNAL_ERROR_RTEMS_INIT_TASK_CONSTRUCT_FAILED", + "INTERNAL_ERROR_NO_MEMORY_FOR_IDLE_TASK_STACK" }; const char *rtems_internal_error_text( rtems_fatal_code error ) diff --git a/cpukit/sapi/src/malloctaskstackforidle.c b/cpukit/sapi/src/malloctaskstackforidle.c new file mode 100644 index 0000000000..c136a6ad4b --- /dev/null +++ b/cpukit/sapi/src/malloctaskstackforidle.c @@ -0,0 +1,59 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup RTEMSAPIConfig + * + * @brief This source file contains the implementation of + * rtems_malloc_task_stack_for_idle(). + */ + +/* + * Copyright (C) 2022 embedded brains GmbH + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <rtems/config.h> +#include <rtems/malloc.h> +#include <rtems/score/interr.h> +#include <rtems/score/tls.h> + +void *rtems_malloc_task_stack_for_idle( uint32_t unused, size_t *size ) +{ + void *area; + + (void) unused; + *size += _TLS_Get_allocation_size(); + area = rtems_malloc( *size ); + + if ( area == NULL ) { + _Internal_error( INTERNAL_ERROR_NO_MEMORY_FOR_IDLE_TASK_STACK ); + } + + return area; +} diff --git a/spec/build/cpukit/librtemscpu.yml b/spec/build/cpukit/librtemscpu.yml index f034f3fadf..57c97d9213 100644 --- a/spec/build/cpukit/librtemscpu.yml +++ b/spec/build/cpukit/librtemscpu.yml @@ -1363,6 +1363,7 @@ source: - cpukit/sapi/src/ioregisterdriver.c - cpukit/sapi/src/iounregisterdriver.c - cpukit/sapi/src/iowrite.c +- cpukit/sapi/src/malloctaskstackforidle.c - cpukit/sapi/src/panic.c - cpukit/sapi/src/profilingiterate.c - cpukit/sapi/src/profilingreportxml.c diff --git a/spec/build/testsuites/sptests/grp.yml b/spec/build/testsuites/sptests/grp.yml index c8f70ed13b..b14eefb145 100644 --- a/spec/build/testsuites/sptests/grp.yml +++ b/spec/build/testsuites/sptests/grp.yml @@ -258,6 +258,8 @@ links: uid: spfatal34 - role: build-dependency uid: spfatal35 +- role: build-dependency + uid: spfatal36 - role: build-dependency uid: spfifo01 - role: build-dependency diff --git a/spec/build/testsuites/sptests/spfatal36.yml b/spec/build/testsuites/sptests/spfatal36.yml new file mode 100644 index 0000000000..9e623e3511 --- /dev/null +++ b/spec/build/testsuites/sptests/spfatal36.yml @@ -0,0 +1,19 @@ +SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause +build-type: test-program +cflags: [] +copyrights: +- Copyright (C) 2022 embedded brains GmbH +cppflags: [] +cxxflags: [] +enabled-by: true +features: c cprogram +includes: [] +ldflags: [] +links: [] +source: +- testsuites/sptests/spfatal36/init.c +stlib: [] +target: testsuites/sptests/spfatal36.exe +type: build +use-after: [] +use-before: [] diff --git a/testsuites/sptests/spfatal36/init.c b/testsuites/sptests/spfatal36/init.c new file mode 100644 index 0000000000..78a9bc9082 --- /dev/null +++ b/testsuites/sptests/spfatal36/init.c @@ -0,0 +1,52 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/* + * Copyright (C) 2022 embedded brains GmbH + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "../spfatal_support/spfatal.h" + +#define FATAL_ERROR_TEST_NAME "36" + +#define FATAL_ERROR_DESCRIPTION "failure in idle task stack allocation" + +#define FATAL_ERROR_EXPECTED_SOURCE INTERNAL_ERROR_CORE + +#define FATAL_ERROR_EXPECTED_ERROR \ + INTERNAL_ERROR_NO_MEMORY_FOR_IDLE_TASK_STACK + +#define CONFIGURE_TASK_STACK_ALLOCATOR_FOR_IDLE rtems_malloc_task_stack_for_idle + +#define CONFIGURE_IDLE_TASK_STACK_SIZE ( SIZE_MAX - RTEMS_MINIMUM_STACK_SIZE ) + +static void force_error( void ) +{ + RTEMS_UNREACHABLE(); +} + +#include "../spfatal_support/spfatalimpl.h" diff --git a/testsuites/sptests/spfatal36/spfatal36.doc b/testsuites/sptests/spfatal36/spfatal36.doc new file mode 100644 index 0000000000..bf4a0d492d --- /dev/null +++ b/testsuites/sptests/spfatal36/spfatal36.doc @@ -0,0 +1,11 @@ +This file describes the concepts tested by this test set. + +test set name: spfatal36 + +directives: + + - rtems_malloc_task_stack_for_idle() + +concepts: + + - Provoke a memory allocation failure in the directive. diff --git a/testsuites/sptests/spinternalerror02/init.c b/testsuites/sptests/spinternalerror02/init.c index 08aeabd3a7..e139547ca5 100644 --- a/testsuites/sptests/spinternalerror02/init.c +++ b/testsuites/sptests/spinternalerror02/init.c @@ -49,7 +49,7 @@ static void test_internal_error_text(void) } while ( text != text_last ); rtems_test_assert( - error - 3 == INTERNAL_ERROR_RTEMS_INIT_TASK_CONSTRUCT_FAILED + error - 3 == INTERNAL_ERROR_NO_MEMORY_FOR_IDLE_TASK_STACK ); } diff --git a/testsuites/sptests/sptls04/init.c b/testsuites/sptests/sptls04/init.c index 79ab5a5a9a..7239092185 100644 --- a/testsuites/sptests/sptls04/init.c +++ b/testsuites/sptests/sptls04/init.c @@ -63,6 +63,8 @@ static void Init(rtems_task_argument arg) #define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER +#define CONFIGURE_TASK_STACK_ALLOCATOR_FOR_IDLE rtems_malloc_task_stack_for_idle + #define CONFIGURE_MAXIMUM_TASKS 1 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE -- 2.35.3 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel