]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPkg/Include/AsmMacroIoLib.h
ArmPkg/ArmGic: Introduced helper functions to access the GIC controller
[mirror_edk2.git] / ArmPkg / Include / AsmMacroIoLib.h
index 1ea2c33ffb6fda82999ce052aa37f6c446df997a..dac2e150cc88bc468ab3a560abfa10f9b6769ae2 100644 (file)
@@ -2,6 +2,7 @@
   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
 \r
 #define LoadConstantToReg(Data, Reg) \\r
   ldr  Reg, =Data\r
-  \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
+                                      ;             \\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
 // conditional load testing eq flag\r
 #define LoadConstantToRegIfEq(Data, Reg)  LoadConstantToRegIfEqMacro Data, Reg\r
 \r
+#define SetPrimaryStack(StackTop,GlobalSize,Tmp) SetPrimaryStack StackTop, GlobalSize, Tmp\r
 \r
-#endif\r
+// Initialize the Global Variable with '0'\r
+#define InitializePrimaryStack(GlobalSize, Tmp1) InitializePrimaryStack GlobalSize, Tmp1\r
 \r
+#endif\r
 \r
 #endif\r