; Macros to work around lack of Apple support for LDR register, =expr\r
;\r
; Copyright (c) 2009, Apple Inc. All rights reserved.<BR>\r
-; This program and the accompanying materials \r
-; are licensed and made available under the terms and conditions of the BSD License \r
-; which accompanies this distribution. The full text of the license may be found at \r
-; http://opensource.org/licenses/bsd-license.php \r
-; \r
-; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
+; Copyright (c) 2011-2012, ARM Ltd. All rights reserved.<BR>\r
+;\r
+; This program and the accompanying materials\r
+; are licensed and made available under the terms and conditions of the BSD License\r
+; which accompanies this distribution. The full text of the license may be found at\r
+; http://opensource.org/licenses/bsd-license.php\r
+;\r
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
;\r
;**/\r
\r
\r
- MACRO \r
- MmioWrite32Macro $Address, $Data \r
- ldr r1, = ($Address) \r
- ldr r0, = ($Data) \r
- str r0, [r1] \r
+ MACRO\r
+ MmioWrite32Macro $Address, $Data\r
+ ldr r1, = ($Address)\r
+ ldr r0, = ($Data)\r
+ str r0, [r1]\r
+ MEND\r
+\r
+ MACRO\r
+ MmioOr32Macro $Address, $OrData\r
+ ldr r1, =($Address)\r
+ ldr r2, =($OrData)\r
+ ldr r0, [r1]\r
+ orr r0, r0, r2\r
+ str r0, [r1]\r
+ MEND\r
+\r
+ MACRO\r
+ MmioAnd32Macro $Address, $AndData\r
+ ldr r1, =($Address)\r
+ ldr r2, =($AndData)\r
+ ldr r0, [r1]\r
+ and r0, r0, r2\r
+ str r0, [r1]\r
MEND\r
- \r
- MACRO \r
- MmioOr32Macro $Address, $OrData \r
- ldr r1, =($Address) \r
- ldr r2, =($OrData) \r
- ldr r0, [r1] \r
- orr r0, r0, r2 \r
- str r0, [r1] \r
+\r
+ MACRO\r
+ MmioAndThenOr32Macro $Address, $AndData, $OrData\r
+ ldr r1, =($Address)\r
+ ldr r0, [r1]\r
+ ldr r2, =($AndData)\r
+ and r0, r0, r2\r
+ ldr r2, =($OrData)\r
+ orr r0, r0, r2\r
+ str r0, [r1]\r
MEND\r
\r
- MACRO \r
- MmioAnd32Macro $Address, $AndData \r
- ldr r1, =($Address) \r
- ldr r2, =($AndData) \r
- ldr r0, [r1] \r
- and r0, r0, r2 \r
- str r0, [r1] \r
+ MACRO\r
+ MmioWriteFromReg32Macro $Address, $Reg\r
+ ldr r1, =($Address)\r
+ str $Reg, [r1]\r
MEND\r
\r
- MACRO \r
- MmioAndThenOr32Macro $Address, $AndData, $OrData \r
- ldr r1, =($Address) \r
- ldr r0, [r1] \r
- ldr r2, =($AndData) \r
- and r0, r0, r2 \r
- ldr r2, =($OrData) \r
- orr r0, r0, r2 \r
- str r0, [r1] \r
+ MACRO\r
+ MmioRead32Macro $Address\r
+ ldr r1, =($Address)\r
+ ldr r0, [r1]\r
MEND\r
\r
- MACRO \r
- MmioWriteFromReg32Macro $Address, $Reg \r
- ldr r1, =($Address) \r
- str $Reg, [r1] \r
+ MACRO\r
+ MmioReadToReg32Macro $Address, $Reg\r
+ ldr r1, =($Address)\r
+ ldr $Reg, [r1]\r
MEND\r
\r
- MACRO \r
- MmioRead32Macro $Address \r
- ldr r1, =($Address) \r
- ldr r0, [r1] \r
+ MACRO\r
+ LoadConstantMacro $Data\r
+ ldr r0, =($Data)\r
MEND\r
\r
- MACRO \r
- MmioReadToReg32Macro $Address, $Reg \r
- ldr r1, =($Address) \r
- ldr $Reg, [r1] \r
+ MACRO\r
+ LoadConstantToRegMacro $Data, $Reg\r
+ ldr $Reg, =($Data)\r
MEND\r
\r
- MACRO \r
- LoadConstantMacro $Data \r
- ldr r0, =($Data) \r
+ ; The reserved place must be 8-bytes aligned for pushing 64-bit variable on the stack\r
+ ; Note: Global Size will be modified\r
+ MACRO\r
+ SetPrimaryStack $StackTop, $GlobalSize, $Tmp\r
+ and $Tmp, $GlobalSize, #7\r
+ rsbne $Tmp, $Tmp, #8\r
+ add $GlobalSize, $GlobalSize, $Tmp\r
+ sub sp, $StackTop, $GlobalSize\r
+\r
+ ; Set all the global variables to 0\r
+ mov $Tmp, sp\r
+ mov $GlobalSize, #0x0\r
+_SetPrimaryStackInitGlobals\r
+ cmp $Tmp, $StackTop\r
+ beq _SetPrimaryStackEnd\r
+ str $GlobalSize, [$Tmp], #4\r
+ b _SetPrimaryStackInitGlobals\r
+_SetPrimaryStackEnd\r
MEND\r
\r
- MACRO \r
- LoadConstantToRegMacro $Data, $Reg \r
- ldr $Reg, =($Data) \r
- MEND \r
+ MACRO\r
+ InitializePrimaryStack $GlobalSize, $Tmp1\r
+ and $Tmp1, $GlobalSize, #7\r
+ rsbne $Tmp1, $Tmp1, #8\r
+ add $GlobalSize, $GlobalSize, $Tmp1\r
+\r
+ mov $Tmp1, sp\r
+ sub sp, $GlobalSize\r
+ ; Set all the global variables to 0\r
+ mov $GlobalSize, #0x0\r
+_InitializePrimaryStackLoop\r
+ cmp $Tmp1, sp\r
+ bls _InitializePrimaryStackEnd\r
+ str $GlobalSize, [$Tmp1, #-4]!\r
+ b _InitializePrimaryStackLoop\r
+_InitializePrimaryStackEnd\r
+ MEND\r
\r
END\r