[PATCH v2 00/13] More robust idle thread creation and TLS handling
Sebastian Huber
sebastian.huber at embedded-brains.de
Thu Oct 6 08:23:19 UTC 2022
This patch set started with an 8 byte overwrite of the interrupt stack while
porting an application from RTEMS 5 to 6.
The overwrite was due to a mismatch of the size returned by
_TLS_Get_allocation_size() and the actual usage of the area. To fix this issue
it was necessary to add a new CPU port option:
CPU_THREAD_LOCAL_STORAGE_VARIANT. I checked also the glibc implementations.
It seems that on some architectures (for example powerpc) the TCB is used for a
couple of more things. For RTEMS, we don't really need the DTV and TCB. It
could be useful for debuggers, however, then we probably need also some glibc
compatibility.
Add a new fatal error to catch a failing idle thread initialization:
INTERNAL_ERROR_IDLE_THREAD_CREATE_FAILED. This can only happen if a thread
create extension fails for an idle thread.
By default, allocate the IDLE task storage areas from the RTEMS Workspace.
This avoids having to estimate the thread-local storage size in the default
configuration.
Add the application configuration option CONFIGURE_IDLE_TASK_STORAGE_SIZE to
request a static allocation of the task storage area for IDLE tasks.
v2:
* Add CONFIGURE_IDLE_TASK_STORAGE_SIZE instead of CONFIGURE_IDLE_TASK_MINIMUM_STACK_SIZE.
Sebastian Huber (13):
sptls0*: Enable stack checker
sptls01: Disable file system and Newlib reentrancy
sptls02: Fix alignment check
score: Require power of two CPU_STACK_MINIMUM_SIZE
config: Changeable size for IDLE stack allocator
score: Add CPU_THREAD_LOCAL_STORAGE_VARIANT
score: Simplify casts
score: INTERNAL_ERROR_IDLE_THREAD_CREATE_FAILED
stackchk: Avoid internal header file
stackchk: Add rtems_stack_checker_iterate()
stackchk01: Check CPU_STACK_MINIMUM_SIZE
config: Add CONFIGURE_IDLE_TASK_STORAGE_SIZE
score: INTERNAL_ERROR_IDLE_THREAD_STACK_TOO_SMALL
bsps/powerpc/shared/cpu.c | 2 +-
cpukit/doxygen/appl-config.h | 95 +++++++-
cpukit/include/rtems/confdefs/percpu.h | 14 --
cpukit/include/rtems/confdefs/threads.h | 4 +
cpukit/include/rtems/confdefs/wkspace.h | 50 ++++-
cpukit/include/rtems/score/interr.h | 3 +
cpukit/include/rtems/score/stack.h | 75 ++++++-
cpukit/include/rtems/score/thread.h | 7 -
cpukit/include/rtems/score/tls.h | 210 +++++++-----------
cpukit/include/rtems/stackchk.h | 89 +++++++-
cpukit/libmisc/stackchk/check.c | 158 +++++++------
cpukit/sapi/src/interrtext.c | 5 +-
cpukit/score/cpu/aarch64/cpu.c | 2 +-
.../cpu/aarch64/include/rtems/score/cpu.h | 2 +-
.../cpu/aarch64/include/rtems/score/cpuimpl.h | 3 +
cpukit/score/cpu/arm/__aeabi_read_tp.c | 6 +-
cpukit/score/cpu/arm/__tls_get_addr.c | 6 +-
.../score/cpu/arm/armv7m-context-initialize.c | 2 +-
cpukit/score/cpu/arm/cpu.c | 17 +-
.../score/cpu/arm/include/rtems/score/cpu.h | 10 +-
.../cpu/arm/include/rtems/score/cpuimpl.h | 2 +
.../cpu/bfin/include/rtems/score/cpuimpl.h | 2 +
cpukit/score/cpu/i386/cpu.c | 2 +-
.../cpu/i386/include/rtems/score/cpuimpl.h | 2 +
.../cpu/lm32/include/rtems/score/cpuimpl.h | 2 +
cpukit/score/cpu/m68k/__m68k_read_tp.c | 4 +-
cpukit/score/cpu/m68k/cpu.c | 5 +-
.../score/cpu/m68k/include/rtems/score/cpu.h | 1 +
.../cpu/m68k/include/rtems/score/cpuimpl.h | 2 +
cpukit/score/cpu/microblaze/__tls_get_addr.c | 10 +-
cpukit/score/cpu/microblaze/cpu.c | 2 +-
.../cpu/microblaze/include/rtems/score/cpu.h | 1 +
.../microblaze/include/rtems/score/cpuimpl.h | 3 +
.../cpu/mips/include/rtems/score/cpuimpl.h | 2 +
.../score/cpu/moxie/include/rtems/score/cpu.h | 2 +-
.../cpu/moxie/include/rtems/score/cpuimpl.h | 2 +
.../cpu/nios2/include/rtems/score/cpuimpl.h | 2 +
.../cpu/nios2/nios2-context-initialize.c | 5 +-
.../cpu/no_cpu/include/rtems/score/cpu.h | 3 +-
.../cpu/no_cpu/include/rtems/score/cpuimpl.h | 18 ++
.../cpu/or1k/include/rtems/score/cpuimpl.h | 2 +
.../cpu/powerpc/include/rtems/score/cpuimpl.h | 2 +
.../cpu/riscv/include/rtems/score/cpuimpl.h | 2 +
.../cpu/riscv/riscv-context-initialize.c | 2 +-
.../cpu/sh/include/rtems/score/cpuimpl.h | 2 +
cpukit/score/cpu/sparc/cpu.c | 2 +-
.../cpu/sparc/include/rtems/score/cpuimpl.h | 2 +
cpukit/score/cpu/sparc64/cpu.c | 2 +-
.../cpu/sparc64/include/rtems/score/cpuimpl.h | 2 +
.../cpu/v850/include/rtems/score/cpuimpl.h | 2 +
.../cpu/x86_64/include/rtems/score/cpuimpl.h | 2 +
cpukit/score/src/percpuasm.c | 7 +-
cpukit/score/src/stackallocatorforidle.c | 44 ++--
.../score/src/stackallocatorforidlewkspace.c | 60 +++++
cpukit/score/src/threadcreateidle.c | 43 +++-
cpukit/score/src/threadinitialize.c | 6 +-
cpukit/score/src/tlsallocsize.c | 44 ++--
spec/build/cpukit/librtemscpu.yml | 1 +
spec/build/testsuites/sptests/grp.yml | 2 +
spec/build/testsuites/sptests/spfatal36.yml | 19 ++
.../fatal-idle-thread-create-failed.yml | 20 ++
.../fatal-idle-thread-stack-too-small.yml | 20 ++
spec/build/testsuites/validation/grp.yml | 4 +
testsuites/libtests/stackchk01/init.c | 30 ++-
testsuites/libtests/stackchk01/stackchk01.doc | 12 +-
testsuites/sptests/spfatal36/init.c | 62 ++++++
testsuites/sptests/spfatal36/spfatal36.doc | 11 +
testsuites/sptests/spinternalerror02/init.c | 2 +-
testsuites/sptests/spstkalloc03/init.c | 4 +-
testsuites/sptests/spstkalloc04/init.c | 4 +-
testsuites/sptests/sptls01/init.c | 39 +++-
testsuites/sptests/sptls02/init.cc | 18 +-
testsuites/sptests/sptls03/init.c | 4 +
.../tr-fatal-idle-thread-create-failed.c | 158 +++++++++++++
.../tr-fatal-idle-thread-create-failed.h | 84 +++++++
.../tr-fatal-idle-thread-stack-too-small.c | 175 +++++++++++++++
.../tr-fatal-idle-thread-stack-too-small.h | 84 +++++++
testsuites/validation/ts-config.h | 2 +-
testsuites/validation/ts-default.h | 9 +-
.../ts-fatal-idle-thread-create-failed.c | 90 ++++++++
.../ts-fatal-idle-thread-stack-too-small.c | 97 ++++++++
testsuites/validation/ts-fatal-sysinit.h | 9 +
testsuites/validation/ts-idle.h | 4 +
testsuites/validation/ts-validation-acfg-0.c | 2 +
testsuites/validation/ts-validation-acfg-1.c | 2 +
.../validation/ts-validation-io-kernel.c | 2 +
testsuites/validation/ts-validation-tls-1.c | 3 +
87 files changed, 1660 insertions(+), 371 deletions(-)
create mode 100644 cpukit/score/src/stackallocatorforidlewkspace.c
create mode 100644 spec/build/testsuites/sptests/spfatal36.yml
create mode 100644 spec/build/testsuites/validation/fatal-idle-thread-create-failed.yml
create mode 100644 spec/build/testsuites/validation/fatal-idle-thread-stack-too-small.yml
create mode 100644 testsuites/sptests/spfatal36/init.c
create mode 100644 testsuites/sptests/spfatal36/spfatal36.doc
create mode 100644 testsuites/validation/tr-fatal-idle-thread-create-failed.c
create mode 100644 testsuites/validation/tr-fatal-idle-thread-create-failed.h
create mode 100644 testsuites/validation/tr-fatal-idle-thread-stack-too-small.c
create mode 100644 testsuites/validation/tr-fatal-idle-thread-stack-too-small.h
create mode 100644 testsuites/validation/ts-fatal-idle-thread-create-failed.c
create mode 100644 testsuites/validation/ts-fatal-idle-thread-stack-too-small.c
--
2.35.3
More information about the devel
mailing list