--- /dev/null
+//\r
+// Copyright (c) 2011, ARM Limited. All rights reserved.\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
+#include <AsmMacroIoLib.h>\r
+#include <Base.h>\r
+#include <Library/PcdLib.h>\r
+#include <ArmPlatform.h>\r
+#include <AutoGen.h>\r
+\r
+ INCLUDE AsmMacroIoLib.inc\r
+ \r
+ EXPORT ArmPlatformIsMemoryInitialized\r
+ EXPORT ArmPlatformInitializeBootMemory\r
+ IMPORT InitializeSMC\r
+ \r
+ PRESERVE8\r
+ AREA CTA9x4Helper, CODE, READONLY\r
+\r
+/**\r
+ Called at the early stage of the Boot phase to know if the memory has already been initialized\r
+\r
+ Running the code from the reset vector does not mean we start from cold boot. In some case, we\r
+ can go through this code with the memory already initialized.\r
+ Because this function is called at the early stage, the implementation must not use the stack.\r
+ Its implementation must probably done in assembly to ensure this requirement.\r
+\r
+ @return Return the condition value into the 'Z' flag\r
+\r
+**/\r
+ArmPlatformIsMemoryInitialized\r
+ // Check if the memory has been already mapped, if so skipped the memory initialization\r
+ LoadConstantToReg (ARM_VE_SYS_CFGRW1_REG ,r0)\r
+ ldr r0, [r0, #0]\r
+ \r
+ // 0x40000000 = Value of Physical Configuration Switch SW[0]\r
+ and r0, r0, #0x40000000\r
+ tst r0, #0x40000000\r
+ bx lr\r
+ \r
+/**\r
+ Initialize the memory where the initial stacks will reside\r
+\r
+ This memory can contain the initial stacks (Secure and Secure Monitor stacks).\r
+ In some platform, this region is already initialized and the implementation of this function can\r
+ do nothing. This memory can also represent the Secure RAM.\r
+ This function is called before the satck has been set up. Its implementation must ensure the stack\r
+ pointer is not used (probably required to use assembly language)\r
+\r
+**/\r
+ArmPlatformInitializeBootMemory\r
+ mov r5, lr\r
+ // Initialize PL354 SMC\r
+ LoadConstantToReg (ARM_VE_SMC_CTRL_BASE, r1)\r
+ LoadConstantToReg (ARM_VE_SMB_PERIPH_VRAM, r2)\r
+ blx InitializeSMC\r
+ bx r5\r
+ \r
+ END\r