Upstream stack masking fix to GCC ports. (#210)

Co-authored-by: Cobus van Eeden <35851496+cobusve@users.noreply.github.com>
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32/port.c b/portable/ThirdParty/GCC/Xtensa_ESP32/port.c
index a87e3cb..d3666a5 100644
--- a/portable/ThirdParty/GCC/Xtensa_ESP32/port.c
+++ b/portable/ThirdParty/GCC/Xtensa_ESP32/port.c
@@ -176,7 +176,7 @@
     #endif

 

     /* Create interrupt stack frame aligned to 16 byte boundary */

-    sp = ( StackType_t * ) ( ( ( UBaseType_t ) ( pxTopOfStack + 1 ) - XT_CP_SIZE - XT_STK_FRMSZ ) & ~0xf );

+    sp = ( StackType_t * ) ( ( ( UBaseType_t ) pxTopOfStack - XT_CP_SIZE - XT_STK_FRMSZ ) & ~0xf );

 

     /* Clear the entire frame (do not use memset() because we don't depend on C library) */

     for( tp = sp; tp <= pxTopOfStack; ++tp )

@@ -229,6 +229,7 @@
          * //p = (uint32_t *) xMPUSettings->coproc_area;

          */

         p = ( uint32_t * ) ( ( ( uint32_t ) pxTopOfStack - XT_CP_SIZE ) & ~0xf );

+        configASSERT( ( uint32_t ) p >= frame->a1 );

         p[ 0 ] = 0;

         p[ 1 ] = 0;

         p[ 2 ] = ( ( ( uint32_t ) p ) + 12 + XCHAL_TOTAL_SA_ALIGN - 1 ) & -XCHAL_TOTAL_SA_ALIGN;

@@ -319,7 +320,9 @@
                                     uint32_t usStackDepth )

     {

         #if XCHAL_CP_NUM > 0

-            xMPUSettings->coproc_area = ( StackType_t * ) ( ( ( ( uint32_t ) ( pxBottomOfStack + usStackDepth - 1 ) ) - XT_CP_SIZE ) & ~0xf );

+            xMPUSettings->coproc_area = ( StackType_t * ) ( ( uint32_t ) ( pxBottomOfStack + usStackDepth - 1 ));

+            xMPUSettings->coproc_area = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) xMPUSettings->coproc_area ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) );

+            xMPUSettings->coproc_area = ( StackType_t * ) ( ( ( uint32_t ) xMPUSettings->coproc_area - XT_CP_SIZE ) & ~0xf );

 

 

             /* NOTE: we cannot initialize the coprocessor save area here because FreeRTOS is going to

diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/port.c b/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/port.c
index f6d10d5..992789a 100644
--- a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/port.c
+++ b/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/port.c
@@ -157,7 +157,7 @@
     #endif

 

     /* Create interrupt stack frame aligned to 16 byte boundary */

-    sp = ( StackType_t * ) ( ( ( UBaseType_t ) ( pxTopOfStack + 1 ) - XT_CP_SIZE - XT_STK_FRMSZ ) & ~0xf );

+    sp = ( StackType_t * ) ( ( ( UBaseType_t ) pxTopOfStack - XT_CP_SIZE - XT_STK_FRMSZ ) & ~0xf );

 

     /* Clear the entire frame (do not use memset() because we don't depend on C library) */

     for( tp = sp; tp <= pxTopOfStack; ++tp )

@@ -196,6 +196,7 @@
          * //p = (uint32_t *) xMPUSettings->coproc_area;

          */

         p = ( uint32_t * ) ( ( ( uint32_t ) pxTopOfStack - XT_CP_SIZE ) & ~0xf );

+        configASSERT( ( uint32_t ) p >= frame->a1 );

         p[ 0 ] = 0;

         p[ 1 ] = 0;

         p[ 2 ] = ( ( ( uint32_t ) p ) + 12 + XCHAL_TOTAL_SA_ALIGN - 1 ) & -XCHAL_TOTAL_SA_ALIGN;

@@ -286,9 +287,11 @@
                                     uint32_t usStackDepth )

     {

         #if XCHAL_CP_NUM > 0

-            xMPUSettings->coproc_area = ( StackType_t * ) ( ( ( ( uint32_t ) ( pxBottomOfStack + usStackDepth - 1 ) ) - XT_CP_SIZE ) & ~0xf );

+            xMPUSettings->coproc_area = ( StackType_t * ) ( ( uint32_t ) ( pxBottomOfStack + usStackDepth - 1 ));

+            xMPUSettings->coproc_area = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) xMPUSettings->coproc_area ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) );

+            xMPUSettings->coproc_area = ( StackType_t * ) ( ( ( uint32_t ) xMPUSettings->coproc_area - XT_CP_SIZE ) & ~0xf );

 

-

+                

             /* NOTE: we cannot initialize the coprocessor save area here because FreeRTOS is going to

              * clear the stack area after we return. This is done in pxPortInitialiseStack().

              */

diff --git a/portable/ThirdParty/XCC/Xtensa/port.c b/portable/ThirdParty/XCC/Xtensa/port.c
index a62a0de..84978e7 100644
--- a/portable/ThirdParty/XCC/Xtensa/port.c
+++ b/portable/ThirdParty/XCC/Xtensa/port.c
@@ -220,7 +220,7 @@
     #if XCHAL_CP_NUM > 0

         xMPUSettings->coproc_area = ( StackType_t * ) ( ( uint32_t ) ( pxBottomOfStack + ulStackDepth - 1 ));

         xMPUSettings->coproc_area = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) xMPUSettings->coproc_area ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) );

-        xMPUSettings->coproc_area = ( Stacktype_t * ) ( ( ( uint32_t ) xMPUSettings->coproc_area - XT_CP_SIZE ) & ~0xf );

+        xMPUSettings->coproc_area = ( StackType_t * ) ( ( ( uint32_t ) xMPUSettings->coproc_area - XT_CP_SIZE ) & ~0xf );

 

         /* NOTE: we cannot initialize the coprocessor save area here because FreeRTOS is going to

          * clear the stack area after we return. This is done in pxPortInitialiseStack().