@ -26,106 +26,103 @@
*
*
*/
*/
. extern ulTopOfSystemStack
. extern ulTopOfSystemStack
. extern ulInterruptNesting
. extern ulInterruptNesting
/*-----------------------------------------------------------*/
/*-----------------------------------------------------------*/
. macro portFREERTOS_INTERRUPT_ENTRY
. macro portFREERTOS_INTERRUPT_ENTRY
/* Save general purpose registers. */
/* Save general purpose registers. */
pusha
pusha
/* If ulInterruptNesting is zero the rest of the task context will need
/* If ulInterruptNesting is zero the rest of the task context will need
* saving and a stack switch might be required . */
saving and a stack switch might be required . */
movl ulInterruptNesting , % eax
movl ulInterruptNesting , % eax
test % eax , % eax
test % eax , % eax
jne 2f
jne 2f
/* Interrupts are not nested, so save the rest of the task context. */
/* Interrupts are not nested, so save the rest of the task context. */
.
. if configSUPPORT_FPU = = 1
if configSUPPORT_FPU = = 1
/* If the task has a buffer allocated to save the FPU context then
save the FPU context now . */
movl pucPortTaskFPUContextBuffer , % eax
test % eax , % eax
je 1f
fnsave ( % eax ) /* Save FLOP context into ucTempFPUBuffer array. */
fwait
/* If the task has a buffer allocated to save the FPU context then
1 :
* save the FPU context now . */
/* Save the address of the FPU context, if any. */
movl pucPortTaskFPUContextBuffer , % eax
push pucPortTaskFPUContextBuffer
test % eax , % eax
je 1f
fnsave ( % eax ) /* Save FLOP context into ucTempFPUBuffer array. */
fwait
1 :
. endif /* configSUPPORT_FPU */
/* Save the address of the FPU context, if any. */
push pucPortTaskFPUContextBuffer
. endif /* configSUPPORT_FPU */
/* Find the TCB. */
movl pxCurrentTCB , % eax
/* Find the TCB. */
/* Stack location is first item in the TCB. */
movl pxCurrentTCB , % eax
movl % esp , ( % eax )
/* Stack location is first item in the TCB. */
/* Switch stacks. */
movl % esp , ( % eax )
movl ulTopOfSystemStack , % esp
movl % esp , % ebp
/* Switch stacks. */
2 :
movl ulTopOfSystemStack , % esp
/* Increment nesting count. */
movl % esp , % ebp
add $ 1 , ulInterruptNesting
2 :
. endm
/* Increment nesting count. */
add $ 1 , ulInterruptNesting
. endm
/*-----------------------------------------------------------*/
/*-----------------------------------------------------------*/
. macro portINTERRUPT_EPILOGUE
. macro portINTERRUPT_EPILOGUE
cli
sub $ 1 , ulInterruptNesting
/* If the nesting has unwound to zero. */
cli
movl ulInterruptNesting , % eax
sub $ 1 , ulInterruptNesting
test % eax , % eax
jne 2f
/* If a yield was requested then select a new TCB now. */
/* If the nesting has unwound to zero. */
movl ulPortYieldPending , % eax
movl ulInterruptNesting , % eax
test % eax , % eax
test % eax , % eax
je 1f
jne 2f
movl $ 0 , ulPortYieldPending
call vTaskSwitchContext
1 :
/* If a yield was requested then select a new TCB now. */
/* Stack location is first item in the TCB. */
movl ulPortYieldPending , % eax
movl pxCurrentTCB , % eax movl ( % eax ) , % esp
test % eax , % eax
je 1f
movl $ 0 , ulPortYieldPending
call vTaskSwitchContext
.
1 :
/* Stack location is first item in the TCB. */
movl pxCurrentTCB , % eax
movl ( % eax ) , % esp
if configSUPPORT_FPU = = 1
. if configSUPPORT_FPU = = 1
/* Restore address of task's FPU context buffer. */
/* Restore address of task's FPU context buffer. */
pop pucPortTaskFPUContextBuffer
pop pucPortTaskFPUContextBuffer
/* If the task has a buffer allocated in which its FPU context is saved,
/* If the task has a buffer allocated in which its FPU context is saved,
* then restore it now . */
then restore it now . */
movl pucPortTaskFPUContextBuffer , % eax
movl pucPortTaskFPUContextBuffer , % eax
test % eax , % eax
test % eax , % eax
je 1f
je 1f
frstor ( % eax )
frstor ( % eax )
1 :
1 :
. endif
. endif
2 :
2 :
popa
popa
. endm
. endm
/*-----------------------------------------------------------*/
/*-----------------------------------------------------------*/
. macro portFREERTOS_INTERRUPT_EXIT
. macro portFREERTOS_INTERRUPT_EXIT
portINTERRUPT_EPILOGUE
portINTERRUPT_EPILOGUE
/* EOI. */
/* EOI. */
movl $ 0x00 , ( 0xFEE000B0 )
movl $ 0x00 , ( 0xFEE000B0 )
iret
iret
. endm
. endm