ArmPlatformPkg/Sec: Added support for Non Cold Boot Paths
authoroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 4 Jul 2012 20:08:54 +0000 (20:08 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 4 Jul 2012 20:08:54 +0000 (20:08 +0000)
For instance, in case of CpuHotPlug boot path the platform has already been
initialized. The CPU core should not execute any of the platform initialization
in this case.

Signed-off-by: Olivier Martin <olivier.martin@arm.com>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13492 6f19259b-4bc3-4df7-8a09-765794883524

ArmPlatformPkg/Include/Library/ArmPlatformSecLib.h
ArmPlatformPkg/Sec/Helper.S
ArmPlatformPkg/Sec/Helper.asm
ArmPlatformPkg/Sec/Sec.c
ArmPlatformPkg/Sec/SecEntryPoint.S
ArmPlatformPkg/Sec/SecEntryPoint.asm
ArmPlatformPkg/Sec/SecInternal.h

index 477fd7d..32f1eb5 100644 (file)
 #ifndef _ARMPLATFORMSECLIB_H_
 #define _ARMPLATFORMSECLIB_H_
 
+#define ARM_SEC_BOOT_MASK                 ~0
+#define ARM_SEC_COLD_BOOT                 (1 << 0)
+#define ARM_SEC_SECONDARY_COLD_BOOT       (1 << 1)
+
 /**
   Initialize the memory where the initial stacks will reside
 
index 8bdb66a..4eede5f 100644 (file)
@@ -22,17 +22,18 @@ GCC_ASM_EXPORT(set_non_secure_mode)
 \r
 # r0: Monitor World EntryPoint\r
 # r1: MpId\r
-# r2: Secure Monitor mode stack\r
+# r2: SecBootMode\r
+# r3: Secure Monitor mode stack\r
 ASM_PFX(enter_monitor_mode):\r
-    cmp     r2, #0                      @ If a Secure Monitor stack base has not been defined then use the Secure stack\r
-    moveq   r2, sp\r
+    cmp     r3, #0                      @ If a Secure Monitor stack base has not been defined then use the Secure stack\r
+    moveq   r3, sp\r
 \r
     mrs     r4, cpsr                    @ Save current mode (SVC) in r4\r
-    bic     r3, r4, #0x1f               @ Clear all mode bits\r
-    orr     r3, r3, #0x16               @ Set bits for Monitor mode\r
-    msr     cpsr_cxsf, r3               @ We are now in Monitor Mode\r
+    bic     r5, r4, #0x1f               @ Clear all mode bits\r
+    orr     r5, r5, #0x16               @ Set bits for Monitor mode\r
+    msr     cpsr_cxsf, r5               @ We are now in Monitor Mode\r
 \r
-    mov   sp, r2                      @ Set the stack of the Monitor Mode\r
+    mov     sp, r3                      @ Set the stack of the Monitor Mode\r
 \r
     mov     lr, r0                      @ Use the pass entrypoint as lr\r
     \r
@@ -40,6 +41,8 @@ ASM_PFX(enter_monitor_mode):
 \r
     mov     r4, r0                      @ Swap EntryPoint and MpId registers\r
     mov     r0, r1\r
+    mov     r1, r2\r
+    mov     r2, r3\r
 \r
     bx      r4\r
 \r
index a03a906..b31cc31 100644 (file)
 \r
 // r0: Monitor World EntryPoint\r
 // r1: MpId\r
-// r2: Secure Monitor mode stack\r
-enter_monitor_mode\r
-    cmp     r2, #0                      // If a Secure Monitor stack base has not been defined then use the Secure stack\r
-    moveq   r2, sp\r
+// r2: SecBootMode\r
+// r3: Secure Monitor mode stack\r
+enter_monitor_mode FUNCTION\r
+    cmp     r3, #0                      // If a Secure Monitor stack base has not been defined then use the Secure stack\r
+    moveq   r3, sp\r
 \r
     mrs     r4, cpsr                    // Save current mode (SVC) in r4\r
-    bic     r3, r4, #0x1f               // Clear all mode bits\r
-    orr     r3, r3, #0x16               // Set bits for Monitor mode\r
-    msr     cpsr_cxsf, r3               // We are now in Monitor Mode\r
+    bic     r5, r4, #0x1f               // Clear all mode bits\r
+    orr     r5, r5, #0x16               // Set bits for Monitor mode\r
+    msr     cpsr_cxsf, r5               // We are now in Monitor Mode\r
 \r
-    mov     sp, r2                      // Set the stack of the Monitor Mode\r
+    mov     sp, r3                      // Set the stack of the Monitor Mode\r
 \r
     mov     lr, r0                      // Use the pass entrypoint as lr\r
     \r
@@ -38,8 +39,11 @@ enter_monitor_mode
 \r
     mov     r4, r0                      // Swap EntryPoint and MpId registers\r
     mov     r0, r1\r
+    mov     r1, r2\r
+    mov     r2, r3\r
 \r
     bx      r4\r
+    ENDFUNC\r
 \r
 // We cannot use the instruction 'movs pc, lr' because the caller can be written either in ARM or Thumb2 assembler.\r
 // When we will jump into this function, we will set the CPSR flag to ARM assembler. By copying directly 'lr' into\r
index f9746ad..6734653 100644 (file)
@@ -26,7 +26,8 @@
 
 VOID
 CEntryPoint (
-  IN  UINTN                     MpId
+  IN  UINTN                     MpId,
+  IN  UINTN                     SecBootMode
   )
 {
   CHAR8           Buffer[100];
@@ -109,7 +110,7 @@ CEntryPoint (
             ((PcdGet32(PcdCPUCoresSecMonStackBase) != 0) && (PcdGet32(PcdCPUCoreSecMonStackSize) != 0)));
 
     // Enter Monitor Mode
-    enter_monitor_mode ((UINTN)TrustedWorldInitialization, MpId, (VOID*)(PcdGet32(PcdCPUCoresSecMonStackBase) + (PcdGet32(PcdCPUCoreSecMonStackSize) * (GET_CORE_POS(MpId) + 1))));
+    enter_monitor_mode ((UINTN)TrustedWorldInitialization, MpId, SecBootMode, (VOID*)(PcdGet32(PcdCPUCoresSecMonStackBase) + (PcdGet32(PcdCPUCoreSecMonStackSize) * (GET_CORE_POS(MpId) + 1))));
   } else {
     if (IS_PRIMARY_CORE(MpId)) {
       SerialPrint ("Trust Zone Configuration is disabled\n\r");
@@ -131,7 +132,8 @@ CEntryPoint (
 
 VOID
 TrustedWorldInitialization (
-  IN  UINTN                     MpId
+  IN  UINTN                     MpId,
+  IN  UINTN                     SecBootMode
   )
 {
   UINTN   JumpAddress;
@@ -153,7 +155,7 @@ TrustedWorldInitialization (
       // Signal the secondary core the Security settings is done (event: EVENT_SECURE_INIT)
       ArmCallSEV ();
     }
-  } else {
+  } else if ((SecBootMode & ARM_SEC_BOOT_MASK) == ARM_SEC_COLD_BOOT) {
     // The secondary cores need to wait until the Trustzone chipsets configuration is done
     // before switching to Non Secure World
 
index 8266dad..ed7448a 100644 (file)
@@ -38,6 +38,9 @@ ASM_PFX(_ModuleEntryPoint):
   // Ensure that the MMU and caches are off\r
   bl    ASM_PFX(ArmDisableCachesAndMmu)\r
 \r
+  // By default, we are doing a cold boot\r
+  mov   r10, #ARM_SEC_COLD_BOOT\r
+\r
   // Jump to Platform Specific Boot Action function\r
   blx   ASM_PFX(ArmPlatformSecBootAction)\r
 \r
@@ -59,6 +62,11 @@ _IdentifyCpu:
   beq   _InitMem\r
   \r
 _WaitInitMem:\r
+  // If we are not doing a cold boot in this case we should assume the Initial Memory to be already initialized\r
+  // Otherwise we have to wait the Primary Core to finish the initialization\r
+  cmp   r10, #ARM_SEC_COLD_BOOT\r
+  bne   _SetupSecondaryCoreStack\r
+\r
   // Wait for the primary core to initialize the initial memory (event: BOOT_MEM_INIT)\r
   bl    ASM_PFX(ArmCallWFE)\r
   // Now the Init Mem is initialized, we setup the secondary core stacks\r
@@ -108,7 +116,9 @@ _PrepareArguments:
   \r
   // Jump to SEC C code\r
   //    r0 = mp_id\r
+  //    r1 = Boot Mode\r
   mov   r0, r5\r
+  mov   r1, r10\r
   blx   r3\r
   \r
 _NeverReturn:\r
index a20a3fd..30cf192 100644 (file)
   \r
 StartupAddr        DCD      CEntryPoint\r
 \r
-_ModuleEntryPoint\r
+_ModuleEntryPoint FUNCTION\r
   // First ensure all interrupts are disabled\r
   blx   ArmDisableInterrupts\r
 \r
   // Ensure that the MMU and caches are off\r
   blx   ArmDisableCachesAndMmu\r
 \r
+  // By default, we are doing a cold boot\r
+  mov   r10, #ARM_SEC_COLD_BOOT\r
+\r
   // Jump to Platform Specific Boot Action function\r
   blx   ArmPlatformSecBootAction\r
 \r
@@ -61,6 +64,11 @@ _IdentifyCpu
   beq   _InitMem\r
   \r
 _WaitInitMem\r
+  // If we are not doing a cold boot in this case we should assume the Initial Memory to be already initialized\r
+  // Otherwise we have to wait the Primary Core to finish the initialization\r
+  cmp   r10, #ARM_SEC_COLD_BOOT\r
+  bne   _SetupSecondaryCoreStack\r
+\r
   // Wait for the primary core to initialize the initial memory (event: BOOT_MEM_INIT)\r
   bl    ArmCallWFE\r
   // Now the Init Mem is initialized, we setup the secondary core stacks\r
@@ -110,8 +118,11 @@ _PrepareArguments
   \r
   // Jump to SEC C code\r
   //    r0 = mp_id\r
+  //    r1 = Boot Mode\r
   mov   r0, r5\r
+  mov   r1, r10\r
   blx   r3\r
+  ENDFUNC\r
   \r
 _NeverReturn\r
   b _NeverReturn\r
index 0d6daf9..34a6fea 100644 (file)
@@ -28,7 +28,8 @@
 \r
 VOID\r
 TrustedWorldInitialization (\r
-  IN  UINTN                 MpId\r
+  IN  UINTN                     MpId,\r
+  IN  UINTN                     SecBootMode\r
   );\r
 \r
 VOID\r
@@ -53,7 +54,8 @@ VOID
 enter_monitor_mode (\r
   IN UINTN                  MonitorEntryPoint,\r
   IN UINTN                  MpId,\r
-  IN VOID*                  Stack\r
+  IN UINTN                  SecBootMode,\r
+  IN VOID*                  MonitorStackBase\r
   );\r
 \r
 VOID\r