jerpelea opened a new pull request, #21262:
URL: https://github.com/apache/nuttx/pull/21262
## Summary
The linker symbols _stdata/_etdata/_stbss/_etbss are uint8_t arrays since
commit 70290b6e38 ("arch: Change the linker generated symbols from uint32_t to
uint8_t *"), but riscv_tls.c still multiplied their differences by
sizeof(uint32_t). up_tls_size() reserved four times the TLS block size and
up_tls_initialize() copied four times the size of .tdata, so the bytes that
follow .tdata in the image (.data) overwrote the .tbss variables of every new
thread.
ARM had the same problem and was fixed by commit fac76746eae ("arch/arm: Fix
TLS initialization to account for padding between sections"). Apply the same
change here: use byte differences, and zero .tbss after the alignment padding
between .tdata and .tbss.
Found with CPython on rv-virt (CONFIG_SCHED_THREAD_LOCAL=y, toolchain built
with --enable-tls): _Py_tss_tstate in .tbss was not NULL in new threads, "Fatal
Python error: _PyThreadState_Attach: non-NULL old thread state". Not seen in
CI: the xPack riscv-none-elf toolchain is built with --disable-tls, so __thread
uses emulated TLS and .tdata/.tbss are empty.
## Impact
RELEASE
## Testing
CI
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]