+++ /dev/null
-#include "xreg405.h"\r
-\r
- .extern pxCurrentTCB\r
- .extern vTaskSwitchContext\r
- .extern vTaskIncrementTick\r
- .extern vPortISRHandler\r
-\r
- .global vPortStartFirstTask\r
- .global vPortYield\r
- .global vPortTickISR\r
- .global vPortISRWrapper\r
-\r
-.set BChainField, 0\r
-.set NextLRField, BChainField + 4\r
-.set MSRField, NextLRField + 4\r
-.set PCField, MSRField + 4\r
-.set LRField, PCField + 4\r
-.set CTRField, LRField + 4\r
-.set XERField, CTRField + 4\r
-.set CRField, XERField + 4\r
-.set USPRG0Field, CRField + 4\r
-.set r0Field, USPRG0Field + 4\r
-.set r2Field, r0Field + 4\r
-.set r3r31Field, r2Field + 4\r
-.set IFrameSize, r3r31Field + ( ( 31 - 3 ) + 1 ) * 4\r
-\r
-\r
-.macro portSAVE_STACK_POINTER_AND_LR\r
-\r
- # Get the address of the TCB. \r
- xor R0, R0, R0\r
- addis R2, R0, pxCurrentTCB@ha\r
- lwz R2, pxCurrentTCB@l( R2 )\r
-\r
- # Store the stack pointer into the TCB\r
- stw SP, 0( R2 )\r
-\r
- # Save the link register\r
- stwu R1, -24( R1 )\r
- mflr R0\r
- stw R31, 20( R1 )\r
- stw R0, 28( R1 )\r
- mr R31, r1\r
-\r
-.endm\r
-\r
-.macro portRESTORE_STACK_POINTER_AND_LR\r
-\r
- # Restore the link register\r
- lwz R11, 0( R1 )\r
- lwz R0, 4( R11 )\r
- mtlr R0\r
- lwz R31, -4( R11 )\r
- mr R1, R11\r
-\r
- # Get the address of the TCB.\r
- xor R0, R0, R0\r
- addis SP, R0, pxCurrentTCB@ha\r
- lwz SP, pxCurrentTCB@l( R1 )\r
-\r
- # Get the task stack pointer from the TCB.\r
- lwz SP, 0( SP )\r
-\r
-.endm\r
-\r
-\r
-vPortStartFirstTask:\r
-\r
- # Get the address of the TCB.\r
- xor R0, R0, R0\r
- addis SP, R0, pxCurrentTCB@ha\r
- lwz SP, pxCurrentTCB@l( SP )\r
-\r
- # Get the task stack pointer from the TCB.\r
- lwz SP, 0( SP )\r
- \r
- # Restore MSR register to SRR1.\r
- lwz R0, MSRField(R1)\r
- mtsrr1 R0\r
- \r
- # Restore current PC location to SRR0.\r
- lwz R0, PCField(R1)\r
- mtsrr0 R0\r
-\r
- # Save USPRG0 register\r
- lwz R0, USPRG0Field(R1)\r
- mtspr 0x100,R0\r
- \r
- # Restore Condition register\r
- lwz R0, CRField(R1)\r
- mtcr R0\r
- \r
- # Restore Fixed Point Exception register\r
- lwz R0, XERField(R1)\r
- mtxer R0\r
- \r
- # Restore Counter register\r
- lwz R0, CTRField(R1)\r
- mtctr R0\r
- \r
- # Restore Link register\r
- lwz R0, LRField(R1)\r
- mtlr R0\r
- \r
- # Restore remaining GPR registers.\r
- lmw R3,r3r31Field(R1)\r
- \r
- # Restore r0 and r2.\r
- lwz R0, r0Field(R1)\r
- lwz R2, r2Field(R1)\r
- \r
- # Remove frame from stack\r
- addi R1,R1,IFrameSize\r
-\r
- # Return into the first task\r
- rfi\r
-\r
-\r
-\r
-vPortYield:\r
-\r
- portSAVE_STACK_POINTER_AND_LR\r
- bl vTaskSwitchContext\r
- portRESTORE_STACK_POINTER_AND_LR\r
- blr\r
-\r
-vPortTickISR:\r
-\r
- portSAVE_STACK_POINTER_AND_LR\r
- bl vTaskIncrementTick\r
- #if configUSE_PREEMPTION == 1\r
- bl vTaskSwitchContext\r
- #endif\r
-\r
- # Clear the interrupt\r
- lis R0, 2048\r
- mttsr R0\r
-\r
- portRESTORE_STACK_POINTER_AND_LR\r
- blr\r
-\r
-vPortISRWrapper:\r
-\r
- portSAVE_STACK_POINTER_AND_LR\r
- bl vPortISRHandler\r
- portRESTORE_STACK_POINTER_AND_LR\r
- blr\r