diff --git a/arch/Kconfig b/arch/Kconfig index ff19a257b2f..127ca685326 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -16,6 +16,7 @@ config ARCH_ARM select ARCH_HAVE_STDARG_H select ARCH_HAVE_SYSCALL_HOOKS select ARCH_HAVE_RDWR_MEM_CPU_RUN + select ARCH_HAVE_THREAD_LOCAL ---help--- The ARM architectures @@ -352,6 +353,10 @@ config ARCH_HAVE_TESTSET bool default n +config ARCH_HAVE_THREAD_LOCAL + bool + default n + config ARCH_HAVE_FETCHADD bool default n diff --git a/arch/arm/src/common/arm_internal.h b/arch/arm/src/common/arm_internal.h index 068ca0b3031..0dd2d947d2e 100644 --- a/arch/arm/src/common/arm_internal.h +++ b/arch/arm/src/common/arm_internal.h @@ -153,6 +153,10 @@ # define _DATA_INIT &_eronly # define _START_DATA &_sdata # define _END_DATA &_edata +# define _START_TDATA &_stdata +# define _END_TDATA &_etdata +# define _START_TBSS &_stbss +# define _END_TBSS &_etbss #endif /* This is the value used to mark the stack for subsequent stack monitoring @@ -240,6 +244,10 @@ EXTERN uint32_t _sdata; /* Start of .data */ EXTERN uint32_t _edata; /* End+1 of .data */ EXTERN uint32_t _sbss; /* Start of .bss */ EXTERN uint32_t _ebss; /* End+1 of .bss */ +EXTERN uint32_t _stdata; /* Start of .tdata */ +EXTERN uint32_t _etdata; /* End+1 of .tdata */ +EXTERN uint32_t _stbss; /* Start of .tbss */ +EXTERN uint32_t _etbss; /* End+1 of .tbss */ /* Sometimes, functions must be executed from RAM. In this case, the * following macro may be used (with GCC!) to specify a function that will diff --git a/arch/arm/src/common/arm_tls.c b/arch/arm/src/common/arm_tls.c new file mode 100644 index 00000000000..2a627b60385 --- /dev/null +++ b/arch/arm/src/common/arm_tls.c @@ -0,0 +1,90 @@ +/**************************************************************************** + * arch/arm/src/common/arm_tls.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include + +#include "arm_internal.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: up_tls_size + * + * Description: + * Get TLS (sizeof(struct tls_info_s) + tdata + tbss) section size. + * + * Returned Value: + * Size of (sizeof(struct tls_info_s) + tdata + tbss). + * + ****************************************************************************/ + +int up_tls_size(void) +{ + /* Extra 8 bytes (2 pointer) according to GCC */ + + return sizeof(struct tls_info_s) + + sizeof(void *) * 2 + + sizeof(uint32_t) * (_END_TBSS - _START_TDATA); +} + +/**************************************************************************** + * Name: up_tls_initialize + * + * Description: + * Initialize thread local region. + * + * Input Parameters: + * info - The TLS structure to initialize. + * + ****************************************************************************/ + +void up_tls_initialize(FAR struct tls_info_s *info) +{ + FAR uint8_t *tls_data = info->tl_data; + + uint32_t tdata_len = sizeof(uint32_t) * (_END_TDATA - _START_TDATA); + uint32_t tbss_len = sizeof(uint32_t) * (_END_TBSS - _START_TBSS); + + tls_data += sizeof(void *) * 2; + + memcpy(tls_data, _START_TDATA, tdata_len); + memset(tls_data + tdata_len, 0, tbss_len); +} + +/**************************************************************************** + * Name: __aeabi_read_tp + * + * Description: + * Read thread local storage region pointer. + * + ****************************************************************************/ + +void *__aeabi_read_tp(void) +{ + return tls_get_info()->tl_data; +} diff --git a/arch/arm/src/stm32/Make.defs b/arch/arm/src/stm32/Make.defs index ee7a9a00de1..4de29888473 100644 --- a/arch/arm/src/stm32/Make.defs +++ b/arch/arm/src/stm32/Make.defs @@ -76,6 +76,10 @@ ifeq ($(CONFIG_ARMV7M_ITMSYSLOG),y) CMN_CSRCS += arm_itm_syslog.c endif +ifeq ($(CONFIG_SCHED_THREAD_LOCAL),y) +CMN_CSRCS += arm_tls.c +endif + CHIP_CSRCS = stm32_allocateheap.c stm32_start.c stm32_rcc.c stm32_lse.c CHIP_CSRCS += stm32_lsi.c stm32_gpio.c stm32_exti_gpio.c stm32_flash.c CHIP_CSRCS += stm32_irq.c stm32_lowputc.c diff --git a/boards/arm/stm32/axoloti/scripts/ld.script b/boards/arm/stm32/axoloti/scripts/ld.script index 4fc296ce362..ffd242eb601 100644 --- a/boards/arm/stm32/axoloti/scripts/ld.script +++ b/boards/arm/stm32/axoloti/scripts/ld.script @@ -75,6 +75,18 @@ SECTIONS } > flash __exidx_end = ABSOLUTE(.); + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The RAM vector table (if present) should lie at the beginning of SRAM */ diff --git a/boards/arm/stm32/b-g431b-esc1/scripts/ld.script b/boards/arm/stm32/b-g431b-esc1/scripts/ld.script index e565025f0f5..e989b04cd54 100644 --- a/boards/arm/stm32/b-g431b-esc1/scripts/ld.script +++ b/boards/arm/stm32/b-g431b-esc1/scripts/ld.script @@ -87,6 +87,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : ALIGN(4) { diff --git a/boards/arm/stm32/b-g474e-dpow1/scripts/ld.script b/boards/arm/stm32/b-g474e-dpow1/scripts/ld.script index d2be3e94e8b..75fe3107df1 100644 --- a/boards/arm/stm32/b-g474e-dpow1/scripts/ld.script +++ b/boards/arm/stm32/b-g474e-dpow1/scripts/ld.script @@ -87,6 +87,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : ALIGN(4) { diff --git a/boards/arm/stm32/b-g474e-dpow1/scripts/ld.script.dfu b/boards/arm/stm32/b-g474e-dpow1/scripts/ld.script.dfu index 2e526aa631a..1925fdd93ba 100644 --- a/boards/arm/stm32/b-g474e-dpow1/scripts/ld.script.dfu +++ b/boards/arm/stm32/b-g474e-dpow1/scripts/ld.script.dfu @@ -90,6 +90,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : ALIGN(4) { diff --git a/boards/arm/stm32/clicker2-stm32/scripts/flash.ld b/boards/arm/stm32/clicker2-stm32/scripts/flash.ld index 254c2dbc2fa..cf07ccb0964 100644 --- a/boards/arm/stm32/clicker2-stm32/scripts/flash.ld +++ b/boards/arm/stm32/clicker2-stm32/scripts/flash.ld @@ -77,6 +77,18 @@ SECTIONS } > flash __exidx_end = ABSOLUTE(.); + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : diff --git a/boards/arm/stm32/cloudctrl/scripts/cloudctrl.ld b/boards/arm/stm32/cloudctrl/scripts/cloudctrl.ld index c446a5178c9..09e6b31beb6 100644 --- a/boards/arm/stm32/cloudctrl/scripts/cloudctrl.ld +++ b/boards/arm/stm32/cloudctrl/scripts/cloudctrl.ld @@ -65,6 +65,18 @@ SECTIONS } > flash __exidx_end = ABSOLUTE(.); + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The STM32F107VC has 64Kb of SRAM beginning at the following address */ diff --git a/boards/arm/stm32/emw3162/scripts/ld.script b/boards/arm/stm32/emw3162/scripts/ld.script index 493d32fa84f..f8595b99da8 100644 --- a/boards/arm/stm32/emw3162/scripts/ld.script +++ b/boards/arm/stm32/emw3162/scripts/ld.script @@ -79,6 +79,18 @@ SECTIONS } > flash __exidx_end = ABSOLUTE(.); + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : { diff --git a/boards/arm/stm32/et-stm32-stamp/scripts/ld.script b/boards/arm/stm32/et-stm32-stamp/scripts/ld.script index b0b307a478e..1846d58cbe9 100644 --- a/boards/arm/stm32/et-stm32-stamp/scripts/ld.script +++ b/boards/arm/stm32/et-stm32-stamp/scripts/ld.script @@ -69,6 +69,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The STM32F103RET6 has 64Kb of SRAM beginning at the following address */ diff --git a/boards/arm/stm32/fire-stm32v2/scripts/fire-stm32v2-dfu.ld b/boards/arm/stm32/fire-stm32v2/scripts/fire-stm32v2-dfu.ld index 6a04294c2cf..a477b009033 100644 --- a/boards/arm/stm32/fire-stm32v2/scripts/fire-stm32v2-dfu.ld +++ b/boards/arm/stm32/fire-stm32v2/scripts/fire-stm32v2-dfu.ld @@ -67,6 +67,18 @@ SECTIONS } > flash __exidx_end = ABSOLUTE(.); + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The STM32F103Z has 64Kb of SRAM beginning at the following address */ diff --git a/boards/arm/stm32/fire-stm32v2/scripts/fire-stm32v2.ld b/boards/arm/stm32/fire-stm32v2/scripts/fire-stm32v2.ld index 8e38cb6464f..e964e62ca82 100644 --- a/boards/arm/stm32/fire-stm32v2/scripts/fire-stm32v2.ld +++ b/boards/arm/stm32/fire-stm32v2/scripts/fire-stm32v2.ld @@ -68,6 +68,18 @@ SECTIONS } > flash __exidx_end = ABSOLUTE(.); + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The STM32F103Z has 64Kb of SRAM beginning at the following address */ diff --git a/boards/arm/stm32/hymini-stm32v/scripts/ld.script b/boards/arm/stm32/hymini-stm32v/scripts/ld.script index 55e5d122505..99eea4447c8 100644 --- a/boards/arm/stm32/hymini-stm32v/scripts/ld.script +++ b/boards/arm/stm32/hymini-stm32v/scripts/ld.script @@ -68,6 +68,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The STM32F103VCT6 has 48Kb of SRAM beginning at the following address */ diff --git a/boards/arm/stm32/maple/scripts/ld.script b/boards/arm/stm32/maple/scripts/ld.script index e2346d3fd3e..c134643b4fa 100644 --- a/boards/arm/stm32/maple/scripts/ld.script +++ b/boards/arm/stm32/maple/scripts/ld.script @@ -68,6 +68,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The STM32F103VCT6 has 48Kb of SRAM beginning at the following address */ diff --git a/boards/arm/stm32/mikroe-stm32f4/scripts/ld.script b/boards/arm/stm32/mikroe-stm32f4/scripts/ld.script index e9f98ef22a9..f5ac21cd51f 100644 --- a/boards/arm/stm32/mikroe-stm32f4/scripts/ld.script +++ b/boards/arm/stm32/mikroe-stm32f4/scripts/ld.script @@ -74,6 +74,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : ALIGN(4) { diff --git a/boards/arm/stm32/nucleo-f103rb/scripts/ld.script b/boards/arm/stm32/nucleo-f103rb/scripts/ld.script index bd9ca760e70..e0d905fc338 100644 --- a/boards/arm/stm32/nucleo-f103rb/scripts/ld.script +++ b/boards/arm/stm32/nucleo-f103rb/scripts/ld.script @@ -69,6 +69,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The RAM vector table (if present) should lie at the beginning of SRAM */ diff --git a/boards/arm/stm32/nucleo-f207zg/scripts/ld.script b/boards/arm/stm32/nucleo-f207zg/scripts/ld.script index ad8399496e4..5d5740d6a08 100644 --- a/boards/arm/stm32/nucleo-f207zg/scripts/ld.script +++ b/boards/arm/stm32/nucleo-f207zg/scripts/ld.script @@ -72,6 +72,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : ALIGN(4) { diff --git a/boards/arm/stm32/nucleo-f302r8/scripts/ld.script b/boards/arm/stm32/nucleo-f302r8/scripts/ld.script index 2cde41c735b..de8a7f1bb21 100644 --- a/boards/arm/stm32/nucleo-f302r8/scripts/ld.script +++ b/boards/arm/stm32/nucleo-f302r8/scripts/ld.script @@ -69,6 +69,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The RAM vector table (if present) should lie at the beginning of SRAM */ diff --git a/boards/arm/stm32/nucleo-f303re/scripts/ld.script b/boards/arm/stm32/nucleo-f303re/scripts/ld.script index 81488011739..5138140cd98 100644 --- a/boards/arm/stm32/nucleo-f303re/scripts/ld.script +++ b/boards/arm/stm32/nucleo-f303re/scripts/ld.script @@ -69,6 +69,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : ALIGN(4) { diff --git a/boards/arm/stm32/nucleo-f303ze/scripts/ld.script b/boards/arm/stm32/nucleo-f303ze/scripts/ld.script index 44a627c70b9..896699b1418 100644 --- a/boards/arm/stm32/nucleo-f303ze/scripts/ld.script +++ b/boards/arm/stm32/nucleo-f303ze/scripts/ld.script @@ -69,6 +69,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : ALIGN(4) { diff --git a/boards/arm/stm32/nucleo-f334r8/scripts/ld.script b/boards/arm/stm32/nucleo-f334r8/scripts/ld.script index 0be20c94399..584d8a90e34 100644 --- a/boards/arm/stm32/nucleo-f334r8/scripts/ld.script +++ b/boards/arm/stm32/nucleo-f334r8/scripts/ld.script @@ -69,6 +69,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The RAM vector table (if present) should lie at the beginning of SRAM */ diff --git a/boards/arm/stm32/nucleo-f410rb/scripts/f410rb.ld b/boards/arm/stm32/nucleo-f410rb/scripts/f410rb.ld index 0693e740c58..a5f3b8a7e3d 100644 --- a/boards/arm/stm32/nucleo-f410rb/scripts/f410rb.ld +++ b/boards/arm/stm32/nucleo-f410rb/scripts/f410rb.ld @@ -68,6 +68,18 @@ SECTIONS } > flash __exidx_end = ABSOLUTE(.); + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The STM32F410RBT6 has 32Kb of SRAM beginning at the following address */ diff --git a/boards/arm/stm32/nucleo-f412zg/scripts/f412zg.ld b/boards/arm/stm32/nucleo-f412zg/scripts/f412zg.ld index 70015aad592..c582ce322d1 100644 --- a/boards/arm/stm32/nucleo-f412zg/scripts/f412zg.ld +++ b/boards/arm/stm32/nucleo-f412zg/scripts/f412zg.ld @@ -68,6 +68,18 @@ SECTIONS } > flash __exidx_end = ABSOLUTE(.); + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : { diff --git a/boards/arm/stm32/nucleo-f429zi/scripts/ld.script b/boards/arm/stm32/nucleo-f429zi/scripts/ld.script index d3f80b70627..e9b57850659 100644 --- a/boards/arm/stm32/nucleo-f429zi/scripts/ld.script +++ b/boards/arm/stm32/nucleo-f429zi/scripts/ld.script @@ -75,6 +75,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The RAM vector table (if present) should lie at the beginning of SRAM */ diff --git a/boards/arm/stm32/nucleo-f446re/scripts/f446re.ld b/boards/arm/stm32/nucleo-f446re/scripts/f446re.ld index 19fd6c1ef5a..25bbd4f7125 100644 --- a/boards/arm/stm32/nucleo-f446re/scripts/f446re.ld +++ b/boards/arm/stm32/nucleo-f446re/scripts/f446re.ld @@ -68,6 +68,18 @@ SECTIONS } > flash __exidx_end = ABSOLUTE(.); + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The STM32F103VCT6 has 48Kb of SRAM beginning at the following address */ diff --git a/boards/arm/stm32/nucleo-f4x1re/scripts/f411re.ld b/boards/arm/stm32/nucleo-f4x1re/scripts/f411re.ld index 7d234c53e93..00a22171bce 100644 --- a/boards/arm/stm32/nucleo-f4x1re/scripts/f411re.ld +++ b/boards/arm/stm32/nucleo-f4x1re/scripts/f411re.ld @@ -58,6 +58,18 @@ SECTIONS _einit = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + .ARM.extab : { *(.ARM.extab*) } > flash diff --git a/boards/arm/stm32/nucleo-g431kb/scripts/ld.script b/boards/arm/stm32/nucleo-g431kb/scripts/ld.script index df8fda891d2..df22aaa2ca8 100755 --- a/boards/arm/stm32/nucleo-g431kb/scripts/ld.script +++ b/boards/arm/stm32/nucleo-g431kb/scripts/ld.script @@ -87,6 +87,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : ALIGN(4) { diff --git a/boards/arm/stm32/nucleo-g431rb/scripts/ld.script b/boards/arm/stm32/nucleo-g431rb/scripts/ld.script index 35db2232009..cc15b7db29d 100644 --- a/boards/arm/stm32/nucleo-g431rb/scripts/ld.script +++ b/boards/arm/stm32/nucleo-g431rb/scripts/ld.script @@ -87,6 +87,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : ALIGN(4) { diff --git a/boards/arm/stm32/nucleo-l152re/scripts/ld.script b/boards/arm/stm32/nucleo-l152re/scripts/ld.script index 4a8af663147..9bd4a3fa8ff 100644 --- a/boards/arm/stm32/nucleo-l152re/scripts/ld.script +++ b/boards/arm/stm32/nucleo-l152re/scripts/ld.script @@ -69,6 +69,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The RAM vector table (if present) should lie at the beginning of SRAM */ diff --git a/boards/arm/stm32/olimex-stm32-e407/scripts/f407ze.ld b/boards/arm/stm32/olimex-stm32-e407/scripts/f407ze.ld index e8956bd2184..3d209263976 100644 --- a/boards/arm/stm32/olimex-stm32-e407/scripts/f407ze.ld +++ b/boards/arm/stm32/olimex-stm32-e407/scripts/f407ze.ld @@ -74,6 +74,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : ALIGN(4) { diff --git a/boards/arm/stm32/olimex-stm32-e407/scripts/f407zg.ld b/boards/arm/stm32/olimex-stm32-e407/scripts/f407zg.ld index 973c3baa214..08ace877acb 100644 --- a/boards/arm/stm32/olimex-stm32-e407/scripts/f407zg.ld +++ b/boards/arm/stm32/olimex-stm32-e407/scripts/f407zg.ld @@ -74,6 +74,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : ALIGN(4) { diff --git a/boards/arm/stm32/olimex-stm32-h405/scripts/ld.script b/boards/arm/stm32/olimex-stm32-h405/scripts/ld.script index 25dbed7bd05..28f8a8e43ab 100644 --- a/boards/arm/stm32/olimex-stm32-h405/scripts/ld.script +++ b/boards/arm/stm32/olimex-stm32-h405/scripts/ld.script @@ -74,6 +74,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : ALIGN(4) { diff --git a/boards/arm/stm32/olimex-stm32-h407/scripts/ld.script b/boards/arm/stm32/olimex-stm32-h407/scripts/ld.script index 2370a58ac34..4485a65a481 100644 --- a/boards/arm/stm32/olimex-stm32-h407/scripts/ld.script +++ b/boards/arm/stm32/olimex-stm32-h407/scripts/ld.script @@ -73,6 +73,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : ALIGN(4) { diff --git a/boards/arm/stm32/olimex-stm32-p107/scripts/ld.script b/boards/arm/stm32/olimex-stm32-p107/scripts/ld.script index 76e62eb3288..e68c944531f 100644 --- a/boards/arm/stm32/olimex-stm32-p107/scripts/ld.script +++ b/boards/arm/stm32/olimex-stm32-p107/scripts/ld.script @@ -61,6 +61,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The STM32F107VC has 64Kb of SRAM beginning at the following address */ diff --git a/boards/arm/stm32/olimex-stm32-p207/scripts/ld.script b/boards/arm/stm32/olimex-stm32-p207/scripts/ld.script index 2c5672e764b..f359f2a9362 100644 --- a/boards/arm/stm32/olimex-stm32-p207/scripts/ld.script +++ b/boards/arm/stm32/olimex-stm32-p207/scripts/ld.script @@ -73,6 +73,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : ALIGN(4) { diff --git a/boards/arm/stm32/olimex-stm32-p407/scripts/flash.ld b/boards/arm/stm32/olimex-stm32-p407/scripts/flash.ld index 8d6e77c4dc3..d6f8917daef 100644 --- a/boards/arm/stm32/olimex-stm32-p407/scripts/flash.ld +++ b/boards/arm/stm32/olimex-stm32-p407/scripts/flash.ld @@ -73,6 +73,18 @@ SECTIONS } > flash __exidx_end = ABSOLUTE(.); + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : { diff --git a/boards/arm/stm32/olimexino-stm32/scripts/ld.script b/boards/arm/stm32/olimexino-stm32/scripts/ld.script index 1da42ab84df..ac5d159cc33 100644 --- a/boards/arm/stm32/olimexino-stm32/scripts/ld.script +++ b/boards/arm/stm32/olimexino-stm32/scripts/ld.script @@ -68,6 +68,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : ALIGN(4) { diff --git a/boards/arm/stm32/olimexino-stm32/scripts/ld.script.dfu b/boards/arm/stm32/olimexino-stm32/scripts/ld.script.dfu index 354562ab93f..c13d11a7449 100644 --- a/boards/arm/stm32/olimexino-stm32/scripts/ld.script.dfu +++ b/boards/arm/stm32/olimexino-stm32/scripts/ld.script.dfu @@ -62,6 +62,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The STM32F103Z has 64Kb of SRAM beginning at the following address */ diff --git a/boards/arm/stm32/omnibusf4/scripts/ld.script b/boards/arm/stm32/omnibusf4/scripts/ld.script index c012388a343..33458845b9a 100644 --- a/boards/arm/stm32/omnibusf4/scripts/ld.script +++ b/boards/arm/stm32/omnibusf4/scripts/ld.script @@ -74,6 +74,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : ALIGN(4) { diff --git a/boards/arm/stm32/photon/scripts/photon_dfu.ld b/boards/arm/stm32/photon/scripts/photon_dfu.ld index 7e55c021528..70b2132cb74 100644 --- a/boards/arm/stm32/photon/scripts/photon_dfu.ld +++ b/boards/arm/stm32/photon/scripts/photon_dfu.ld @@ -82,6 +82,18 @@ SECTIONS } > flash __exidx_end = ABSOLUTE(.); + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : { diff --git a/boards/arm/stm32/photon/scripts/photon_jtag.ld b/boards/arm/stm32/photon/scripts/photon_jtag.ld index 51c2349cc31..cf427c8047c 100644 --- a/boards/arm/stm32/photon/scripts/photon_jtag.ld +++ b/boards/arm/stm32/photon/scripts/photon_jtag.ld @@ -70,6 +70,18 @@ SECTIONS } > flash __exidx_end = ABSOLUTE(.); + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : { diff --git a/boards/arm/stm32/shenzhou/scripts/ld.script b/boards/arm/stm32/shenzhou/scripts/ld.script index ed89ab23a6a..ba03dc75de8 100644 --- a/boards/arm/stm32/shenzhou/scripts/ld.script +++ b/boards/arm/stm32/shenzhou/scripts/ld.script @@ -65,6 +65,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The STM32F107VC has 64Kb of SRAM beginning at the following address */ diff --git a/boards/arm/stm32/shenzhou/scripts/ld.script.dfu b/boards/arm/stm32/shenzhou/scripts/ld.script.dfu index 19249567dd8..61c9ae62356 100644 --- a/boards/arm/stm32/shenzhou/scripts/ld.script.dfu +++ b/boards/arm/stm32/shenzhou/scripts/ld.script.dfu @@ -67,6 +67,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The STM32F107VC has 64Kb of SRAM beginning at the following address */ diff --git a/boards/arm/stm32/stm3210e-eval/scripts/ld.script b/boards/arm/stm32/stm3210e-eval/scripts/ld.script index ea76cdd82e6..8efe9ca3681 100644 --- a/boards/arm/stm32/stm3210e-eval/scripts/ld.script +++ b/boards/arm/stm32/stm3210e-eval/scripts/ld.script @@ -68,6 +68,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The STM32F103Z has 64Kb of SRAM beginning at the following address */ diff --git a/boards/arm/stm32/stm3210e-eval/scripts/ld.script.dfu b/boards/arm/stm32/stm3210e-eval/scripts/ld.script.dfu index 7f7abb874c1..62da4535661 100644 --- a/boards/arm/stm32/stm3210e-eval/scripts/ld.script.dfu +++ b/boards/arm/stm32/stm3210e-eval/scripts/ld.script.dfu @@ -67,6 +67,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The STM32F103Z has 64Kb of SRAM beginning at the following address */ diff --git a/boards/arm/stm32/stm3220g-eval/scripts/ld.script b/boards/arm/stm32/stm3220g-eval/scripts/ld.script index 7c4c7dc026e..d701dd505d8 100644 --- a/boards/arm/stm32/stm3220g-eval/scripts/ld.script +++ b/boards/arm/stm32/stm3220g-eval/scripts/ld.script @@ -73,6 +73,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : ALIGN(4) { diff --git a/boards/arm/stm32/stm3240g-eval/scripts/ld.script b/boards/arm/stm32/stm3240g-eval/scripts/ld.script index f15c84e0cd6..aa11c9a15a7 100644 --- a/boards/arm/stm32/stm3240g-eval/scripts/ld.script +++ b/boards/arm/stm32/stm3240g-eval/scripts/ld.script @@ -74,6 +74,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : ALIGN(4) { diff --git a/boards/arm/stm32/stm32_tiny/scripts/ld.script b/boards/arm/stm32/stm32_tiny/scripts/ld.script index 72e3d3b130a..51466568605 100644 --- a/boards/arm/stm32/stm32_tiny/scripts/ld.script +++ b/boards/arm/stm32/stm32_tiny/scripts/ld.script @@ -68,6 +68,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The STM32F103C8T6 has 20Kb of SRAM beginning at the following address */ diff --git a/boards/arm/stm32/stm32butterfly2/scripts/dfu.ld b/boards/arm/stm32/stm32butterfly2/scripts/dfu.ld index 02eedb2b4ca..91eaafdedd3 100644 --- a/boards/arm/stm32/stm32butterfly2/scripts/dfu.ld +++ b/boards/arm/stm32/stm32butterfly2/scripts/dfu.ld @@ -61,6 +61,18 @@ SECTIONS } > flash __exidx_end = ABSOLUTE(.); + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The RAM vector table (if present) should lie at the beginning of SRAM */ diff --git a/boards/arm/stm32/stm32butterfly2/scripts/flash.ld b/boards/arm/stm32/stm32butterfly2/scripts/flash.ld index f631b1831cd..b08a10d2ba6 100644 --- a/boards/arm/stm32/stm32butterfly2/scripts/flash.ld +++ b/boards/arm/stm32/stm32butterfly2/scripts/flash.ld @@ -61,6 +61,18 @@ SECTIONS } > flash __exidx_end = ABSOLUTE(.); + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The RAM vector table (if present) should lie at the beginning of SRAM */ diff --git a/boards/arm/stm32/stm32f103-minimum/scripts/ld.script b/boards/arm/stm32/stm32f103-minimum/scripts/ld.script index db23e1160ea..5aea492687b 100644 --- a/boards/arm/stm32/stm32f103-minimum/scripts/ld.script +++ b/boards/arm/stm32/stm32f103-minimum/scripts/ld.script @@ -73,6 +73,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The STM32F103C8T6 has 20Kb of SRAM beginning at the following address */ diff --git a/boards/arm/stm32/stm32f103-minimum/scripts/ld.script.dfu b/boards/arm/stm32/stm32f103-minimum/scripts/ld.script.dfu index 34d7a8e430b..5c72c8fe730 100644 --- a/boards/arm/stm32/stm32f103-minimum/scripts/ld.script.dfu +++ b/boards/arm/stm32/stm32f103-minimum/scripts/ld.script.dfu @@ -67,6 +67,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The STM32F103C8T6 has 20Kb of SRAM beginning at the following address */ diff --git a/boards/arm/stm32/stm32f334-disco/scripts/ld.script b/boards/arm/stm32/stm32f334-disco/scripts/ld.script index aaed8720b7e..3bfbffea4f6 100644 --- a/boards/arm/stm32/stm32f334-disco/scripts/ld.script +++ b/boards/arm/stm32/stm32f334-disco/scripts/ld.script @@ -69,6 +69,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The RAM vector table (if present) should lie at the beginning of SRAM */ diff --git a/boards/arm/stm32/stm32f3discovery/scripts/ld.script b/boards/arm/stm32/stm32f3discovery/scripts/ld.script index 4b203ee7d21..cab35da8360 100644 --- a/boards/arm/stm32/stm32f3discovery/scripts/ld.script +++ b/boards/arm/stm32/stm32f3discovery/scripts/ld.script @@ -69,6 +69,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : ALIGN(4) { diff --git a/boards/arm/stm32/stm32f411-minimum/scripts/stm32f411ce.ld b/boards/arm/stm32/stm32f411-minimum/scripts/stm32f411ce.ld index f98239cd9f0..b401858bd65 100644 --- a/boards/arm/stm32/stm32f411-minimum/scripts/stm32f411ce.ld +++ b/boards/arm/stm32/stm32f411-minimum/scripts/stm32f411ce.ld @@ -68,6 +68,18 @@ SECTIONS } > flash __exidx_end = ABSOLUTE(.); + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The STM32F103VCT6 has 48Kb of SRAM beginning at the following address */ diff --git a/boards/arm/stm32/stm32f411e-disco/scripts/f411ve.ld b/boards/arm/stm32/stm32f411e-disco/scripts/f411ve.ld index cf6b9e889ce..a4f525d133f 100644 --- a/boards/arm/stm32/stm32f411e-disco/scripts/f411ve.ld +++ b/boards/arm/stm32/stm32f411e-disco/scripts/f411ve.ld @@ -68,6 +68,18 @@ SECTIONS } > flash __exidx_end = ABSOLUTE(.); + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The STM32F103VCT6 has 48Kb of SRAM beginning at the following address */ diff --git a/boards/arm/stm32/stm32f429i-disco/scripts/ld.script b/boards/arm/stm32/stm32f429i-disco/scripts/ld.script index 0b53d3b0002..f25c76542cb 100644 --- a/boards/arm/stm32/stm32f429i-disco/scripts/ld.script +++ b/boards/arm/stm32/stm32f429i-disco/scripts/ld.script @@ -75,6 +75,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The RAM vector table (if present) should lie at the beginning of SRAM */ diff --git a/boards/arm/stm32/stm32f4discovery/scripts/ld.script b/boards/arm/stm32/stm32f4discovery/scripts/ld.script index a402fe6c14e..cfa333796ff 100644 --- a/boards/arm/stm32/stm32f4discovery/scripts/ld.script +++ b/boards/arm/stm32/stm32f4discovery/scripts/ld.script @@ -74,6 +74,18 @@ SECTIONS __exidx_end = ABSOLUTE(.); } > flash + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : ALIGN(4) { diff --git a/boards/arm/stm32/stm32ldiscovery/scripts/stm32l152rb.ld b/boards/arm/stm32/stm32ldiscovery/scripts/stm32l152rb.ld index e663e3950b5..31a9a78bd28 100644 --- a/boards/arm/stm32/stm32ldiscovery/scripts/stm32l152rb.ld +++ b/boards/arm/stm32/stm32ldiscovery/scripts/stm32l152rb.ld @@ -73,6 +73,18 @@ SECTIONS } > flash __exidx_end = ABSOLUTE(.); + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : diff --git a/boards/arm/stm32/stm32ldiscovery/scripts/stm32l152rc.ld b/boards/arm/stm32/stm32ldiscovery/scripts/stm32l152rc.ld index b323f6fd87a..f44a5cd1ca2 100644 --- a/boards/arm/stm32/stm32ldiscovery/scripts/stm32l152rc.ld +++ b/boards/arm/stm32/stm32ldiscovery/scripts/stm32l152rc.ld @@ -73,6 +73,18 @@ SECTIONS } > flash __exidx_end = ABSOLUTE(.); + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : diff --git a/boards/arm/stm32/stm32vldiscovery/scripts/stm32vldiscovery.ld b/boards/arm/stm32/stm32vldiscovery/scripts/stm32vldiscovery.ld index 49d26237e67..f47006de2b4 100644 --- a/boards/arm/stm32/stm32vldiscovery/scripts/stm32vldiscovery.ld +++ b/boards/arm/stm32/stm32vldiscovery/scripts/stm32vldiscovery.ld @@ -68,6 +68,18 @@ SECTIONS } > flash __exidx_end = ABSOLUTE(.); + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); .data : { diff --git a/boards/arm/stm32/viewtool-stm32f107/scripts/dfu.ld b/boards/arm/stm32/viewtool-stm32f107/scripts/dfu.ld index b4d5ce0bef2..617c8f9128b 100644 --- a/boards/arm/stm32/viewtool-stm32f107/scripts/dfu.ld +++ b/boards/arm/stm32/viewtool-stm32f107/scripts/dfu.ld @@ -61,6 +61,18 @@ SECTIONS } > flash __exidx_end = ABSOLUTE(.); + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The RAM vector table (if present) should lie at the beginning of SRAM */ diff --git a/boards/arm/stm32/viewtool-stm32f107/scripts/flash.ld b/boards/arm/stm32/viewtool-stm32f107/scripts/flash.ld index 1e2a15864a8..ae0cb90337b 100644 --- a/boards/arm/stm32/viewtool-stm32f107/scripts/flash.ld +++ b/boards/arm/stm32/viewtool-stm32f107/scripts/flash.ld @@ -61,6 +61,18 @@ SECTIONS } > flash __exidx_end = ABSOLUTE(.); + .tdata : { + _stdata = ABSOLUTE(.); + *(.tdata .tdata.* .gnu.linkonce.td.*); + _etdata = ABSOLUTE(.); + } > flash + + .tbss : { + _stbss = ABSOLUTE(.); + *(.tbss .tbss.* .gnu.linkonce.tb.* .tcommon); + _etbss = ABSOLUTE(.); + } > flash + _eronly = ABSOLUTE(.); /* The RAM vector table (if present) should lie at the beginning of SRAM */ diff --git a/include/nuttx/arch.h b/include/nuttx/arch.h index 12779c60616..e7e2f36c708 100644 --- a/include/nuttx/arch.h +++ b/include/nuttx/arch.h @@ -85,6 +85,7 @@ #include #include #include +#include /**************************************************************************** * Pre-processor definitions @@ -1803,6 +1804,40 @@ int up_timer_start(FAR const struct timespec *ts); # endif #endif +/**************************************************************************** + * Name: up_tls_size + * + * Description: + * Get TLS (sizeof(struct tls_info_s) + tdata + tbss) section size. + * + * Returned Value: + * Size of (sizeof(struct tls_info_s) + tdata + tbss). + * + ****************************************************************************/ + +#ifdef CONFIG_SCHED_THREAD_LOCAL +int up_tls_size(void); +#else +#define up_tls_size() sizeof(struct tls_info_s) +#endif + +/**************************************************************************** + * Name: up_tls_initialize + * + * Description: + * Initialize thread local region + * + * Input Parameters: + * tls_data - The memory region to initialize + * + ****************************************************************************/ + +#ifdef CONFIG_SCHED_THREAD_LOCAL +void up_tls_initialize(FAR struct tls_info_s *info); +#else +#define up_tls_initialize(x) +#endif + /**************************************************************************** * Multiple CPU support ****************************************************************************/ diff --git a/include/nuttx/tls.h b/include/nuttx/tls.h index 0ba9549a2b7..4a26964f1b8 100644 --- a/include/nuttx/tls.h +++ b/include/nuttx/tls.h @@ -167,6 +167,9 @@ struct tls_info_s #endif int tl_errno; /* Per-thread error number */ +#ifdef CONFIG_SCHED_THREAD_LOCAL + uint8_t tl_data[0]; +#endif }; /**************************************************************************** diff --git a/sched/Kconfig b/sched/Kconfig index e01fa4c950a..05b13117d78 100644 --- a/sched/Kconfig +++ b/sched/Kconfig @@ -600,6 +600,14 @@ config SCHED_USER_IDENTITY Those can then be managed using the interfaces. Child tasks will inherit the UID and GID of its parent. +config SCHED_THREAD_LOCAL + bool "Support __thread/thread_local keyword" + default n + depends on ARCH_HAVE_THREAD_LOCAL + ---help--- + This option enables architecture-sepecific TLS supports (__thread/thread_local keyword) + Note: Toolchain must be compiled with '--enable-tls' enabled + endmenu # Tasks and Scheduling menu "Pthread Options" diff --git a/sched/init/nx_start.c b/sched/init/nx_start.c index 5a9ee3eeaff..521e6c121ca 100644 --- a/sched/init/nx_start.c +++ b/sched/init/nx_start.c @@ -580,7 +580,9 @@ void nx_start(void) up_initial_state(&g_idletcb[i].cmn); - /* Initialize the thread local storage */ + /* Initialize the thread local storage + * Note: Don't copy tdata and tss for idle task to improve footprint + */ info = up_stack_frame(&g_idletcb[i].cmn, sizeof(struct tls_info_s)); DEBUGASSERT(info == g_idletcb[i].cmn.stack_alloc_ptr); diff --git a/sched/pthread/pthread_create.c b/sched/pthread/pthread_create.c index aa88c8ae3c0..e58c91facbc 100644 --- a/sched/pthread/pthread_create.c +++ b/sched/pthread/pthread_create.c @@ -315,7 +315,7 @@ int nx_pthread_create(pthread_trampoline_t trampoline, FAR pthread_t *thread, /* Allocate the stack for the TCB */ ret = up_create_stack((FAR struct tcb_s *)ptcb, - sizeof(struct tls_info_s) + attr->stacksize, + up_tls_size() + attr->stacksize, TCB_FLAG_TTYPE_PTHREAD); } @@ -327,7 +327,7 @@ int nx_pthread_create(pthread_trampoline_t trampoline, FAR pthread_t *thread, /* Initialize thread local storage */ - info = up_stack_frame(&ptcb->cmn, sizeof(struct tls_info_s)); + info = up_stack_frame(&ptcb->cmn, up_tls_size()); if (info == NULL) { errcode = ENOMEM; @@ -336,6 +336,8 @@ int nx_pthread_create(pthread_trampoline_t trampoline, FAR pthread_t *thread, DEBUGASSERT(info == ptcb->cmn.stack_alloc_ptr); + up_tls_initialize(info); + /* Attach per-task info in group to TLS */ info->tl_task = ptcb->cmn.group->tg_info; diff --git a/sched/task/task_init.c b/sched/task/task_init.c index 7a757fedd10..a777c44b6ae 100644 --- a/sched/task/task_init.c +++ b/sched/task/task_init.c @@ -122,7 +122,7 @@ int nxtask_init(FAR struct task_tcb_s *tcb, const char *name, int priority, /* Allocate the stack for the TCB */ ret = up_create_stack(&tcb->cmn, - sizeof(struct tls_info_s) + stack_size, + up_tls_size() + stack_size, ttype); } @@ -133,7 +133,7 @@ int nxtask_init(FAR struct task_tcb_s *tcb, const char *name, int priority, /* Initialize thread local storage */ - info = up_stack_frame(&tcb->cmn, sizeof(struct tls_info_s)); + info = up_stack_frame(&tcb->cmn, up_tls_size()); if (info == NULL) { ret = -ENOMEM; @@ -144,6 +144,8 @@ int nxtask_init(FAR struct task_tcb_s *tcb, const char *name, int priority, info->tl_task = tcb->cmn.group->tg_info; + up_tls_initialize(info); + /* Initialize the task control block */ ret = nxtask_setup_scheduler(tcb, priority, nxtask_start, diff --git a/sched/task/task_vfork.c b/sched/task/task_vfork.c index 942f837bd70..1f633865d4a 100644 --- a/sched/task/task_vfork.c +++ b/sched/task/task_vfork.c @@ -173,7 +173,7 @@ FAR struct task_tcb_s *nxtask_setup_vfork(start_t retaddr) /* Setup thread local storage */ - info = up_stack_frame(&child->cmn, sizeof(struct tls_info_s)); + info = up_stack_frame(&child->cmn, up_tls_size()); if (info == NULL) { ret = -ENOMEM; @@ -184,6 +184,8 @@ FAR struct task_tcb_s *nxtask_setup_vfork(start_t retaddr) memcpy(info, parent->cmn.stack_alloc_ptr, sizeof(struct tls_info_s)); info->tl_task = child->cmn.group->tg_info; + up_tls_initialize(info); + /* Get the priority of the parent task */ #ifdef CONFIG_PRIORITY_INHERITANCE