|
43 | 43 |
|
44 | 44 | #define configTLS_BLOCK_TYPE void *
|
45 | 45 |
|
| 46 | +#define picolibcTLS_SIZE ( ( portPOINTER_SIZE_TYPE ) _tls_size() ) |
| 47 | +#define picolibcSTACK_ALIGNMENT_MASK ( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) |
| 48 | + |
| 49 | +#if __PICOLIBC_MAJOR__ > 1 || __PICOLIBC_MINOR__ >= 8 |
| 50 | + |
| 51 | +/* Picolibc 1.8 and newer have explicit alignment values provided |
| 52 | + * by the _tls_align() inline */ |
| 53 | + #define picolibcTLS_ALIGNMENT_MASK ( ( portPOINTER_SIZE_TYPE ) ( _tls_align() - 1 ) ) |
| 54 | +#else |
| 55 | + |
| 56 | +/* For older Picolibc versions, use the general port alignment value */ |
| 57 | + #define picolibcTLS_ALIGNMENT_MASK ( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) |
| 58 | +#endif |
| 59 | + |
46 | 60 | /* Allocate thread local storage block off the end of the
|
47 | 61 | * stack. The _tls_size() function returns the size (in
|
48 | 62 | * bytes) of the total TLS area used by the application */
|
49 | 63 | #if ( portSTACK_GROWTH < 0 )
|
50 |
| - #define configINIT_TLS_BLOCK( xTLSBlock, pxTopOfStack ) \ |
51 |
| - do { \ |
52 |
| - pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) - _tls_size() ); \ |
53 |
| - xTLSBlock = pxTopOfStack; \ |
54 |
| - _init_tls( xTLSBlock ); \ |
| 64 | + |
| 65 | + #define configINIT_TLS_BLOCK( xTLSBlock, pxTopOfStack ) \ |
| 66 | + do { \ |
| 67 | + pxTopOfStack = ( StackType_t * ) ( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) \ |
| 68 | + - picolibcTLS_SIZE ) & ~ \ |
| 69 | + configMAX( picolibcSTACK_ALIGNMENT_MASK, \ |
| 70 | + picolibcTLS_ALIGNMENT_MASK ) ); \ |
| 71 | + xTLSBlock = pxTopOfStack; \ |
| 72 | + _init_tls( xTLSBlock ); \ |
55 | 73 | } while( 0 )
|
56 | 74 | #else /* portSTACK_GROWTH */
|
57 |
| - #define configINIT_TLS_BLOCK( xTLSBlock, pxTopOfStack ) \ |
58 |
| - do { \ |
59 |
| - xTLSBlock = pxTopOfStack; \ |
60 |
| - pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) + _tls_size() ); \ |
61 |
| - _init_tls( xTLSBlock ); \ |
| 75 | + #define configINIT_TLS_BLOCK( xTLSBlock, pxTopOfStack ) \ |
| 76 | + do { \ |
| 77 | + xTLSBlock = ( void * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack + \ |
| 78 | + picolibcTLS_ALIGNMENT_MASK ) & ~picolibcTLS_ALIGNMENT_MASK ); \ |
| 79 | + pxTopOfStack = ( StackType_t * ) ( ( ( ( ( portPOINTER_SIZE_TYPE ) xTLSBlock ) + \ |
| 80 | + picolibcTLS_SIZE ) + picolibcSTACK_ALIGNMENT_MASK ) & \ |
| 81 | + ~picolibcSTACK_ALIGNMENT_MASK ); \ |
| 82 | + _init_tls( xTLSBlock ); \ |
62 | 83 | } while( 0 )
|
63 | 84 | #endif /* portSTACK_GROWTH */
|
64 | 85 |
|
|
0 commit comments