[rtems commit] score: Clarify TLS support
Sebastian Huber
sebh at rtems.org
Thu Apr 17 06:04:20 UTC 2014
Module: rtems
Branch: master
Commit: 320faf8e68796bcea316accdfa75c1f64a73f6b7
Changeset: http://git.rtems.org/rtems/commit/?id=320faf8e68796bcea316accdfa75c1f64a73f6b7
Author: Sebastian Huber <sebastian.huber at embedded-brains.de>
Date: Thu Apr 17 07:57:09 2014 +0200
score: Clarify TLS support
---
c/src/lib/libcpu/powerpc/new-exceptions/cpu.c | 2 +-
cpukit/score/cpu/m68k/cpu.c | 2 +-
cpukit/score/cpu/sparc/cpu.c | 2 +-
cpukit/score/cpu/sparc64/cpu.c | 2 +-
cpukit/score/include/rtems/score/tls.h | 4 ++--
doc/cpu_supplement/general.t | 21 ++++++++++++++++++++-
6 files changed, 26 insertions(+), 7 deletions(-)
diff --git a/c/src/lib/libcpu/powerpc/new-exceptions/cpu.c b/c/src/lib/libcpu/powerpc/new-exceptions/cpu.c
index 3b17662..73a1d3e 100644
--- a/c/src/lib/libcpu/powerpc/new-exceptions/cpu.c
+++ b/c/src/lib/libcpu/powerpc/new-exceptions/cpu.c
@@ -135,7 +135,7 @@ void _CPU_Context_Initialize(
#endif
if ( tls_area != NULL ) {
- void *tls_block = _TLS_TCB_before_tls_block_initialize( tls_area );
+ void *tls_block = _TLS_TCB_before_TLS_block_initialize( tls_area );
the_ppc_context->gpr2 = (uint32_t) tls_block + 0x7000;
} else {
diff --git a/cpukit/score/cpu/m68k/cpu.c b/cpukit/score/cpu/m68k/cpu.c
index f6342d6..4efaaa4 100644
--- a/cpukit/score/cpu/m68k/cpu.c
+++ b/cpukit/score/cpu/m68k/cpu.c
@@ -205,6 +205,6 @@ void _CPU_Context_Initialize(
#endif
if ( tls_area != NULL ) {
- _TLS_TCB_before_tls_block_initialize( tls_area );
+ _TLS_TCB_before_TLS_block_initialize( tls_area );
}
}
diff --git a/cpukit/score/cpu/sparc/cpu.c b/cpukit/score/cpu/sparc/cpu.c
index 2878c3e..73ed4fd 100644
--- a/cpukit/score/cpu/sparc/cpu.c
+++ b/cpukit/score/cpu/sparc/cpu.c
@@ -327,7 +327,7 @@ void _CPU_Context_Initialize(
the_context->isr_dispatch_disable = 0;
if ( tls_area != NULL ) {
- void *tcb = _TLS_TCB_after_tls_block_initialize( tls_area );
+ void *tcb = _TLS_TCB_after_TLS_block_initialize( tls_area );
the_context->g7 = (uintptr_t) tcb;
}
diff --git a/cpukit/score/cpu/sparc64/cpu.c b/cpukit/score/cpu/sparc64/cpu.c
index c5420c3..6d79a5a 100644
--- a/cpukit/score/cpu/sparc64/cpu.c
+++ b/cpukit/score/cpu/sparc64/cpu.c
@@ -103,7 +103,7 @@ void _CPU_Context_Initialize(
the_context->isr_dispatch_disable = 0;
if ( tls_area != NULL ) {
- void *tcb = _TLS_TCB_after_tls_block_initialize( tls_area );
+ void *tcb = _TLS_TCB_after_TLS_block_initialize( tls_area );
the_context->g7 = (uintptr_t) tcb;
}
diff --git a/cpukit/score/include/rtems/score/tls.h b/cpukit/score/include/rtems/score/tls.h
index 75213d8..f9abc27 100644
--- a/cpukit/score/include/rtems/score/tls.h
+++ b/cpukit/score/include/rtems/score/tls.h
@@ -146,7 +146,7 @@ static inline void *_TLS_TCB_at_area_begin_initialize( void *tls_area )
}
/* Use Variant I, TLS offsets emitted by linker neglects the TCB */
-static inline void *_TLS_TCB_before_tls_block_initialize( void *tls_area )
+static inline void *_TLS_TCB_before_TLS_block_initialize( void *tls_area )
{
void *tls_block = (char *) tls_area
+ _TLS_Get_thread_control_block_area_size( (uintptr_t) _TLS_Alignment );
@@ -160,7 +160,7 @@ static inline void *_TLS_TCB_before_tls_block_initialize( void *tls_area )
}
/* Use Variant II */
-static inline void *_TLS_TCB_after_tls_block_initialize( void *tls_area )
+static inline void *_TLS_TCB_after_TLS_block_initialize( void *tls_area )
{
uintptr_t size = (uintptr_t) _TLS_Size;
uintptr_t tls_align = (uintptr_t) _TLS_Alignment;
diff --git a/doc/cpu_supplement/general.t b/doc/cpu_supplement/general.t
index 9c952a7..173f84f 100644
--- a/doc/cpu_supplement/general.t
+++ b/doc/cpu_supplement/general.t
@@ -319,7 +319,26 @@ operations of the default CPU specific fatal error handler.
In order to support thread-local storage (TLS) the CPU port must implement the
facilities mandated by the application binary interface (ABI) of the CPU
architecture. The CPU port must initialize the TLS area in the
- at code{_CPU_Context_Initialize} function.
+ at code{_CPU_Context_Initialize()} function. There are support functions available
+via @code{#include <rtems/score/tls.h>} which implement Variants I and II
+according to Ulrich Drepper, @cite{ELF Handling For Thread-Local Storage}.
+
+ at table @code
+
+ at item _TLS_TCB_at_area_begin_initialize()
+Uses Variant I, TLS offsets emitted by linker takes the TCB into account. For
+a reference implementation see @file{cpukit/score/cpu/arm/cpu.c}.
+
+ at item _TLS_TCB_before_TLS_block_initialize()
+Uses Variant I, TLS offsets emitted by linker neglects the TCB. For a
+reference implementation see
+ at file{c/src/lib/libcpu/powerpc/new-exceptions/cpu.c}.
+
+ at item _TLS_TCB_after_TLS_block_initialize()
+Uses Variant II. For a reference implementation see
+ at file{cpukit/score/cpu/sparc/cpu.c}.
+
+ at end table
The board support package (BSP) must provide the following sections and symbols
in its linker command file:
More information about the vc
mailing list