From b534a8e955d63fa37a22447480b771dfe72bb7af Mon Sep 17 00:00:00 2001 From: Michael Fairman Date: Sun, 1 Oct 2023 12:34:43 -0700 Subject: [PATCH] bugfix: correct computation of stack size on Mac Posix port Aligns the stack end to a page boundary before computing its size, since the size depends on both the start and end. The original change which introduced stack alignment (#674) only worked for cases where the round + trunc operation would wind up within the same area, but would lead to segfaults in other cases. Tested on ARM64 and Intel MacOS, as well as ARM64 and Intel Linux. The test code included a single-task case, as well as a case with two tasks passing queue messages. --- portable/ThirdParty/GCC/Posix/port.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/portable/ThirdParty/GCC/Posix/port.c b/portable/ThirdParty/GCC/Posix/port.c index 8ec8193971b..24dd89f4539 100644 --- a/portable/ThirdParty/GCC/Posix/port.c +++ b/portable/ThirdParty/GCC/Posix/port.c @@ -148,10 +148,14 @@ StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack, */ thread = ( Thread_t * ) ( pxTopOfStack + 1 ) - 1; pxTopOfStack = ( StackType_t * ) thread - 1; + + #ifdef __APPLE__ + pxEndOfStack = ( StackType_t *) mach_vm_round_page( pxEndOfStack ); + #endif + ulStackSize = ( size_t ) ( pxTopOfStack + 1 - pxEndOfStack ) * sizeof( *pxTopOfStack ); #ifdef __APPLE__ - pxEndOfStack = mach_vm_round_page( pxEndOfStack ); ulStackSize = mach_vm_trunc_page( ulStackSize ); #endif