Fix pxTopOfStack calculation in configINIT_TLS_BLOCK for picolib (#739)
The pxTopOfStack calculation in configINIT_TLS_BLOCK for picolib needs
to decrement pxTopOfStack in order to meet the expectation of
pxPortInitialiseStack function.
diff --git a/include/picolibc-freertos.h b/include/picolibc-freertos.h
index 467f7a9..ef6b757 100644
--- a/include/picolibc-freertos.h
+++ b/include/picolibc-freertos.h
@@ -58,18 +58,19 @@
#endif
/* Allocate thread local storage block off the end of the
-* stack. The _tls_size() function returns the size (in
-* bytes) of the total TLS area used by the application */
+ * stack. The picolibcTLS_SIZE macro returns the size (in
+ * bytes) of the total TLS area used by the application.
+ * Calculate the top of stack address. */
#if ( portSTACK_GROWTH < 0 )
- #define configINIT_TLS_BLOCK( xTLSBlock, pxTopOfStack ) \
- do { \
- pxTopOfStack = ( StackType_t * ) ( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) \
- - picolibcTLS_SIZE ) & ~ \
- configMAX( picolibcSTACK_ALIGNMENT_MASK, \
- picolibcTLS_ALIGNMENT_MASK ) ); \
- xTLSBlock = pxTopOfStack; \
- _init_tls( xTLSBlock ); \
+ #define configINIT_TLS_BLOCK( xTLSBlock, pxTopOfStack ) \
+ do { \
+ xTLSBlock = ( void * ) ( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) - \
+ picolibcTLS_SIZE ) & \
+ ~picolibcTLS_ALIGNMENT_MASK ); \
+ pxTopOfStack = ( StackType_t * ) ( ( ( ( portPOINTER_SIZE_TYPE ) xTLSBlock ) - 1 ) & \
+ ~picolibcSTACK_ALIGNMENT_MASK ); \
+ _init_tls( xTLSBlock ); \
} while( 0 )
#else /* portSTACK_GROWTH */
#define configINIT_TLS_BLOCK( xTLSBlock, pxTopOfStack ) \