Skip to content

Commit 050cf0d

Browse files
authored
Introduce portMEMORY_BARRIER for Microblaze port. (#621)
The introduction of `portMEMORY_BARRIER` will ensure the places in the kernel use a barrier will work. For example, `xTaskResumeAll` has a memory barrier to ensure its correctness when compiled with optimization enabled. Without the barrier `xTaskResumeAll` can fail (e.g. start reading and writing to address 0 and/or infinite looping) when `xPendingReadyList` contains more than one task to restore. In `xTaskResumeAll` the compiler chooses to cache the `pxTCB` the first time through the loop for use in every subsequent loop. This is incorrect as the removal of `pxTCB->xEventListItem` will actually change the value of `pxTCB` if it was read again at the top of the loop. The barrier forces the compiler to read `pxTCB` again at the top of the loop. The compiler is operating correctly. The removal `pxTCB->xEventListItem` executes on a `List_t *` and `ListItem_t *`. This means that the compiler can assume that any `MiniListItem_t` values are unchanged by the loop (i.e. "strict-aliasing"). This allows the compiler to cache `pxTCB` as it is obtained via a `MiniListItem_t`. This is incorrect in this case because it is possible for a `ListItem_t *` to actually alias a `MiniListItem_t`. This is technically a "violation of aliasing rules" so we use the the barrier to disable the strict-aliasing optimization in this loop.
1 parent 91c20f5 commit 050cf0d

File tree

3 files changed

+3
-0
lines changed

3 files changed

+3
-0
lines changed

portable/GCC/MicroBlaze/portmacro.h

+1
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ void vTaskSwitchContext();
115115
#define portSTACK_GROWTH ( -1 )
116116
#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
117117
#define portNOP() asm volatile ( "NOP" )
118+
#define portMEMORY_BARRIER() asm volatile ( "" ::: "memory" )
118119
/*-----------------------------------------------------------*/
119120

120121
/* Task function macros as described on the FreeRTOS.org WEB site. */

portable/GCC/MicroBlazeV8/portmacro.h

+1
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ extern volatile uint32_t ulTaskSwitchRequested;
152152
#define portSTACK_GROWTH ( -1 )
153153
#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
154154
#define portNOP() asm volatile ( "NOP" )
155+
#define portMEMORY_BARRIER() asm volatile ( "" ::: "memory" )
155156
/*-----------------------------------------------------------*/
156157

157158
/* Task function macros as described on the FreeRTOS.org WEB site. */

portable/GCC/MicroBlazeV9/portmacro.h

+1
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ extern volatile uint32_t ulTaskSwitchRequested;
152152
#define portSTACK_GROWTH ( -1 )
153153
#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
154154
#define portNOP() asm volatile ( "NOP" )
155+
#define portMEMORY_BARRIER() asm volatile ( "" ::: "memory" )
155156
/*-----------------------------------------------------------*/
156157

157158
#if( XPAR_MICROBLAZE_USE_STACK_PROTECTION )

0 commit comments

Comments
 (0)