summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src/tlsallocsize.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2022-09-27 07:43:37 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2022-10-14 10:48:22 +0200
commit4c89fbcd316ca99fa16a0acc31f88fb80cb3060f (patch)
tree1d5fb6dac956308d141bd7d9b20ec74bee38427b /cpukit/score/src/tlsallocsize.c
parentscore: Move Thread_Control::Registers member (diff)
downloadrtems-4c89fbcd316ca99fa16a0acc31f88fb80cb3060f.tar.bz2
score: Add CPU_THREAD_LOCAL_STORAGE_VARIANT
Update #3835.
Diffstat (limited to '')
-rw-r--r--cpukit/score/src/tlsallocsize.c44
1 files changed, 30 insertions, 14 deletions
diff --git a/cpukit/score/src/tlsallocsize.c b/cpukit/score/src/tlsallocsize.c
index d761f3b6cf..1a4027d517 100644
--- a/cpukit/score/src/tlsallocsize.c
+++ b/cpukit/score/src/tlsallocsize.c
@@ -10,7 +10,7 @@
*/
/*
- * Copyright (C) 2014, 2020 embedded brains GmbH (http://www.embedded-brains.de)
+ * Copyright (C) 2014, 2022 embedded brains GmbH
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -58,29 +58,45 @@ uintptr_t _TLS_Get_allocation_size( void )
allocation_size = _TLS_Allocation_size;
if ( allocation_size == 0 ) {
- uintptr_t alignment;
-
- alignment = _TLS_Align_up( (uintptr_t) _TLS_Alignment );
-
- allocation_size = size;
- allocation_size += _TLS_Get_thread_control_block_area_size( alignment );
-#ifndef __i386__
- allocation_size += sizeof( TLS_Dynamic_thread_vector );
-#endif
+ uintptr_t tls_align;
+ uintptr_t stack_align;
/*
* The TLS area is allocated in the thread storage area. Each allocation
* shall meet the stack alignment requirement.
*/
- allocation_size = _TLS_Align_up( allocation_size );
+ stack_align = CPU_STACK_ALIGNMENT;
+ tls_align = RTEMS_ALIGN_UP( (uintptr_t) _TLS_Alignment, stack_align );
+
+#ifndef __i386__
+ /* Reserve space for the dynamic thread vector */
+ allocation_size +=
+ RTEMS_ALIGN_UP( sizeof( TLS_Dynamic_thread_vector ), stack_align );
+#endif
+
+ /* Reserve space for the thread control block */
+ allocation_size +=
+#if CPU_THREAD_LOCAL_STORAGE_VARIANT == 11
+ RTEMS_ALIGN_UP( sizeof( TLS_Thread_control_block ), tls_align );
+#else
+ RTEMS_ALIGN_UP( sizeof( TLS_Thread_control_block ), stack_align );
+#endif
+
+ /* Reserve space for the thread-local storage data */
+ allocation_size +=
+#if CPU_THREAD_LOCAL_STORAGE_VARIANT == 20
+ RTEMS_ALIGN_UP( size, tls_align );
+#else
+ RTEMS_ALIGN_UP( size, stack_align );
+#endif
/*
* The stack allocator does not support aligned allocations. Allocate
* enough to do the alignment manually.
*/
- if ( alignment > CPU_STACK_ALIGNMENT ) {
- _Assert( alignment % CPU_STACK_ALIGNMENT == 0 );
- allocation_size += alignment - CPU_STACK_ALIGNMENT;
+ if ( tls_align > stack_align ) {
+ _Assert( tls_align % stack_align == 0 );
+ allocation_size += tls_align - stack_align;
}
if ( _Thread_Maximum_TLS_size != 0 ) {