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