From b5f670f826f71414c56d6f05172531ca0adbf5bd Mon Sep 17 00:00:00 2001 From: bebebib-rs <141373055+bebebib-rs@users.noreply.github.com> Date: Sun, 6 Aug 2023 23:22:52 -0700 Subject: [PATCH] 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. --- include/picolibc-freertos.h | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/include/picolibc-freertos.h b/include/picolibc-freertos.h index 467f7a970..ef6b7570c 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 ) \