Macros to work around lack of Apple support for LDR register, =expr\r
\r
Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\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
.long (_Data) ; \\r
1:\r
\r
+// Reserve a region at the top of the Primary Core stack\r
+// for Global variables for the XIP phase\r
+#define 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
+ 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
+\r
+// Initialize the Global Variable with '0'\r
+#define 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
+ mov GlobalSize, #0x0 ; \\r
+_InitializePrimaryStackLoop: ; \\r
+ cmp Tmp1, sp ; \\r
+ bls _InitializePrimaryStackEnd ; \\r
+ str GlobalSize, [Tmp1], #-4 ; \\r
+ b _InitializePrimaryStackLoop ; \\r
+_InitializePrimaryStackEnd:\r
\r
#elif defined (__GNUC__)\r
\r
ldr r1, =Address ; \\r
ldr r0, =Data ; \\r
str r0, [r1]\r
- \r
+\r
#define MmioOr32(Address, OrData) \\r
ldr r1, =Address ; \\r
ldr r2, =OrData ; \\r
and r0, r0, r2 ; \\r
ldr r2, =OrData ; \\r
orr r0, r0, r2 ; \\r
- str r0, [r1] \r
+ str r0, [r1]\r
\r
#define MmioWriteFromReg32(Address, Reg) \\r
ldr r1, =Address ; \\r
\r
#define LoadConstantToReg(Data, Reg) \\r
ldr Reg, =Data\r
- \r
-#define GetCorePositionInStack(Pos, MpId, Tmp) \\r
- lsr Pos, MpId, #6 ; \\r
- and Tmp, MpId, #3 ; \\r
- add Pos, Pos, Tmp\r
\r
#define 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
+ sub sp, StackTop, GlobalSize ; \\r
+ ; \\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
+\r
+// Initialize the Global Variable with '0'\r
+#define 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
+ mov GlobalSize, #0x0 ; \\r
+_InitializePrimaryStackLoop: ; \\r
+ cmp Tmp1, sp ; \\r
+ bls _InitializePrimaryStackEnd ; \\r
+ str GlobalSize, [Tmp1], #-4 ; \\r
+ b _InitializePrimaryStackLoop ; \\r
+_InitializePrimaryStackEnd:\r
\r
#else\r
\r
//\r
-// Use ARM assembly macros, form armasam \r
+// Use ARM assembly macros, form armasam\r
//\r
// Less magic in the macros if ldr reg, =expr works\r
//\r
\r
// returns Data in R0 and Address in R1, and OrData in r2\r
#define MmioOr32(Address, OrData) MmioOr32Macro Address, OrData\r
- \r
+\r
\r
// returns _Data in R0 and _Address in R1, and _OrData in r2\r
\r
// conditional load testing eq flag\r
#define LoadConstantToRegIfEq(Data, Reg) LoadConstantToRegIfEqMacro Data, Reg\r
\r
-#define GetCorePositionInStack(Pos, MpId, Tmp) GetCorePositionInStack Pos, MpId, Tmp\r
-\r
#define SetPrimaryStack(StackTop,GlobalSize,Tmp) SetPrimaryStack StackTop, GlobalSize, Tmp\r
\r
+// Initialize the Global Variable with '0'\r
+#define InitializePrimaryStack(GlobalSize, Tmp1) InitializePrimaryStack GlobalSize, Tmp1\r
+\r
#endif\r
\r
#endif\r