From b1071cca0043a2c81e1bb032660560c53df888d5 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Tue, 5 May 2020 07:28:04 -0600 Subject: [PATCH] libs/libc/tls/Kconfig: Add CONFIG_TLS_ALIGNED CONFIG_TLS_ALIGNED will select the (legacy) aligned stack implementation of TLS. If CONFIG_TLS_ALIGNED is not defined, then the new, implementation of TLS using an unaligned stack will be enabled. --- libs/libc/tls/Kconfig | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/libs/libc/tls/Kconfig b/libs/libc/tls/Kconfig index 8cc17fc9a0..55d00508c0 100644 --- a/libs/libc/tls/Kconfig +++ b/libs/libc/tls/Kconfig @@ -21,17 +21,37 @@ config TLS if TLS +config TLS_ALIGNED + bool "Require stack alignment" + default y if BUILD_KERNEL + default n if !BUILD_KERNEL + ---help--- + Aligned TLS works by fetch thread information from the beginning + of the stack memory allocation. In order to do this, the memory + must be aligned in such a way that the executing logic can simply + mask the current stack pointer to get the beginning of the stack + allocation. + + The advantage of using an aligned stack is no OS interface need + be called to get the beginning of the stack. It is simply and + AND operation on the current stack pointer. The disadvantages + are that the alignment (1) causes memory fragmentation which + be a serious problem for memory limited systems, and (2) limits + the maximum size of the stack. Any mask places a limit on the + maximum size of the stack; stack sizes about that would map to + an incorrect address. + + In general, CONFIG_TLS_ALIGNED is preferred for the KERNEL + build where the virtualized stack address an be aligned with + no implications to physical memory. In other builds, the + unaligned stack implementation is usually superior. + config TLS_LOG2_MAXSTACK int "Maximum stack size (log2)" default 13 range 11 24 + depends on TLS_ALIGNED ---help--- - Stack based TLS works by fetch thread information from the beginning - of the stack memory allocation. In order to do this, the memory - must be aligned in such a way that the executing logic can simply - masking the current stack pointer to get the beginning of the stack - allocation. - This setting specifies the alignment of the stack as a power of 2: 11=2KB, 12=4KB, 13=8KB, etc. The exact alignment is not so critical except that (1) a very large value can cause you to run out of