mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-19 21:11:57 -04:00
Fix XCore DP/CP register corruption bug (#352)
The kernel code that runs within RTOS ISRs requires that DP and CP not be changed from their initial values. If a task changes them and is interrupted while they are changed, then they must be restored for the ISR. This commit implements this. This relies on a corresponding change to the xcore lib_rtos_support.
This commit is contained in:
parent
a9754a8fdd
commit
a7092d400c
13
portable/ThirdParty/xClang/XCORE200/portasm.S
vendored
13
portable/ThirdParty/xClang/XCORE200/portasm.S
vendored
|
@ -59,10 +59,13 @@ rtos_interrupt_callback_common:
|
||||||
/* The stack was extended for this by the wrapper function. */
|
/* The stack was extended for this by the wrapper function. */
|
||||||
/* Begin only by saving some registers. The rest will be saved */
|
/* Begin only by saving some registers. The rest will be saved */
|
||||||
/* later if vTaskSwitchContext() needs to be called. */
|
/* later if vTaskSwitchContext() needs to be called. */
|
||||||
|
/* DP and CP need to be saved because these are restored for the kernel ISR. */
|
||||||
/* LR needs to be saved because it is clobbered when calling the callback. */
|
/* LR needs to be saved because it is clobbered when calling the callback. */
|
||||||
/* r0-r3, and r11 need to be saved because the callback may clobber them. */
|
/* r0-r3, and r11 need to be saved because the callback may clobber them. */
|
||||||
/* r4 is saved because it is used here to hold the task SP. */
|
/* r4 is saved because it is used here to hold the task SP. */
|
||||||
|
|
||||||
|
stw dp, sp[5]
|
||||||
|
stw cp, sp[6]
|
||||||
stw lr, sp[7]
|
stw lr, sp[7]
|
||||||
stw r0, sp[8]
|
stw r0, sp[8]
|
||||||
/*stw r1, sp[9] already saved by the wrapper function. */
|
/*stw r1, sp[9] already saved by the wrapper function. */
|
||||||
|
@ -78,7 +81,9 @@ rtos_interrupt_callback_common:
|
||||||
/* that it saves to KSP[0]. We already have it in r4. */
|
/* that it saves to KSP[0]. We already have it in r4. */
|
||||||
|
|
||||||
get r11, ed} /* Get the event data... */
|
get r11, ed} /* Get the event data... */
|
||||||
{mov r0, r11 /* into the first argument for the callback function... */
|
ldw dp, sp[3] /* (Restore CP and DP required for the RTOS ISR */
|
||||||
|
ldw cp, sp[4] /* in case the active thread has modified them.) */
|
||||||
|
{mov r0, r11 /* ...into the first argument for the callback function, */
|
||||||
bla r1} /* and call the callback function. */
|
bla r1} /* and call the callback function. */
|
||||||
|
|
||||||
{set sp, r4 /* Restore the task's SP now. */
|
{set sp, r4 /* Restore the task's SP now. */
|
||||||
|
@ -98,8 +103,6 @@ _yield_continue:
|
||||||
stw ssr, sp[2]
|
stw ssr, sp[2]
|
||||||
stw sed, sp[3]
|
stw sed, sp[3]
|
||||||
stw et, sp[4]
|
stw et, sp[4]
|
||||||
stw dp, sp[5]
|
|
||||||
stw cp, sp[6]
|
|
||||||
stw r5, sp[13]
|
stw r5, sp[13]
|
||||||
stw r6, sp[14]
|
stw r6, sp[14]
|
||||||
stw r7, sp[15]
|
stw r7, sp[15]
|
||||||
|
@ -134,8 +137,6 @@ _freertos_restore_ctx:
|
||||||
ldw ssr, sp[2]
|
ldw ssr, sp[2]
|
||||||
ldw sed, sp[3]
|
ldw sed, sp[3]
|
||||||
ldw et, sp[4]
|
ldw et, sp[4]
|
||||||
ldw dp, sp[5]
|
|
||||||
ldw cp, sp[6]
|
|
||||||
ldw r5, sp[13]
|
ldw r5, sp[13]
|
||||||
ldw r6, sp[14]
|
ldw r6, sp[14]
|
||||||
ldw r7, sp[15]
|
ldw r7, sp[15]
|
||||||
|
@ -143,6 +144,8 @@ _freertos_restore_ctx:
|
||||||
ldw r9, sp[17]
|
ldw r9, sp[17]
|
||||||
ldw r10, sp[18]
|
ldw r10, sp[18]
|
||||||
_freertos_restore_ctx_partial:
|
_freertos_restore_ctx_partial:
|
||||||
|
ldw dp, sp[5]
|
||||||
|
ldw cp, sp[6]
|
||||||
ldw lr, sp[7]
|
ldw lr, sp[7]
|
||||||
ldw r0, sp[8]
|
ldw r0, sp[8]
|
||||||
ldw r1, sp[9]
|
ldw r1, sp[9]
|
||||||
|
|
13
portable/ThirdParty/xClang/XCOREAI/portasm.S
vendored
13
portable/ThirdParty/xClang/XCOREAI/portasm.S
vendored
|
@ -59,10 +59,13 @@ rtos_interrupt_callback_common:
|
||||||
/* The stack was extended for this by the wrapper function. */
|
/* The stack was extended for this by the wrapper function. */
|
||||||
/* Begin only by saving some registers. The rest will be saved */
|
/* Begin only by saving some registers. The rest will be saved */
|
||||||
/* later if vTaskSwitchContext() needs to be called. */
|
/* later if vTaskSwitchContext() needs to be called. */
|
||||||
|
/* DP and CP need to be saved because these are restored for the kernel ISR. */
|
||||||
/* LR needs to be saved because it is clobbered when calling the callback. */
|
/* LR needs to be saved because it is clobbered when calling the callback. */
|
||||||
/* r0-r3, and r11 need to be saved because the callback may clobber them. */
|
/* r0-r3, and r11 need to be saved because the callback may clobber them. */
|
||||||
/* r4 is saved because it is used here to hold the task SP. */
|
/* r4 is saved because it is used here to hold the task SP. */
|
||||||
|
|
||||||
|
stw dp, sp[5]
|
||||||
|
stw cp, sp[6]
|
||||||
stw lr, sp[7]
|
stw lr, sp[7]
|
||||||
stw r0, sp[8]
|
stw r0, sp[8]
|
||||||
/*stw r1, sp[9] already saved by the wrapper function. */
|
/*stw r1, sp[9] already saved by the wrapper function. */
|
||||||
|
@ -78,7 +81,9 @@ rtos_interrupt_callback_common:
|
||||||
/* that it saves to KSP[0]. We already have it in r4. */
|
/* that it saves to KSP[0]. We already have it in r4. */
|
||||||
|
|
||||||
get r11, ed} /* Get the event data... */
|
get r11, ed} /* Get the event data... */
|
||||||
{mov r0, r11 /* into the first argument for the callback function... */
|
ldw dp, sp[3] /* (Restore CP and DP required for the RTOS ISR */
|
||||||
|
ldw cp, sp[4] /* in case the active thread has modified them.) */
|
||||||
|
{mov r0, r11 /* ...into the first argument for the callback function, */
|
||||||
bla r1} /* and call the callback function. */
|
bla r1} /* and call the callback function. */
|
||||||
|
|
||||||
{set sp, r4 /* Restore the task's SP now. */
|
{set sp, r4 /* Restore the task's SP now. */
|
||||||
|
@ -100,8 +105,6 @@ _yield_continue:
|
||||||
stw ssr, sp[2]
|
stw ssr, sp[2]
|
||||||
stw sed, sp[3]
|
stw sed, sp[3]
|
||||||
stw et, sp[4]
|
stw et, sp[4]
|
||||||
stw dp, sp[5]
|
|
||||||
stw cp, sp[6]
|
|
||||||
stw r5, sp[13]
|
stw r5, sp[13]
|
||||||
stw r6, sp[14]
|
stw r6, sp[14]
|
||||||
stw r7, sp[15]
|
stw r7, sp[15]
|
||||||
|
@ -160,8 +163,6 @@ _freertos_restore_ctx:
|
||||||
ldw ssr, sp[2]
|
ldw ssr, sp[2]
|
||||||
ldw sed, sp[3]
|
ldw sed, sp[3]
|
||||||
ldw et, sp[4]
|
ldw et, sp[4]
|
||||||
ldw dp, sp[5]
|
|
||||||
ldw cp, sp[6]
|
|
||||||
ldw r5, sp[13]
|
ldw r5, sp[13]
|
||||||
ldw r6, sp[14]
|
ldw r6, sp[14]
|
||||||
ldw r7, sp[15]
|
ldw r7, sp[15]
|
||||||
|
@ -169,6 +170,8 @@ _freertos_restore_ctx:
|
||||||
ldw r9, sp[17]
|
ldw r9, sp[17]
|
||||||
ldw r10, sp[18]
|
ldw r10, sp[18]
|
||||||
_freertos_restore_ctx_partial:
|
_freertos_restore_ctx_partial:
|
||||||
|
ldw dp, sp[5]
|
||||||
|
ldw cp, sp[6]
|
||||||
ldw lr, sp[7]
|
ldw lr, sp[7]
|
||||||
ldw r0, sp[8]
|
ldw r0, sp[8]
|
||||||
ldw r1, sp[9]
|
ldw r1, sp[9]
|
||||||
|
|
Loading…
Reference in a new issue