|
53 | 53 | #define portSTACK_LIMIT_PADDING 0
|
54 | 54 | #endif
|
55 | 55 |
|
56 |
| -#if ( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH < 0 ) ) |
| 56 | +/* Stack overflow check is not straight forward to implement for MPU ports |
| 57 | + * because of the following reasons: |
| 58 | + * 1. The context is stored in TCB and as a result, pxTopOfStack member points |
| 59 | + * to the context location in TCB. |
| 60 | + * 2. System calls are executed on a separate privileged only stack. |
| 61 | + * |
| 62 | + * It is still okay because an MPU region is used to protect task stack which |
| 63 | + * means task stack overflow will trigger an MPU fault for unprivileged tasks. |
| 64 | + * Additionally, architectures with hardware stack overflow checking support |
| 65 | + * (such as Armv8-M) will trigger a fault when a task's stack overflows. |
| 66 | + */ |
| 67 | +#if ( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH < 0 ) && ( portUSING_MPU_WRAPPERS != 1 ) ) |
57 | 68 |
|
58 | 69 | /* Only the current stack state is to be checked. */
|
59 | 70 | #define taskCHECK_FOR_STACK_OVERFLOW() \
|
60 | 71 | do \
|
61 | 72 | { \
|
62 |
| - StackType_t * pxCurrentTopOfStack; \ |
63 |
| - portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ); \ |
64 |
| - \ |
65 | 73 | /* Is the currently saved stack pointer within the stack limit? */ \
|
66 |
| - if( pxCurrentTopOfStack <= pxCurrentTCB->pxStack + portSTACK_LIMIT_PADDING ) \ |
| 74 | + if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack + portSTACK_LIMIT_PADDING ) \ |
67 | 75 | { \
|
68 | 76 | char * pcOverflowTaskName = pxCurrentTCB->pcTaskName; \
|
69 | 77 | vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pcOverflowTaskName ); \
|
|
73 | 81 | #endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */
|
74 | 82 | /*-----------------------------------------------------------*/
|
75 | 83 |
|
76 |
| -#if ( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH > 0 ) ) |
| 84 | +#if ( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH > 0 ) && ( portUSING_MPU_WRAPPERS != 1 ) ) |
77 | 85 |
|
78 | 86 | /* Only the current stack state is to be checked. */
|
79 |
| - #define taskCHECK_FOR_STACK_OVERFLOW() \ |
80 |
| - do \ |
81 |
| - { \ |
82 |
| - StackType_t * pxCurrentTopOfStack; \ |
83 |
| - portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ); \ |
84 |
| - \ |
85 |
| - /* Is the currently saved stack pointer within the stack limit? */ \ |
86 |
| - if( pxCurrentTopOfStack >= pxCurrentTCB->pxEndOfStack - portSTACK_LIMIT_PADDING ) \ |
87 |
| - { \ |
88 |
| - char * pcOverflowTaskName = pxCurrentTCB->pcTaskName; \ |
89 |
| - vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pcOverflowTaskName ); \ |
90 |
| - } \ |
| 87 | + #define taskCHECK_FOR_STACK_OVERFLOW() \ |
| 88 | + do \ |
| 89 | + { \ |
| 90 | + /* Is the currently saved stack pointer within the stack limit? */ \ |
| 91 | + if( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack - portSTACK_LIMIT_PADDING ) \ |
| 92 | + { \ |
| 93 | + char * pcOverflowTaskName = pxCurrentTCB->pcTaskName; \ |
| 94 | + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pcOverflowTaskName ); \ |
| 95 | + } \ |
91 | 96 | } while( 0 )
|
92 | 97 |
|
93 | 98 | #endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */
|
94 | 99 | /*-----------------------------------------------------------*/
|
95 | 100 |
|
96 |
| -#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) ) |
97 |
| - |
98 |
| - #define taskCHECK_FOR_STACK_OVERFLOW() \ |
99 |
| - do \ |
100 |
| - { \ |
101 |
| - const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack; \ |
102 |
| - const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5U; \ |
103 |
| - StackType_t * pxCurrentTopOfStack; \ |
104 |
| - portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ); \ |
105 |
| - \ |
106 |
| - if( ( pxCurrentTopOfStack <= pxCurrentTCB->pxStack + portSTACK_LIMIT_PADDING ) || \ |
107 |
| - ( pulStack[ 0 ] != ulCheckValue ) || \ |
108 |
| - ( pulStack[ 1 ] != ulCheckValue ) || \ |
109 |
| - ( pulStack[ 2 ] != ulCheckValue ) || \ |
110 |
| - ( pulStack[ 3 ] != ulCheckValue ) ) \ |
111 |
| - { \ |
112 |
| - char * pcOverflowTaskName = pxCurrentTCB->pcTaskName; \ |
113 |
| - vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pcOverflowTaskName ); \ |
114 |
| - } \ |
| 101 | +#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) && ( portUSING_MPU_WRAPPERS != 1 ) ) |
| 102 | + |
| 103 | + #define taskCHECK_FOR_STACK_OVERFLOW() \ |
| 104 | + do \ |
| 105 | + { \ |
| 106 | + const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack; \ |
| 107 | + const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5U; \ |
| 108 | + \ |
| 109 | + if( ( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack + portSTACK_LIMIT_PADDING ) || \ |
| 110 | + ( pulStack[ 0 ] != ulCheckValue ) || \ |
| 111 | + ( pulStack[ 1 ] != ulCheckValue ) || \ |
| 112 | + ( pulStack[ 2 ] != ulCheckValue ) || \ |
| 113 | + ( pulStack[ 3 ] != ulCheckValue ) ) \ |
| 114 | + { \ |
| 115 | + char * pcOverflowTaskName = pxCurrentTCB->pcTaskName; \ |
| 116 | + vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pcOverflowTaskName ); \ |
| 117 | + } \ |
115 | 118 | } while( 0 )
|
116 | 119 |
|
117 | 120 | #endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */
|
118 | 121 | /*-----------------------------------------------------------*/
|
119 | 122 |
|
120 |
| -#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) ) |
| 123 | +#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) && ( portUSING_MPU_WRAPPERS != 1 ) ) |
121 | 124 |
|
122 | 125 | #define taskCHECK_FOR_STACK_OVERFLOW() \
|
123 | 126 | do \
|
|
128 | 131 | tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \
|
129 | 132 | tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \
|
130 | 133 | tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \
|
131 |
| - StackType_t * pxCurrentTopOfStack; \ |
132 |
| - portGET_CURRENT_TOP_OF_STACK( pxCurrentTopOfStack ); \ |
133 | 134 | \
|
134 | 135 | pcEndOfStack -= sizeof( ucExpectedStackBytes ); \
|
135 | 136 | \
|
136 |
| - if( ( pxCurrentTopOfStack >= pxCurrentTCB->pxEndOfStack - portSTACK_LIMIT_PADDING ) || \ |
| 137 | + if( ( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack - portSTACK_LIMIT_PADDING ) || \ |
137 | 138 | ( memcmp( ( void * ) pcEndOfStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) ) \
|
138 | 139 | { \
|
139 | 140 | char * pcOverflowTaskName = pxCurrentTCB->pcTaskName; \
|
|
0 commit comments