mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-19 21:11:57 -04:00
Implement MicroBlazeV9 stack protection (#523)
* Implement stack protection for MicroBlaze (without MPU wrappers)
This commit is contained in:
parent
bfe057367d
commit
63f86fc7a2
|
@ -105,7 +105,11 @@ static XIntc xInterruptControllerInstance;
|
||||||
*
|
*
|
||||||
* See the portable.h header file.
|
* See the portable.h header file.
|
||||||
*/
|
*/
|
||||||
|
#if ( portHAS_STACK_OVERFLOW_CHECKING == 1 )
|
||||||
|
StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, StackType_t *pxEndOfStack, TaskFunction_t pxCode, void *pvParameters )
|
||||||
|
#else
|
||||||
StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
|
StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
extern void *_SDA2_BASE_, *_SDA_BASE_;
|
extern void *_SDA2_BASE_, *_SDA_BASE_;
|
||||||
const uint32_t ulR2 = ( uint32_t ) &_SDA2_BASE_;
|
const uint32_t ulR2 = ( uint32_t ) &_SDA2_BASE_;
|
||||||
|
@ -122,6 +126,14 @@ extern void _start1( void );
|
||||||
*pxTopOfStack = ( StackType_t ) 0x00000000;
|
*pxTopOfStack = ( StackType_t ) 0x00000000;
|
||||||
pxTopOfStack--;
|
pxTopOfStack--;
|
||||||
|
|
||||||
|
#if ( portHAS_STACK_OVERFLOW_CHECKING == 1 )
|
||||||
|
/* Store the stack limits. */
|
||||||
|
*pxTopOfStack = (StackType_t) (pxTopOfStack + 3);
|
||||||
|
pxTopOfStack--;
|
||||||
|
*pxTopOfStack = (StackType_t) pxEndOfStack;
|
||||||
|
pxTopOfStack--;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if( XPAR_MICROBLAZE_USE_FPU != 0 )
|
#if( XPAR_MICROBLAZE_USE_FPU != 0 )
|
||||||
/* The FSR value placed in the initial task context is just 0. */
|
/* The FSR value placed in the initial task context is just 0. */
|
||||||
*pxTopOfStack = portINITIAL_FSR;
|
*pxTopOfStack = portINITIAL_FSR;
|
||||||
|
|
|
@ -33,16 +33,6 @@
|
||||||
#include "microblaze_exceptions_g.h"
|
#include "microblaze_exceptions_g.h"
|
||||||
#include "xparameters.h"
|
#include "xparameters.h"
|
||||||
|
|
||||||
/* The context is oversized to allow functions called from the ISR to write
|
|
||||||
back into the caller stack. */
|
|
||||||
#if( XPAR_MICROBLAZE_USE_FPU != 0 )
|
|
||||||
#define portCONTEXT_SIZE 136
|
|
||||||
#define portMINUS_CONTEXT_SIZE -136
|
|
||||||
#else
|
|
||||||
#define portCONTEXT_SIZE 132
|
|
||||||
#define portMINUS_CONTEXT_SIZE -132
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Offsets from the stack pointer at which saved registers are placed. */
|
/* Offsets from the stack pointer at which saved registers are placed. */
|
||||||
#define portR31_OFFSET 4
|
#define portR31_OFFSET 4
|
||||||
#define portR30_OFFSET 8
|
#define portR30_OFFSET 8
|
||||||
|
@ -76,7 +66,31 @@ back into the caller stack. */
|
||||||
#define portR2_OFFSET 120
|
#define portR2_OFFSET 120
|
||||||
#define portCRITICAL_NESTING_OFFSET 124
|
#define portCRITICAL_NESTING_OFFSET 124
|
||||||
#define portMSR_OFFSET 128
|
#define portMSR_OFFSET 128
|
||||||
#define portFSR_OFFSET 132
|
|
||||||
|
#if( XPAR_MICROBLAZE_USE_FPU != 0 )
|
||||||
|
#define portFSR_OFFSET 132
|
||||||
|
#if( XPAR_MICROBLAZE_USE_STACK_PROTECTION )
|
||||||
|
#define portSLR_OFFSET 136
|
||||||
|
#define portSHR_OFFSET 140
|
||||||
|
|
||||||
|
#define portCONTEXT_SIZE 144
|
||||||
|
#define portMINUS_CONTEXT_SIZE -144
|
||||||
|
#else
|
||||||
|
#define portCONTEXT_SIZE 136
|
||||||
|
#define portMINUS_CONTEXT_SIZE -136
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#if( XPAR_MICROBLAZE_USE_STACK_PROTECTION )
|
||||||
|
#define portSLR_OFFSET 132
|
||||||
|
#define portSHR_OFFSET 136
|
||||||
|
|
||||||
|
#define portCONTEXT_SIZE 140
|
||||||
|
#define portMINUS_CONTEXT_SIZE -140
|
||||||
|
#else
|
||||||
|
#define portCONTEXT_SIZE 132
|
||||||
|
#define portMINUS_CONTEXT_SIZE -132
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
.extern pxCurrentTCB
|
.extern pxCurrentTCB
|
||||||
.extern XIntc_DeviceInterruptHandler
|
.extern XIntc_DeviceInterruptHandler
|
||||||
|
@ -144,6 +158,14 @@ back into the caller stack. */
|
||||||
swi r18, r1, portFSR_OFFSET
|
swi r18, r1, portFSR_OFFSET
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if( XPAR_MICROBLAZE_USE_STACK_PROTECTION )
|
||||||
|
/* Save the stack limits */
|
||||||
|
mfs r18, rslr
|
||||||
|
swi r18, r1, portSLR_OFFSET
|
||||||
|
mfs r18, rshr
|
||||||
|
swi r18, r1, portSHR_OFFSET
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Save the top of stack value to the TCB. */
|
/* Save the top of stack value to the TCB. */
|
||||||
lwi r3, r0, pxCurrentTCB
|
lwi r3, r0, pxCurrentTCB
|
||||||
sw r1, r0, r3
|
sw r1, r0, r3
|
||||||
|
@ -156,6 +178,17 @@ back into the caller stack. */
|
||||||
lwi r18, r0, pxCurrentTCB
|
lwi r18, r0, pxCurrentTCB
|
||||||
lw r1, r0, r18
|
lw r1, r0, r18
|
||||||
|
|
||||||
|
#if( XPAR_MICROBLAZE_USE_STACK_PROTECTION )
|
||||||
|
/* Restore the stack limits -- must not load from r1 (Stack Pointer)
|
||||||
|
because if the address of load or store instruction is out of range,
|
||||||
|
it will trigger Stack Protection Violation exception. */
|
||||||
|
or r18, r0, r1
|
||||||
|
lwi r12, r18, portSLR_OFFSET
|
||||||
|
mts rslr, r12
|
||||||
|
lwi r12, r18, portSHR_OFFSET
|
||||||
|
mts rshr, r12
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Restore the general registers. */
|
/* Restore the general registers. */
|
||||||
lwi r31, r1, portR31_OFFSET
|
lwi r31, r1, portR31_OFFSET
|
||||||
lwi r30, r1, portR30_OFFSET
|
lwi r30, r1, portR30_OFFSET
|
||||||
|
@ -252,6 +285,13 @@ _interrupt_handler:
|
||||||
/* Switch to the ISR stack. */
|
/* Switch to the ISR stack. */
|
||||||
lwi r1, r0, pulISRStack
|
lwi r1, r0, pulISRStack
|
||||||
|
|
||||||
|
#if( XPAR_MICROBLAZE_USE_STACK_PROTECTION )
|
||||||
|
ori r18, r0, _stack_end
|
||||||
|
mts rslr, r18
|
||||||
|
ori r18, r0, _stack
|
||||||
|
mts rshr, r18
|
||||||
|
#endif
|
||||||
|
|
||||||
/* The parameter to the interrupt handler. */
|
/* The parameter to the interrupt handler. */
|
||||||
ori r5, r0, configINTERRUPT_CONTROLLER_TO_USE
|
ori r5, r0, configINTERRUPT_CONTROLLER_TO_USE
|
||||||
|
|
||||||
|
@ -296,6 +336,13 @@ VPortYieldASM:
|
||||||
/* Switch to use the ISR stack. */
|
/* Switch to use the ISR stack. */
|
||||||
lwi r1, r0, pulISRStack
|
lwi r1, r0, pulISRStack
|
||||||
|
|
||||||
|
#if( XPAR_MICROBLAZE_USE_STACK_PROTECTION )
|
||||||
|
ori r18, r0, _stack_end
|
||||||
|
mts rslr, r18
|
||||||
|
ori r18, r0, _stack
|
||||||
|
mts rshr, r18
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Select the next task to execute. */
|
/* Select the next task to execute. */
|
||||||
bralid r15, vTaskSwitchContext
|
bralid r15, vTaskSwitchContext
|
||||||
or r0, r0, r0
|
or r0, r0, r0
|
||||||
|
|
|
@ -152,6 +152,11 @@ extern volatile uint32_t ulTaskSwitchRequested;
|
||||||
#define portNOP() asm volatile ( "NOP" )
|
#define portNOP() asm volatile ( "NOP" )
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if( XPAR_MICROBLAZE_USE_STACK_PROTECTION )
|
||||||
|
#define portHAS_STACK_OVERFLOW_CHECKING 1
|
||||||
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
/* Task function macros as described on the FreeRTOS.org WEB site. */
|
/* Task function macros as described on the FreeRTOS.org WEB site. */
|
||||||
#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
|
#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters )
|
||||||
#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )
|
#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters )
|
||||||
|
|
Loading…
Reference in a new issue