linker: tls: fix tdata/tbss locations

__tbss_start should be a virtual address.
__tdata_start should also be a virtual address, unless we're
using XIP in which case each thread should copy its thread-
local data out of flash.

Fixes issues with a kernel linked at a virtual address.

Signed-off-by: Andrew Boie <andrew.p.boie@intel.com>
This commit is contained in:
Andrew Boie 2020-11-12 10:46:30 -08:00 committed by Anas Nashif
commit 1e7b28e2e6

View file

@ -18,12 +18,17 @@
* thread-local variables, and the code would use * thread-local variables, and the code would use
* the wrong values. * the wrong values.
*/ */
#ifdef CONFIG_XIP
/* The "master copy" of tdata should be only in flash on XIP systems */
PROVIDE(__tdata_start = LOADADDR(tdata)); PROVIDE(__tdata_start = LOADADDR(tdata));
#else
PROVIDE(__tdata_start = ADDR(tdata));
#endif
PROVIDE(__tdata_size = SIZEOF(tdata)); PROVIDE(__tdata_size = SIZEOF(tdata));
PROVIDE(__tdata_end = __tdata_start + __tdata_size); PROVIDE(__tdata_end = __tdata_start + __tdata_size);
PROVIDE(__tdata_align = ALIGNOF(tdata)); PROVIDE(__tdata_align = ALIGNOF(tdata));
PROVIDE(__tbss_start = LOADADDR(tbss)); PROVIDE(__tbss_start = ADDR(tbss));
PROVIDE(__tbss_size = SIZEOF(tbss)); PROVIDE(__tbss_size = SIZEOF(tbss));
PROVIDE(__tbss_end = __tbss_start + __tbss_size); PROVIDE(__tbss_end = __tbss_start + __tbss_size);
PROVIDE(__tbss_align = ALIGNOF(tbss)); PROVIDE(__tbss_align = ALIGNOF(tbss));