This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit fac76746eae2afe91a5cb9948e3843596c9f941f
Author: guoshengyuan1 <[email protected]>
AuthorDate: Fri Jan 9 18:33:35 2026 +0800

    arch/arm: Fix TLS initialization to account for padding between sections
    
    The TLS initialization logic needs to be updated to match the modified
    linker script section definitions. The previous implementation assumed
    that _END_TDATA and _START_TBSS were contiguous, but there may be
    padding between these sections for alignment purposes.
    
    This commit updates up_tls_initialize() to explicitly account for the
    padding gap between _END_TDATA and _START_TBSS when zeroing the .tbss
    section. The size calculation in up_tls_size() is also updated to use
    _END_TBSS instead of the previous _END_TXXX definition to match the
    current linker script layout.
    
    Changes:
    - Calculate padding gap: (_START_TBSS - _END_TDATA)
    - Zero .tbss at correct offset accounting for padding
    - Update size calculation to use proper section boundaries
    
    Signed-off-by: guoshengyuan1 <[email protected]>
---
 arch/arm/src/common/arm_tls.c | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/arch/arm/src/common/arm_tls.c b/arch/arm/src/common/arm_tls.c
index f887a08066b..23812e7f881 100644
--- a/arch/arm/src/common/arm_tls.c
+++ b/arch/arm/src/common/arm_tls.c
@@ -69,7 +69,7 @@ int up_tls_size(void)
 
   return sizeof(struct tls_info_s) +
          sizeof(void *) * 2 +
-         sizeof(uint32_t) * (_END_TBSS - _START_TDATA);
+         (_END_TBSS - _START_TDATA);
 }
 
 /****************************************************************************
@@ -85,15 +85,12 @@ int up_tls_size(void)
 
 void up_tls_initialize(struct tls_info_s *info)
 {
-  uint8_t *tls_data = (uint8_t *)(info + 1);
-
-  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;
+  uint8_t *tls_data = (uint8_t *)(info + 1) + sizeof(void *) * 2;
+  uint32_t tdata_len = _END_TDATA - _START_TDATA;
+  uint32_t tbss_len = _END_TBSS - _START_TBSS;
 
   memcpy(tls_data, _START_TDATA, tdata_len);
-  memset(tls_data + tdata_len, 0, tbss_len);
+  memset(tls_data + tdata_len + (_START_TBSS - _END_TDATA), 0, tbss_len);
 }
 
 /****************************************************************************

Reply via email to