summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>2008-03-07 16:29:15 +0000
committerrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>2008-03-07 16:29:15 +0000
commit500569fcfb6c5b7123666e516982b14925cddd75 (patch)
tree869c0090df921a98f3a21430026995064c7fd1ba
parent2a3c76b13091abe3c19ad4fe04de2e08caf7176d (diff)
downloadfreertos-500569fcfb6c5b7123666e516982b14925cddd75.tar.gz
freertos-500569fcfb6c5b7123666e516982b14925cddd75.tar.bz2
freertos-500569fcfb6c5b7123666e516982b14925cddd75.tar.xz
Get preeprocessor working correctly.
git-svn-id: https://freertos.svn.sourceforge.net/svnroot/freertos/trunk@248 1d2547de-c912-0410-9cb9-b8ca96c0e9e2
-rw-r--r--Source/portable/GCC/PPC405_Xilinx/portasm.S148
1 files changed, 148 insertions, 0 deletions
diff --git a/Source/portable/GCC/PPC405_Xilinx/portasm.S b/Source/portable/GCC/PPC405_Xilinx/portasm.S
new file mode 100644
index 00000000..72923138
--- /dev/null
+++ b/Source/portable/GCC/PPC405_Xilinx/portasm.S
@@ -0,0 +1,148 @@
+#include "FreeRTOSConfig.h"
+
+ .extern pxCurrentTCB
+ .extern vTaskSwitchContext
+ .extern vTaskIncrementTick
+ .extern vPortISRHandler
+
+ .global vPortStartFirstTask
+ .global vPortYield
+ .global vPortTickISR
+ .global vPortISRWrapper
+
+.set BChainField, 0
+.set NextLRField, BChainField + 4
+.set MSRField, NextLRField + 4
+.set PCField, MSRField + 4
+.set LRField, PCField + 4
+.set CTRField, LRField + 4
+.set XERField, CTRField + 4
+.set CRField, XERField + 4
+.set USPRG0Field, CRField + 4
+.set r0Field, USPRG0Field + 4
+.set r2Field, r0Field + 4
+.set r3r31Field, r2Field + 4
+.set IFrameSize, r3r31Field + ( ( 31 - 3 ) + 1 ) * 4
+
+
+.macro portSAVE_STACK_POINTER_AND_LR
+
+ /* Get the address of the TCB. */
+ xor R0, R0, R0
+ addis R2, R0, pxCurrentTCB@ha
+ lwz R2, pxCurrentTCB@l( R2 )
+
+ /* Store the stack pointer into the TCB */
+ stw SP, 0( R2 )
+
+ /* Save the link register */
+ stwu R1, -24( R1 )
+ mflr R0
+ stw R31, 20( R1 )
+ stw R0, 28( R1 )
+ mr R31, r1
+
+.endm
+
+.macro portRESTORE_STACK_POINTER_AND_LR
+
+ /* Restore the link register */
+ lwz R11, 0( R1 )
+ lwz R0, 4( R11 )
+ mtlr R0
+ lwz R31, -4( R11 )
+ mr R1, R11
+
+ /* Get the address of the TCB. */
+ xor R0, R0, R0
+ addis SP, R0, pxCurrentTCB@ha
+ lwz SP, pxCurrentTCB@l( R1 )
+
+ /* Get the task stack pointer from the TCB. */
+ lwz SP, 0( SP )
+
+.endm
+
+
+vPortStartFirstTask:
+
+ /* Get the address of the TCB. */
+ xor R0, R0, R0
+ addis SP, R0, pxCurrentTCB@ha
+ lwz SP, pxCurrentTCB@l( SP )
+
+ /* Get the task stack pointer from the TCB. */
+ lwz SP, 0( SP )
+
+ /* Restore MSR register to SRR1. */
+ lwz R0, MSRField(R1)
+ mtsrr1 R0
+
+ /* Restore current PC location to SRR0. */
+ lwz R0, PCField(R1)
+ mtsrr0 R0
+
+ /* Save USPRG0 register */
+ lwz R0, USPRG0Field(R1)
+ mtspr 0x100,R0
+
+ /* Restore Condition register */
+ lwz R0, CRField(R1)
+ mtcr R0
+
+ /* Restore Fixed Point Exception register */
+ lwz R0, XERField(R1)
+ mtxer R0
+
+ /* Restore Counter register */
+ lwz R0, CTRField(R1)
+ mtctr R0
+
+ /* Restore Link register */
+ lwz R0, LRField(R1)
+ mtlr R0
+
+ /* Restore remaining GPR registers. */
+ lmw R3,r3r31Field(R1)
+
+ /* Restore r0 and r2. */
+ lwz R0, r0Field(R1)
+ lwz R2, r2Field(R1)
+
+ /* Remove frame from stack */
+ addi R1,R1,IFrameSize
+
+ /* Return into the first task */
+ rfi
+
+
+
+vPortYield:
+
+ portSAVE_STACK_POINTER_AND_LR
+ bl vTaskSwitchContext
+ portRESTORE_STACK_POINTER_AND_LR
+ blr
+
+vPortTickISR:
+
+ portSAVE_STACK_POINTER_AND_LR
+ bl vTaskIncrementTick
+
+ #if configUSE_PREEMPTION == 1
+ bl vTaskSwitchContext
+ #endif
+
+ /* Clear the interrupt */
+ lis R0, 2048
+ mttsr R0
+
+ portRESTORE_STACK_POINTER_AND_LR
+ blr
+
+vPortISRWrapper:
+
+ portSAVE_STACK_POINTER_AND_LR
+ bl vPortISRHandler
+ portRESTORE_STACK_POINTER_AND_LR
+ blr