ArmPlatformPkg: Remove PcdStandalone from Sec module and Introduce ArmPlatformSecExtr...
authoroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 6 Jul 2011 16:07:54 +0000 (16:07 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 6 Jul 2011 16:07:54 +0000 (16:07 +0000)
The PcdStandalone is a PCD ARM Ltd uses to make the difference between a standalone UEFI (boot
from cold boot to Boot Manager without user intervention) and a Debug UEFI firmware (the firmware
engineer has to copy the Normale World image into the DRAM to enable his/her firmware).

By coping the firmware into DRAM in the non standalone version it is much faster than reflashing
the NOR Flash after each build.

ArmPlatformSecExtraAction() function is called just before the Sec module jump to normal world.
The platform firmware can run extra actions at this stage.
The 'ARM Standalone' concept has moved to the implementation of ArmPlatformSecExtraAction() for
the ARM development boards (in ArmPlatformPkg/Library/DebugSecExtraActionLib).

ArmPlatformPkg: Enable DebugAgentLib in Sec and PrePeiCore

ArmPlatformPkg: Fix line endings in some source files

Use CR+LF line endings as defined by the EDK2 coding convention

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11991 6f19259b-4bc3-4df7-8a09-765794883524

29 files changed:
ArmPkg/ArmPkg.dec
ArmPkg/Drivers/CpuDxe/ExceptionSupport.ARMv6.asm
ArmPkg/Library/CompilerIntrinsicsLib/Arm/sourcery.S
ArmPlatformPkg/ArmPlatformPkg.dec
ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb-RTSM-A8.dsc
ArmPlatformPkg/ArmRealViewEbPkg/ArmRealViewEb-RTSM-A9x2.dsc
ArmPlatformPkg/ArmRealViewEbPkg/Library/ArmRealViewEbLibRTSM/ArmRealViewEbLib.inf
ArmPlatformPkg/ArmRealViewEbPkg/Library/ArmRealViewEbLibRTSM/ArmRealViewEbSecLib.inf
ArmPlatformPkg/ArmRealViewEbPkg/Library/GdbSerialLib/GdbSerialLib.c
ArmPlatformPkg/ArmVExpressPkg/ArmVExpress-CTA9x4.dsc
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/ArmVExpressLib.inf
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/ArmVExpressSecLib.inf
ArmPlatformPkg/Bds/BootMenu.c
ArmPlatformPkg/Include/Library/ArmPlatformLib.h
ArmPlatformPkg/Library/DebugSecExtraActionLib/DebugSecExtraActionLib.c [new file with mode: 0755]
ArmPlatformPkg/Library/DebugSecExtraActionLib/DebugSecExtraActionLib.inf [new file with mode: 0755]
ArmPlatformPkg/PrePeiCore/Exception.S
ArmPlatformPkg/PrePeiCore/Exception.asm
ArmPlatformPkg/PrePeiCore/MainMPCore.c
ArmPlatformPkg/PrePeiCore/PrePeiCore.c
ArmPlatformPkg/PrePeiCore/PrePeiCoreMPCore.inf
ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf
ArmPlatformPkg/PrePi/PeiMPCore.inf
ArmPlatformPkg/PrePi/PeiUniCore.inf
ArmPlatformPkg/Sec/Exception.asm
ArmPlatformPkg/Sec/Sec.c
ArmPlatformPkg/Sec/Sec.inf
EmbeddedPkg/Ebl/Variable.c
EmbeddedPkg/Library/PrePiMemoryAllocationLib/MemoryAllocationLib.c

index 1707863..e037f9f 100644 (file)
@@ -57,7 +57,6 @@
   gArmTokenSpaceGuid.PcdDebuggerExceptionSupport|FALSE|BOOLEAN|0x00000032\r
   \r
   gArmTokenSpaceGuid.PcdEfiUncachedMemoryToStronglyOrdered|FALSE|BOOLEAN|0x00000025\r
-  gArmTokenSpaceGuid.PcdSkipPeiCore|FALSE|BOOLEAN|0x00000026\r
 \r
 [PcdsFixedAtBuild.common]\r
   # This PCD should be a FeaturePcd. But we used this PCD as an '#if' in an ASM file.\r
index 240e1e3..736d479 100644 (file)
-//------------------------------------------------------------------------------ 
-//
-// Use ARMv6 instruction to operate on a single stack
-//
-// Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
-//
-// This program and the accompanying materials
-// are licensed and made available under the terms and conditions of the BSD License
-// which accompanies this distribution.  The full text of the license may be found at
-// http://opensource.org/licenses/bsd-license.php
-//
-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-//
-//------------------------------------------------------------------------------
-
-#include <Library/PcdLib.h>
-
-/*
-
-This is the stack constructed by the exception handler (low address to high address)
-                # R0 - IFAR is EFI_SYSTEM_CONTEXT for ARM
-  Reg   Offset
-  ===   ======              
-  R0    0x00    # stmfd     SP!,{R0-R12}
-  R1    0x04
-  R2    0x08
-  R3    0x0c
-  R4    0x10
-  R5    0x14
-  R6    0x18
-  R7    0x1c
-  R8    0x20
-  R9    0x24
-  R10   0x28
-  R11   0x2c
-  R12   0x30
-  SP    0x34    # reserved via adding 0x20 (32) to the SP
-  LR    0x38
-  PC    0x3c
-  CPSR  0x40
-  DFSR  0x44
-  DFAR  0x48
-  IFSR  0x4c
-  IFAR  0x50
-  
-  LR    0x54    # SVC Link register (we need to restore it)
-  
-  LR    0x58    # pushed by srsfd    
-  CPSR  0x5c    
-
- */
-  EXPORT  ExceptionHandlersStart
-  EXPORT  ExceptionHandlersEnd
-  EXPORT  CommonExceptionEntry
-  EXPORT  AsmCommonExceptionEntry
-  IMPORT  CommonCExceptionHandler
-
-  PRESERVE8
-  AREA  DxeExceptionHandlers, CODE, READONLY
-  
-  ALIGN   32
-  
-//
-// This code gets copied to the ARM vector table
-// ExceptionHandlersStart - ExceptionHandlersEnd gets copied
-//
-ExceptionHandlersStart
-
-Reset
-  b   ResetEntry
-
-UndefinedInstruction
-  b   UndefinedInstructionEntry
-
-SoftwareInterrupt
-  b   SoftwareInterruptEntry
-
-PrefetchAbort
-  b   PrefetchAbortEntry
-
-DataAbort
-  b   DataAbortEntry
-
-ReservedException
-  b   ReservedExceptionEntry
-
-Irq
-  b   IrqEntry
-
-Fiq
-  b   FiqEntry
-
-ResetEntry
-  srsfd     #0x13!                    ; Store return state on SVC stack
-                                      ; We are already in SVC mode
-  stmfd     SP!,{LR}                  ; Store the link register for the current mode
-  sub       SP,SP,#0x20               ; Save space for SP, LR, PC, IFAR - CPSR
-  stmfd     SP!,{R0-R12}              ; Store the register state
-  
-  mov       R0,#0                     ; ExceptionType
-  ldr       R1,CommonExceptionEntry
-  bx        R1
-
-UndefinedInstructionEntry
-  sub       LR, LR, #4                ; Only -2 for Thumb, adjust in CommonExceptionEntry
-  srsfd     #0x13!                    ; Store return state on SVC stack
-  cps       #0x13                     ; Switch to SVC for common stack
-  stmfd     SP!,{LR}                  ; Store the link register for the current mode
-  sub       SP,SP,#0x20               ; Save space for SP, LR, PC, IFAR - CPSR
-  stmfd     SP!,{R0-R12}              ; Store the register state
-
-  mov       R0,#1                     ; ExceptionType
-  ldr       R1,CommonExceptionEntry; 
-  bx        R1
-
-SoftwareInterruptEntry
-  sub       LR, LR, #4                ; Only -2 for Thumb, adjust in CommonExceptionEntry
-  srsfd     #0x13!                    ; Store return state on SVC stack
-                                      ; We are already in SVC mode
-  stmfd     SP!,{LR}                  ; Store the link register for the current mode
-  sub       SP,SP,#0x20               ; Save space for SP, LR, PC, IFAR - CPSR
-  stmfd     SP!,{R0-R12}              ; Store the register state
-
-  mov       R0,#2                     ; ExceptionType
-  ldr       R1,CommonExceptionEntry
-  bx        R1
-
-PrefetchAbortEntry
-  sub       LR,LR,#4
-  srsfd     #0x13!                    ; Store return state on SVC stack
-  cps       #0x13                     ; Switch to SVC for common stack
-  stmfd     SP!,{LR}                  ; Store the link register for the current mode
-  sub       SP,SP,#0x20               ; Save space for SP, LR, PC, IFAR - CPSR
-  stmfd     SP!,{R0-R12}              ; Store the register state
-
-  mov       R0,#3                     ; ExceptionType
-  ldr       R1,CommonExceptionEntry
-  bx        R1
-
-DataAbortEntry
-  sub       LR,LR,#8
-  srsfd     #0x13!                    ; Store return state on SVC stack
-  cps       #0x13                     ; Switch to SVC for common stack
-  stmfd     SP!,{LR}                  ; Store the link register for the current mode
-  sub       SP,SP,#0x20               ; Save space for SP, LR, PC, IFAR - CPSR
-  stmfd     SP!,{R0-R12}              ; Store the register state
-
-  mov       R0,#4                     ; ExceptionType
-  ldr       R1,CommonExceptionEntry
-  bx        R1
-
-ReservedExceptionEntry
-  srsfd     #0x13!                    ; Store return state on SVC stack
-  cps       #0x13                     ; Switch to SVC for common stack
-  stmfd     SP!,{LR}                  ; Store the link register for the current mode
-  sub       SP,SP,#0x20               ; Save space for SP, LR, PC, IFAR - CPSR
-  stmfd     SP!,{R0-R12}              ; Store the register state
-
-  mov       R0,#5                     ; ExceptionType
-  ldr       R1,CommonExceptionEntry
-  bx        R1
-
-IrqEntry
-  sub       LR,LR,#4
-  srsfd     #0x13!                    ; Store return state on SVC stack
-  cps       #0x13                     ; Switch to SVC for common stack
-  stmfd     SP!,{LR}                  ; Store the link register for the current mode
-  sub       SP,SP,#0x20               ; Save space for SP, LR, PC, IFAR - CPSR
-  stmfd     SP!,{R0-R12}              ; Store the register state
-
-  mov       R0,#6                     ; ExceptionType
-  ldr       R1,CommonExceptionEntry
-  bx        R1
-
-FiqEntry
-  sub       LR,LR,#4
-  srsfd     #0x13!                    ; Store return state on SVC stack
-  cps       #0x13                     ; Switch to SVC for common stack
-  stmfd     SP!,{LR}                  ; Store the link register for the current mode
-  sub       SP,SP,#0x20               ; Save space for SP, LR, PC, IFAR - CPSR
-  stmfd     SP!,{R0-R12}              ; Store the register state
-                                      ; Since we have already switch to SVC R8_fiq - R12_fiq
-                                      ; never get used or saved
-  mov       R0,#7                     ; ExceptionType
-  ldr       R1,CommonExceptionEntry
-  bx        R1
-
-//
-// This gets patched by the C code that patches in the vector table
-//
-CommonExceptionEntry
-  dcd       AsmCommonExceptionEntry
-
-ExceptionHandlersEnd
-
-//
-// This code runs from CpuDxe driver loaded address. It is patched into 
-// CommonExceptionEntry.
-//
-AsmCommonExceptionEntry
-  mrc       p15, 0, R1, c6, c0, 2   ; Read IFAR
-  str       R1, [SP, #0x50]         ; Store it in EFI_SYSTEM_CONTEXT_ARM.IFAR 
-  
-  mrc       p15, 0, R1, c5, c0, 1   ; Read IFSR
-  str       R1, [SP, #0x4c]         ; Store it in EFI_SYSTEM_CONTEXT_ARM.IFSR
-  
-  mrc       p15, 0, R1, c6, c0, 0   ; Read DFAR
-  str       R1, [SP, #0x48]         ; Store it in EFI_SYSTEM_CONTEXT_ARM.DFAR
-  
-  mrc       p15, 0, R1, c5, c0, 0   ; Read DFSR
-  str       R1, [SP, #0x44]         ; Store it in EFI_SYSTEM_CONTEXT_ARM.DFSR
-  
-  ldr       R1, [SP, #0x5c]         ; srsfd saved pre-exception CPSR on the stack 
-  str       R1, [SP, #0x40]         ; Store it in EFI_SYSTEM_CONTEXT_ARM.CPSR
-
-  add       R2, SP, #0x38           ; Make R2 point to EFI_SYSTEM_CONTEXT_ARM.LR
-  and       R3, R1, #0x1f           ; Check CPSR to see if User or System Mode
-  cmp       R3, #0x1f               ; if ((CPSR == 0x10) || (CPSR == 0x1df))
-  cmpne     R3, #0x10               ;   
-  stmeqed   R2, {lr}^               ;   save unbanked lr
-                                    ; else 
-  stmneed   R2, {lr}                ;   save SVC lr
-
-
-  ldr       R5, [SP, #0x58]         ; PC is the LR pushed by srsfd 
-                                    ; Check to see if we have to adjust for Thumb entry
-  sub       r4, r0, #1              ; if (ExceptionType == 1 || ExceptionType ==2)) {
-  cmp       r4, #1                  ;   // UND & SVC have differnt LR adjust for Thumb 
-  bhi       NoAdjustNeeded
-  
-  tst       r1, #0x20               ;   if ((CPSR & T)) == T) {  // Thumb Mode on entry 
-  addne     R5, R5, #2              ;     PC += 2;
-  str       R5,[SP,#0x58]           ; Update LR value pused by srsfd 
-  
-NoAdjustNeeded
-
-  str       R5, [SP, #0x3c]         ; Store it in EFI_SYSTEM_CONTEXT_ARM.PC
-  
-  sub       R1, SP, #0x60           ; We pused 0x60 bytes on the stack 
-  str       R1, [SP, #0x34]         ; Store it in EFI_SYSTEM_CONTEXT_ARM.SP
-  
-                                    ; R0 is ExceptionType 
-  mov       R1,SP                   ; R1 is SystemContext 
-
-#if (FixedPcdGet32(PcdVFPEnabled))
+//------------------------------------------------------------------------------ \r
+//\r
+// Use ARMv6 instruction to operate on a single stack\r
+//\r
+// Copyright (c) 2008 - 2010, Apple Inc. 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
+#include <Library/PcdLib.h>\r
+\r
+/*\r
+\r
+This is the stack constructed by the exception handler (low address to high address)\r
+                # R0 - IFAR is EFI_SYSTEM_CONTEXT for ARM\r
+  Reg   Offset\r
+  ===   ======              \r
+  R0    0x00    # stmfd     SP!,{R0-R12}\r
+  R1    0x04\r
+  R2    0x08\r
+  R3    0x0c\r
+  R4    0x10\r
+  R5    0x14\r
+  R6    0x18\r
+  R7    0x1c\r
+  R8    0x20\r
+  R9    0x24\r
+  R10   0x28\r
+  R11   0x2c\r
+  R12   0x30\r
+  SP    0x34    # reserved via adding 0x20 (32) to the SP\r
+  LR    0x38\r
+  PC    0x3c\r
+  CPSR  0x40\r
+  DFSR  0x44\r
+  DFAR  0x48\r
+  IFSR  0x4c\r
+  IFAR  0x50\r
+  \r
+  LR    0x54    # SVC Link register (we need to restore it)\r
+  \r
+  LR    0x58    # pushed by srsfd    \r
+  CPSR  0x5c    \r
+\r
+ */\r
\r
\r
+  EXPORT  ExceptionHandlersStart\r
+  EXPORT  ExceptionHandlersEnd\r
+  EXPORT  CommonExceptionEntry\r
+  EXPORT  AsmCommonExceptionEntry\r
+  IMPORT  CommonCExceptionHandler\r
+\r
+  PRESERVE8\r
+  AREA  DxeExceptionHandlers, CODE, READONLY\r
+  \r
+  ALIGN   32\r
+  \r
+//\r
+// This code gets copied to the ARM vector table\r
+// ExceptionHandlersStart - ExceptionHandlersEnd gets copied\r
+//\r
+ExceptionHandlersStart\r
+\r
+Reset\r
+  b   ResetEntry\r
+\r
+UndefinedInstruction\r
+  b   UndefinedInstructionEntry\r
+\r
+SoftwareInterrupt\r
+  b   SoftwareInterruptEntry\r
+\r
+PrefetchAbort\r
+  b   PrefetchAbortEntry\r
+\r
+DataAbort\r
+  b   DataAbortEntry\r
+\r
+ReservedException\r
+  b   ReservedExceptionEntry\r
+\r
+Irq\r
+  b   IrqEntry\r
+\r
+Fiq\r
+  b   FiqEntry\r
+\r
+ResetEntry\r
+  srsfd     #0x13!                    ; Store return state on SVC stack\r
+                                      ; We are already in SVC mode\r
+  stmfd     SP!,{LR}                  ; Store the link register for the current mode\r
+  sub       SP,SP,#0x20               ; Save space for SP, LR, PC, IFAR - CPSR\r
+  stmfd     SP!,{R0-R12}              ; Store the register state\r
+  \r
+  mov       R0,#0                     ; ExceptionType\r
+  ldr       R1,CommonExceptionEntry\r
+  bx        R1\r
+\r
+UndefinedInstructionEntry\r
+  sub       LR, LR, #4                ; Only -2 for Thumb, adjust in CommonExceptionEntry\r
+  srsfd     #0x13!                    ; Store return state on SVC stack\r
+  cps       #0x13                     ; Switch to SVC for common stack\r
+  stmfd     SP!,{LR}                  ; Store the link register for the current mode\r
+  sub       SP,SP,#0x20               ; Save space for SP, LR, PC, IFAR - CPSR\r
+  stmfd     SP!,{R0-R12}              ; Store the register state\r
+\r
+  mov       R0,#1                     ; ExceptionType\r
+  ldr       R1,CommonExceptionEntry; \r
+  bx        R1\r
+\r
+SoftwareInterruptEntry\r
+  sub       LR, LR, #4                ; Only -2 for Thumb, adjust in CommonExceptionEntry\r
+  srsfd     #0x13!                    ; Store return state on SVC stack\r
+                                      ; We are already in SVC mode\r
+  stmfd     SP!,{LR}                  ; Store the link register for the current mode\r
+  sub       SP,SP,#0x20               ; Save space for SP, LR, PC, IFAR - CPSR\r
+  stmfd     SP!,{R0-R12}              ; Store the register state\r
+\r
+  mov       R0,#2                     ; ExceptionType\r
+  ldr       R1,CommonExceptionEntry\r
+  bx        R1\r
+\r
+PrefetchAbortEntry\r
+  sub       LR,LR,#4\r
+  srsfd     #0x13!                    ; Store return state on SVC stack\r
+  cps       #0x13                     ; Switch to SVC for common stack\r
+  stmfd     SP!,{LR}                  ; Store the link register for the current mode\r
+  sub       SP,SP,#0x20               ; Save space for SP, LR, PC, IFAR - CPSR\r
+  stmfd     SP!,{R0-R12}              ; Store the register state\r
+\r
+  mov       R0,#3                     ; ExceptionType\r
+  ldr       R1,CommonExceptionEntry\r
+  bx        R1\r
+\r
+DataAbortEntry\r
+  sub       LR,LR,#8\r
+  srsfd     #0x13!                    ; Store return state on SVC stack\r
+  cps       #0x13                     ; Switch to SVC for common stack\r
+  stmfd     SP!,{LR}                  ; Store the link register for the current mode\r
+  sub       SP,SP,#0x20               ; Save space for SP, LR, PC, IFAR - CPSR\r
+  stmfd     SP!,{R0-R12}              ; Store the register state\r
+\r
+  mov       R0,#4                     ; ExceptionType\r
+  ldr       R1,CommonExceptionEntry\r
+  bx        R1\r
+\r
+ReservedExceptionEntry\r
+  srsfd     #0x13!                    ; Store return state on SVC stack\r
+  cps       #0x13                     ; Switch to SVC for common stack\r
+  stmfd     SP!,{LR}                  ; Store the link register for the current mode\r
+  sub       SP,SP,#0x20               ; Save space for SP, LR, PC, IFAR - CPSR\r
+  stmfd     SP!,{R0-R12}              ; Store the register state\r
+\r
+  mov       R0,#5                     ; ExceptionType\r
+  ldr       R1,CommonExceptionEntry\r
+  bx        R1\r
+\r
+IrqEntry\r
+  sub       LR,LR,#4\r
+  srsfd     #0x13!                    ; Store return state on SVC stack\r
+  cps       #0x13                     ; Switch to SVC for common stack\r
+  stmfd     SP!,{LR}                  ; Store the link register for the current mode\r
+  sub       SP,SP,#0x20               ; Save space for SP, LR, PC, IFAR - CPSR\r
+  stmfd     SP!,{R0-R12}              ; Store the register state\r
+\r
+  mov       R0,#6                     ; ExceptionType\r
+  ldr       R1,CommonExceptionEntry\r
+  bx        R1\r
+\r
+FiqEntry\r
+  sub       LR,LR,#4\r
+  srsfd     #0x13!                    ; Store return state on SVC stack\r
+  cps       #0x13                     ; Switch to SVC for common stack\r
+  stmfd     SP!,{LR}                  ; Store the link register for the current mode\r
+  sub       SP,SP,#0x20               ; Save space for SP, LR, PC, IFAR - CPSR\r
+  stmfd     SP!,{R0-R12}              ; Store the register state\r
+                                      ; Since we have already switch to SVC R8_fiq - R12_fiq\r
+                                      ; never get used or saved\r
+  mov       R0,#7                     ; ExceptionType\r
+  ldr       R1,CommonExceptionEntry\r
+  bx        R1\r
+\r
+//\r
+// This gets patched by the C code that patches in the vector table\r
+//\r
+CommonExceptionEntry\r
+  dcd       AsmCommonExceptionEntry\r
+\r
+ExceptionHandlersEnd\r
+\r
+//\r
+// This code runs from CpuDxe driver loaded address. It is patched into \r
+// CommonExceptionEntry.\r
+//\r
+AsmCommonExceptionEntry\r
+  mrc       p15, 0, R1, c6, c0, 2   ; Read IFAR\r
+  str       R1, [SP, #0x50]         ; Store it in EFI_SYSTEM_CONTEXT_ARM.IFAR \r
+  \r
+  mrc       p15, 0, R1, c5, c0, 1   ; Read IFSR\r
+  str       R1, [SP, #0x4c]         ; Store it in EFI_SYSTEM_CONTEXT_ARM.IFSR\r
+  \r
+  mrc       p15, 0, R1, c6, c0, 0   ; Read DFAR\r
+  str       R1, [SP, #0x48]         ; Store it in EFI_SYSTEM_CONTEXT_ARM.DFAR\r
+  \r
+  mrc       p15, 0, R1, c5, c0, 0   ; Read DFSR\r
+  str       R1, [SP, #0x44]         ; Store it in EFI_SYSTEM_CONTEXT_ARM.DFSR\r
+  \r
+  ldr       R1, [SP, #0x5c]         ; srsfd saved pre-exception CPSR on the stack \r
+  str       R1, [SP, #0x40]         ; Store it in EFI_SYSTEM_CONTEXT_ARM.CPSR\r
+\r
+  add       R2, SP, #0x38           ; Make R2 point to EFI_SYSTEM_CONTEXT_ARM.LR\r
+  and       R3, R1, #0x1f           ; Check CPSR to see if User or System Mode\r
+  cmp       R3, #0x1f               ; if ((CPSR == 0x10) || (CPSR == 0x1df))\r
+  cmpne     R3, #0x10               ;   \r
+  stmeqed   R2, {lr}^               ;   save unbanked lr\r
+                                    ; else \r
+  stmneed   R2, {lr}                ;   save SVC lr\r
+\r
+\r
+  ldr       R5, [SP, #0x58]         ; PC is the LR pushed by srsfd \r
+                                    ; Check to see if we have to adjust for Thumb entry\r
+  sub       r4, r0, #1              ; if (ExceptionType == 1 || ExceptionType ==2)) {\r
+  cmp       r4, #1                  ;   // UND & SVC have differnt LR adjust for Thumb \r
+  bhi       NoAdjustNeeded\r
+  \r
+  tst       r1, #0x20               ;   if ((CPSR & T)) == T) {  // Thumb Mode on entry \r
+  addne     R5, R5, #2              ;     PC += 2;\r
+  str       R5,[SP,#0x58]           ; Update LR value pused by srsfd \r
+  \r
+NoAdjustNeeded\r
+\r
+  str       R5, [SP, #0x3c]         ; Store it in EFI_SYSTEM_CONTEXT_ARM.PC\r
+  \r
+  sub       R1, SP, #0x60           ; We pused 0x60 bytes on the stack \r
+  str       R1, [SP, #0x34]         ; Store it in EFI_SYSTEM_CONTEXT_ARM.SP\r
+  \r
+                                    ; R0 is ExceptionType \r
+  mov       R1,SP                   ; R1 is SystemContext \r
+\r
+#if (FixedPcdGet32(PcdVFPEnabled))\r
   vpush    {d0-d15}                  ; save vstm registers in case they are used in optimizations\r
-#endif
-
-/* 
-VOID
-EFIAPI
-CommonCExceptionHandler (
-  IN     EFI_EXCEPTION_TYPE           ExceptionType,   R0
-  IN OUT EFI_SYSTEM_CONTEXT           SystemContext    R1
-  )
-
-*/
-  blx       CommonCExceptionHandler ; Call exception handler
-\r
-#if (FixedPcdGet32(PcdVFPEnabled))
+#endif\r
+\r
+/* \r
+VOID\r
+EFIAPI\r
+CommonCExceptionHandler (\r
+  IN     EFI_EXCEPTION_TYPE           ExceptionType,   R0\r
+  IN OUT EFI_SYSTEM_CONTEXT           SystemContext    R1\r
+  )\r
+\r
+*/\r
+  blx       CommonCExceptionHandler ; Call exception handler\r
+\r
+#if (FixedPcdGet32(PcdVFPEnabled))\r
   vpop      {d0-d15}\r
-#endif
-  
-  ldr       R1, [SP, #0x4c]         ; Restore EFI_SYSTEM_CONTEXT_ARM.IFSR
-  mcr       p15, 0, R1, c5, c0, 1   ; Write IFSR
-
-  ldr       R1, [SP, #0x44]         ; sRestore EFI_SYSTEM_CONTEXT_ARM.DFSR
-  mcr       p15, 0, R1, c5, c0, 0   ; Write DFSR
-  
-  ldr       R1,[SP,#0x3c]           ; EFI_SYSTEM_CONTEXT_ARM.PC
-  str       R1,[SP,#0x58]           ; Store it back to srsfd stack slot so it can be restored 
-
-  ldr       R1,[SP,#0x40]           ; EFI_SYSTEM_CONTEXT_ARM.CPSR
-  str       R1,[SP,#0x5c]           ; Store it back to srsfd stack slot so it can be restored 
-  
-  add       R3, SP, #0x54           ; Make R3 point to SVC LR saved on entry
-  add       R2, SP, #0x38           ; Make R2 point to EFI_SYSTEM_CONTEXT_ARM.LR
-  and       R1, R1, #0x1f           ; Check to see if User or System Mode
-  cmp       R1, #0x1f               ; if ((CPSR == 0x10) || (CPSR == 0x1f))
-  cmpne     R1, #0x10               ;   
-  ldmeqed   R2, {lr}^               ;   restore unbanked lr
-                                    ; else
-  ldmneed   R3, {lr}                ;   restore SVC lr, via ldmfd SP!, {LR}
-  
-  ldmfd     SP!,{R0-R12}            ; Restore general purpose registers
-                                    ; Exception handler can not change SP
-                                    
-  add       SP,SP,#0x20             ; Clear out the remaining stack space
-  ldmfd     SP!,{LR}                ; restore the link register for this context
-  rfefd     SP!                     ; return from exception via srsfd stack slot
-  
-  END
-
-
+#endif\r
+  \r
+  ldr       R1, [SP, #0x4c]         ; Restore EFI_SYSTEM_CONTEXT_ARM.IFSR\r
+  mcr       p15, 0, R1, c5, c0, 1   ; Write IFSR\r
+\r
+  ldr       R1, [SP, #0x44]         ; sRestore EFI_SYSTEM_CONTEXT_ARM.DFSR\r
+  mcr       p15, 0, R1, c5, c0, 0   ; Write DFSR\r
+  \r
+  ldr       R1,[SP,#0x3c]           ; EFI_SYSTEM_CONTEXT_ARM.PC\r
+  str       R1,[SP,#0x58]           ; Store it back to srsfd stack slot so it can be restored \r
+\r
+  ldr       R1,[SP,#0x40]           ; EFI_SYSTEM_CONTEXT_ARM.CPSR\r
+  str       R1,[SP,#0x5c]           ; Store it back to srsfd stack slot so it can be restored \r
+  \r
+  add       R3, SP, #0x54           ; Make R3 point to SVC LR saved on entry\r
+  add       R2, SP, #0x38           ; Make R2 point to EFI_SYSTEM_CONTEXT_ARM.LR\r
+  and       R1, R1, #0x1f           ; Check to see if User or System Mode\r
+  cmp       R1, #0x1f               ; if ((CPSR == 0x10) || (CPSR == 0x1f))\r
+  cmpne     R1, #0x10               ;   \r
+  ldmeqed   R2, {lr}^               ;   restore unbanked lr\r
+                                    ; else\r
+  ldmneed   R3, {lr}                ;   restore SVC lr, via ldmfd SP!, {LR}\r
+  \r
+  ldmfd     SP!,{R0-R12}            ; Restore general purpose registers\r
+                                    ; Exception handler can not change SP\r
+                                    \r
+  add       SP,SP,#0x20             ; Clear out the remaining stack space\r
+  ldmfd     SP!,{LR}                ; restore the link register for this context\r
+  rfefd     SP!                     ; return from exception via srsfd stack slot\r
+  \r
+  END\r
+\r
+\r
index 7938856..6101457 100755 (executable)
@@ -1,18 +1,18 @@
-#------s------------------------------------------------------------------------ 
-#
-# Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
-#
-# This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-#------------------------------------------------------------------------------
-
-
+#------s------------------------------------------------------------------------ \r
+#\r
+# Copyright (c) 2008 - 2010, Apple Inc. 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
        .text\r
        .align 2\r
        GCC_ASM_EXPORT(__aeabi_ulcmp)\r
index 3eb3608..898dcc1 100644 (file)
 [PcdsFeatureFlag.common]
   # Set this PCD to TRUE to map NORFlash at 0x0. FALSE means the DRAM is mapped at 0x0.
   gArmPlatformTokenSpaceGuid.PcdNorFlashRemapping|FALSE|BOOLEAN|0x00000012
+  
+  gArmPlatformTokenSpaceGuid.PcdStandalone|TRUE|BOOLEAN|0x00000001
+  gArmPlatformTokenSpaceGuid.PcdSystemMemoryInitializeInSec|FALSE|BOOLEAN|0x00000002
+  gArmPlatformTokenSpaceGuid.PcdSendSgiToBringUpSecondaryCores|FALSE|BOOLEAN|0x00000004
+  
 
 [PcdsFixedAtBuild.common]
   # These PCDs should be FeaturePcds. But we used these PCDs as an '#if' in an ASM file.
   # Using a FeaturePcd make a '(BOOLEAN) casting for its value which is not understood by the preprocessor.
-  gArmPlatformTokenSpaceGuid.PcdStandalone|0|UINT32|0x00000001
   gArmPlatformTokenSpaceGuid.PcdMPCoreSupport|0|UINT32|0x00000003
   
   # Stack for CPU Cores in Secure Mode
index 2ac5203..0002d1a 100644 (file)
 [LibraryClasses.common.SEC]\r
   ArmLib|ArmPkg/Library/ArmLib/ArmV7/ArmV7LibSec.inf\r
   ArmPlatformLib|ArmPlatformPkg/ArmRealViewEbPkg/Library/ArmRealViewEbLibRTSM/ArmRealViewEbSecLib.inf\r
+  DebugSecExtraActionLib|ArmPlatformPkg/Library/DebugSecExtraActionLib/DebugSecExtraActionLib.inf\r
+  \r
   PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf\r
   \r
   # 1/123 faster than Stm or Vstm version\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdTurnOffUsbLegacySupport|TRUE\r
 \r
 !if $(EDK2_SKIP_PEICORE) == 1\r
-  gArmTokenSpaceGuid.PcdSkipPeiCore|TRUE\r
+  gArmPlatformTokenSpaceGuid.PcdSystemMemoryInitializeInSec|TRUE\r
+  gArmPlatformTokenSpaceGuid.PcdSendSgiToBringUpSecondaryCores|TRUE\r
 !endif\r
 \r
   ## If TRUE, Graphics Output Protocol will be installed on virtual handle created by ConsplitterDxe.\r
 #\r
   gArmTokenSpaceGuid.PcdCpuVectorBaseAddress|0x00000000\r
   \r
-  gArmPlatformTokenSpaceGuid.PcdStandalone|1\r
-  \r
   # Stack for CPU Cores in Secure Mode\r
   gArmPlatformTokenSpaceGuid.PcdCPUCoresSecStackBase|0x4B000000     # Top of SEC Stack for Secure World\r
   gArmPlatformTokenSpaceGuid.PcdCPUCoreSecStackSize|0x2000          # Size of SEC Stack for Secure World\r
       ArmPlatformLib|ArmPlatformPkg/ArmRealViewEbPkg/Library/ArmRealViewEbLibRTSM/ArmRealViewEbLib.inf\r
   }\r
 !else\r
-  ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf\r
+  ArmPlatformPkg/PrePeiCore/PrePeiCoreUniCore.inf {\r
+    <LibraryClasses>\r
+      PL390GicSecLib|ArmPkg/Drivers/PL390Gic/PL390GicNonSec.inf\r
+  }\r
   MdeModulePkg/Core/Pei/PeiMain.inf\r
   MdeModulePkg/Universal/PCD/Pei/Pcd.inf  {\r
     <LibraryClasses>\r
index aca849d..69e724b 100644 (file)
   
   # ARM PL011 UART Driver
   PL011UartLib|ArmPlatformPkg/Drivers/PL011Uart/PL011Uart.inf
+  # ARM PL390 General Interrupt Driver in Secure and Non-secure
+  PL390GicNonSecLib|ArmPkg/Drivers/PL390Gic/PL390GicNonSec.inf
 
   BdsLib|ArmPkg/Library/BdsLib/BdsLib.inf
   
 [LibraryClasses.common.SEC]
   ArmLib|ArmPkg/Library/ArmLib/ArmV7/ArmV7MPCoreLibSec.inf
   ArmPlatformLib|ArmPlatformPkg/ArmRealViewEbPkg/Library/ArmRealViewEbLibRTSM/ArmRealViewEbSecLib.inf
+  DebugSecExtraActionLib|ArmPlatformPkg/Library/DebugSecExtraActionLib/DebugSecExtraActionLib.inf
+  
   PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
   
   # 1/123 faster than Stm or Vstm version
   
   # L2 Cache Driver
   L2X0CacheLib|ArmPlatformPkg/Library/L2X0CacheLibNull/L2X0CacheLibNull.inf
-  # ARM PL390 General Interrupt Driver in Secure and Non-secure
+  # ARM PL390 General Interrupt Driver in Secure
   PL390GicSecLib|ArmPkg/Drivers/PL390Gic/PL390GicSec.inf
-  PL390GicNonSecLib|ArmPkg/Drivers/PL390Gic/PL390GicNonSec.inf
 
 !if $(EDK2_SKIP_PEICORE) == 1
   PrePiLib|EmbeddedPkg/Library/PrePiLib/PrePiLib.inf
   gEfiMdeModulePkgTokenSpaceGuid.PcdTurnOffUsbLegacySupport|TRUE
 
 !if $(EDK2_SKIP_PEICORE) == 1
-  gArmTokenSpaceGuid.PcdSkipPeiCore|TRUE
+  gArmPlatformTokenSpaceGuid.PcdSystemMemoryInitializeInSec|TRUE
+  gArmPlatformTokenSpaceGuid.PcdSendSgiToBringUpSecondaryCores|TRUE
 !endif
 
   ## If TRUE, Graphics Output Protocol will be installed on virtual handle created by ConsplitterDxe.
 #
   gArmTokenSpaceGuid.PcdCpuVectorBaseAddress|0x00000000
   
-  gArmPlatformTokenSpaceGuid.PcdStandalone|1
   gArmPlatformTokenSpaceGuid.PcdMPCoreSupport|1
   
   # Stacks for MPCores in Secure World
 # PEI Phase modules
 #
 !if $(EDK2_SKIP_PEICORE) == 1
-  ArmPlatformPkg/PrePi/PeiMPCore.inf{
+  ArmPlatformPkg/PrePi/PeiMPCore.inf {
     <LibraryClasses>
       ArmLib|ArmPkg/Library/ArmLib/ArmV7/ArmV7MPCoreLib.inf
       ArmPlatformLib|ArmPlatformPkg/ArmRealViewEbPkg/Library/ArmRealViewEbLibRTSM/ArmRealViewEbLib.inf
   }
 !else
-  ArmPlatformPkg/PrePeiCore/PrePeiCoreMPCore.inf
+  ArmPlatformPkg/PrePeiCore/PrePeiCoreMPCore.inf {
+    <LibraryClasses>
+      PL390GicSecLib|ArmPkg/Drivers/PL390Gic/PL390GicNonSec.inf
+  }
   MdeModulePkg/Core/Pei/PeiMain.inf
   MdeModulePkg/Universal/PCD/Pei/Pcd.inf  {
     <LibraryClasses>
index e375709..0cd0c8e 100644 (file)
   ArmRealViewEbHelper.asm   | RVCT
   ArmRealViewEbHelper.S     | GCC
 
-[Protocols]
-
 [FeaturePcd]
   gEmbeddedTokenSpaceGuid.PcdCacheEnable
-
-[FixedPcd]
-  gArmPlatformTokenSpaceGuid.PcdStandalone
index d4a6037..60b4007 100644 (file)
@@ -13,7 +13,7 @@
 \r
 [Defines]\r
   INF_VERSION                    = 0x00010005\r
-  BASE_NAME                      = ArmRealViewEbLib\r
+  BASE_NAME                      = ArmRealViewEbSecLib\r
   FILE_GUID                      = 6e02ebe0-1d96-11e0-b9cb-0002a5d5c51b\r
   MODULE_TYPE                    = BASE\r
   VERSION_STRING                 = 1.0\r
   ArmRealViewEbBoot.asm     | RVCT\r
   ArmRealViewEbBoot.S       | GCC\r
 \r
-[Protocols]\r
-\r
 [FeaturePcd]\r
   gEmbeddedTokenSpaceGuid.PcdCacheEnable\r
-\r
-[FixedPcd]\r
-  gArmPlatformTokenSpaceGuid.PcdStandalone\r
index 1ad0e17..bce8883 100644 (file)
@@ -1,51 +1,51 @@
-/** @file
-  Basic serial IO abstaction for GDB
-
-  Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
-  
-  This program and the accompanying materials
-  are licensed and made available under the terms and conditions of the BSD License
-  which accompanies this distribution.  The full text of the license may be found at
-  http://opensource.org/licenses/bsd-license.php
-
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include <Uefi.h>
-#include <Library/GdbSerialLib.h>
-#include <Library/PcdLib.h>
-#include <Library/IoLib.h>
-#include <Drivers/PL011Uart.h>
-
-RETURN_STATUS
-EFIAPI
-GdbSerialLibConstructor (
-  VOID
-  )
-{
-  return GdbSerialInit (115200, 0, 8, 1);
-}
-
-RETURN_STATUS
-EFIAPI
-GdbSerialInit (
-  IN UINT64     BaudRate, 
-  IN UINT8      Parity, 
-  IN UINT8      DataBits, 
-  IN UINT8      StopBits 
-  )
-{
-  if ((Parity != 0) || (DataBits != 8) || (StopBits != 1)) {
-    return RETURN_UNSUPPORTED;
-  }
-
-  if (BaudRate != 115200) {
-    // Could add support for different Baud rates....
-    return RETURN_UNSUPPORTED;
-  }
-      
+/** @file\r
+  Basic serial IO abstaction for GDB\r
+\r
+  Copyright (c) 2008 - 2009, Apple Inc. 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
+#include <Uefi.h>\r
+#include <Library/GdbSerialLib.h>\r
+#include <Library/PcdLib.h>\r
+#include <Library/IoLib.h>\r
+#include <Drivers/PL011Uart.h>\r
+\r
+RETURN_STATUS\r
+EFIAPI\r
+GdbSerialLibConstructor (\r
+  VOID\r
+  )\r
+{\r
+  return GdbSerialInit (115200, 0, 8, 1);\r
+}\r
+\r
+RETURN_STATUS\r
+EFIAPI\r
+GdbSerialInit (\r
+  IN UINT64     BaudRate, \r
+  IN UINT8      Parity, \r
+  IN UINT8      DataBits, \r
+  IN UINT8      StopBits \r
+  )\r
+{\r
+  if ((Parity != 0) || (DataBits != 8) || (StopBits != 1)) {\r
+    return RETURN_UNSUPPORTED;\r
+  }\r
+\r
+  if (BaudRate != 115200) {\r
+    // Could add support for different Baud rates....\r
+    return RETURN_UNSUPPORTED;\r
+  }\r
+      \r
   UINT32  Base = PcdGet32 (PcdGdbUartBase);\r
   \r
   // initialize baud rate generator to 115200 based on EB clock REFCLK24MHZ\r
@@ -62,14 +62,14 @@ GdbSerialInit (
   MmioWrite32 (Base + UARTCR, 0x301);\r
 \r
   return RETURN_SUCCESS;\r
-}
-
-BOOLEAN
-EFIAPI
-GdbIsCharAvailable (
-  VOID
-  )  
-{
+}\r
+\r
+BOOLEAN\r
+EFIAPI\r
+GdbIsCharAvailable (\r
+  VOID\r
+  )  \r
+{\r
   UINT32 FR = PcdGet32 (PcdGdbUartBase) + UARTFR;\r
 \r
   if ((MmioRead32 (FR) & UART_RX_EMPTY_FLAG_MASK) == 0) {\r
@@ -77,42 +77,42 @@ GdbIsCharAvailable (
   } else {\r
     return FALSE;\r
   }\r
-}
-
-CHAR8
-EFIAPI
-GdbGetChar (
-  VOID
-  )
-{
+}\r
+\r
+CHAR8\r
+EFIAPI\r
+GdbGetChar (\r
+  VOID\r
+  )\r
+{\r
   UINT32  FR = PcdGet32 (PcdGdbUartBase) + UARTFR;\r
   UINT32  DR = PcdGet32 (PcdGdbUartBase) + UARTDR;\r
     \r
   while ((MmioRead32 (FR) & UART_RX_EMPTY_FLAG_MASK) == 0);\r
   return MmioRead8 (DR);\r
-}
-
-VOID
-EFIAPI
-GdbPutChar (
-  IN  CHAR8   Char
-  )
-{
+}\r
+\r
+VOID\r
+EFIAPI\r
+GdbPutChar (\r
+  IN  CHAR8   Char\r
+  )\r
+{\r
   UINT32 FR = PcdGet32 (PcdGdbUartBase) + UARTFR;\r
   UINT32 DR = PcdGet32 (PcdGdbUartBase) + UARTDR;\r
 \r
   while ((MmioRead32 (FR) & UART_TX_EMPTY_FLAG_MASK) != 0);\r
   MmioWrite8 (DR, Char);\r
-  return;
-}
-
-VOID
-GdbPutString (
-  IN CHAR8  *String
-  )
-{
-  while (*String != '\0') {
-    GdbPutChar (*String);
-    String++;
-  }
-}
+  return;\r
+}\r
+\r
+VOID\r
+GdbPutString (\r
+  IN CHAR8  *String\r
+  )\r
+{\r
+  while (*String != '\0') {\r
+    GdbPutChar (*String);\r
+    String++;\r
+  }\r
+}\r
index fc15823..34e3d99 100644 (file)
 [LibraryClasses.common.SEC]
   ArmLib|ArmPkg/Library/ArmLib/ArmV7/ArmV7MPCoreLibSec.inf
   ArmPlatformLib|ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/ArmVExpressSecLib.inf
+  DebugSecExtraActionLib|ArmPlatformPkg/Library/DebugSecExtraActionLib/DebugSecExtraActionLib.inf
   
   PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf
   
 
   gEfiMdeModulePkgTokenSpaceGuid.PcdTurnOffUsbLegacySupport|TRUE
 
-!if $(EDK2_SKIP_PEICORE) == 1
-  gArmTokenSpaceGuid.PcdSkipPeiCore|TRUE
+!if $(EDK2_ARMVE_STANDALONE) == 1
+  gArmPlatformTokenSpaceGuid.PcdStandalone|TRUE
+!else
+  gArmPlatformTokenSpaceGuid.PcdStandalone|FALSE
+  gArmPlatformTokenSpaceGuid.PcdSystemMemoryInitializeInSec|TRUE
+  gArmPlatformTokenSpaceGuid.PcdSendSgiToBringUpSecondaryCores|TRUE
 !endif
 
+!if $(EDK2_SKIP_PEICORE) == 1
+  gArmPlatformTokenSpaceGuid.PcdSystemMemoryInitializeInSec|TRUE
+  gArmPlatformTokenSpaceGuid.PcdSendSgiToBringUpSecondaryCores|TRUE
+!endif
   
   ## If TRUE, Graphics Output Protocol will be installed on virtual handle created by ConsplitterDxe.
   #  It could be set FALSE to save size.
   gArmPlatformTokenSpaceGuid.PcdMPCoreSupport|1
   gArmTokenSpaceGuid.PcdVFPEnabled|1
   
-!if $(EDK2_ARMVE_STANDALONE) == 1
-  gArmPlatformTokenSpaceGuid.PcdStandalone|1
-!endif
-
   # Stacks for MPCores in Secure World
   gArmPlatformTokenSpaceGuid.PcdCPUCoresSecStackBase|0x49E00000            # Top of SEC Stack for Secure World
   gArmPlatformTokenSpaceGuid.PcdCPUCoreSecStackSize|0x2000                   # Stack for each of the 4 CPU cores
       ArmPlatformLib|ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/ArmVExpressLib.inf
   }
 !else
-  ArmPlatformPkg/PrePeiCore/PrePeiCoreMPCore.inf
+  ArmPlatformPkg/PrePeiCore/PrePeiCoreMPCore.inf {
+    <LibraryClasses>
+      PL390GicSecLib|ArmPkg/Drivers/PL390Gic/PL390GicNonSec.inf
+  }
   MdeModulePkg/Core/Pei/PeiMain.inf
   MdeModulePkg/Universal/PCD/Pei/Pcd.inf  {
     <LibraryClasses>
index f160622..d3867ae 100644 (file)
   CTA9x4Helper.asm   | RVCT
   CTA9x4Helper.S     | GCC
 
-[Protocols]
-
 [FeaturePcd]
   gEmbeddedTokenSpaceGuid.PcdCacheEnable
   gArmPlatformTokenSpaceGuid.PcdNorFlashRemapping
 
 [FixedPcd]
-  gArmPlatformTokenSpaceGuid.PcdStandalone
-
   gArmTokenSpaceGuid.PcdSystemMemoryBase
   gArmTokenSpaceGuid.PcdSystemMemorySize
 
index 3f08784..8674f79 100644 (file)
@@ -30,6 +30,7 @@
   ArmLib\r
   ArmTrustZoneLib\r
   ArmPlatformSysConfigLib\r
+  DebugSecExtraActionLib\r
   IoLib\r
   L2X0CacheLib\r
   PL301AxiLib\r
   CTA9x4Boot.asm     | RVCT\r
   CTA9x4Boot.S       | GCC\r
 \r
-[Protocols]\r
-\r
 [FeaturePcd]\r
   gEmbeddedTokenSpaceGuid.PcdCacheEnable\r
   gArmPlatformTokenSpaceGuid.PcdNorFlashRemapping\r
 \r
 [FixedPcd]\r
-  gArmPlatformTokenSpaceGuid.PcdStandalone\r
-\r
   gArmTokenSpaceGuid.PcdL2x0ControllerBase\r
index 1e25c1e..91550df 100644 (file)
@@ -405,7 +405,7 @@ BootMenuMain (
 \r
   BootOption              = NULL;\r
   BootMainEntryCount = sizeof(BootMainEntries) / sizeof(struct BOOT_MAIN_ENTRY);\r
-
+\r
   // Get Boot#### list\r
   BootOptionList (&BootOptionsList);\r
 \r
index ba0f852..c498125 100644 (file)
@@ -94,6 +94,19 @@ ArmPlatformSecInitialize (
   VOID
   );
 
+/**
+  Call before jumping to Normal World
+
+  This function allows the firmware platform to do extra actions before
+  jumping to the Normal World
+
+**/
+VOID
+ArmPlatformSecExtraAction (
+  IN  UINTN         CoreId,
+  OUT UINTN*        JumpAddress
+  );
+
 /**
   Initialize controllers that must setup in the normal world
 
diff --git a/ArmPlatformPkg/Library/DebugSecExtraActionLib/DebugSecExtraActionLib.c b/ArmPlatformPkg/Library/DebugSecExtraActionLib/DebugSecExtraActionLib.c
new file mode 100755 (executable)
index 0000000..2d9595f
--- /dev/null
@@ -0,0 +1,103 @@
+/** @file\r
+*\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 <PiPei.h>\r
+\r
+#include <Library/DebugLib.h>\r
+#include <Library/PcdLib.h>\r
+#include <Library/PrintLib.h>\r
+#include <Library/SerialPortLib.h>\r
+\r
+#include <Drivers/PL390Gic.h>\r
+\r
+#define ARM_PRIMARY_CORE    0\r
+\r
+// When the firmware is built as not Standalone, the secondary cores need to wait the firmware\r
+// entirely written into DRAM. It is the firmware from DRAM which will wake up the secondary cores.\r
+VOID\r
+NonSecureWaitForFirmware (\r
+  VOID\r
+  )\r
+{\r
+  VOID (*secondary_start)(VOID);\r
+\r
+  // The secondary cores will execute the firmware once wake from WFI.\r
+  secondary_start = (VOID (*)())PcdGet32(PcdNormalFvBaseAddress);\r
+\r
+  ArmCallWFI();\r
+\r
+  // Acknowledge the interrupt and send End of Interrupt signal.\r
+  PL390GicAcknowledgeSgiFrom (PcdGet32(PcdGicInterruptInterfaceBase), ARM_PRIMARY_CORE);\r
+\r
+  // Jump to secondary core entry point.\r
+  secondary_start ();\r
+\r
+  // PEI Core should always load and never return\r
+  ASSERT (FALSE);\r
+}\r
+\r
+/**\r
+  Call before jumping to Normal World\r
+\r
+  This function allows the firmware platform to do extra actions before\r
+  jumping to the Normal World\r
+\r
+**/\r
+VOID\r
+ArmPlatformSecExtraAction (\r
+  IN  UINTN         CoreId,\r
+  OUT UINTN*        JumpAddress\r
+  )\r
+{\r
+  CHAR8           Buffer[100];\r
+  UINTN           CharCount;\r
+\r
+  if (FeaturePcdGet (PcdStandalone) == FALSE) {\r
+    if (CoreId == ARM_PRIMARY_CORE) {\r
+      UINTN*   StartAddress = (UINTN*)PcdGet32(PcdNormalFvBaseAddress);\r
+\r
+      // Patch the DRAM to make an infinite loop at the start address\r
+      *StartAddress = 0xEAFFFFFE; // opcode for while(1)\r
+\r
+      CharCount = AsciiSPrint (Buffer,sizeof (Buffer),"Waiting for firmware at 0x%08X ...\n\r",StartAddress);\r
+      SerialPortWrite ((UINT8 *) Buffer, CharCount);\r
+\r
+      *JumpAddress = PcdGet32(PcdNormalFvBaseAddress);\r
+    } else {\r
+      // When the primary core is stopped by the hardware debugger to copy the firmware\r
+      // into DRAM. The secondary cores are still running. As soon as the first bytes of\r
+      // the firmware are written into DRAM, the secondary cores will start to execute the\r
+      // code even if the firmware is not entirely written into the memory.\r
+      // That's why the secondary cores need to be parked in WFI and wake up once the\r
+      // firmware is ready.\r
+\r
+      *JumpAddress = (UINTN)NonSecureWaitForFirmware;\r
+    }\r
+  } else if (FeaturePcdGet (PcdSystemMemoryInitializeInSec)) {\r
+    if (CoreId == ARM_PRIMARY_CORE) {\r
+      // Signal the secondary cores they can jump to PEI phase\r
+      PL390GicSendSgiTo (PcdGet32(PcdGicDistributorBase), GIC_ICDSGIR_FILTER_EVERYONEELSE, 0x0E);\r
+\r
+      // To enter into Non Secure state, we need to make a return from exception\r
+      *JumpAddress = PcdGet32(PcdNormalFvBaseAddress);\r
+    } else {\r
+      // We wait for the primary core to finish to initialize the System Memory. Otherwise the secondary\r
+      // cores would make crash the system by setting their stacks in DRAM before the primary core has not\r
+      // finished to initialize the system memory.\r
+      *JumpAddress = (UINTN)NonSecureWaitForFirmware;\r
+    }\r
+  } else {\r
+    *JumpAddress = PcdGet32(PcdNormalFvBaseAddress);\r
+  }\r
+}\r
diff --git a/ArmPlatformPkg/Library/DebugSecExtraActionLib/DebugSecExtraActionLib.inf b/ArmPlatformPkg/Library/DebugSecExtraActionLib/DebugSecExtraActionLib.inf
new file mode 100755 (executable)
index 0000000..4b5df28
--- /dev/null
@@ -0,0 +1,51 @@
+#/* @file
+#  Copyright (c) 2011, ARM Limited. All rights reserved.
+#  
+#  This program and the accompanying materials                          
+#  are licensed and made available under the terms and conditions of the BSD License         
+#  which accompanies this distribution.  The full text of the license may be found at        
+#  http://opensource.org/licenses/bsd-license.php                                            
+#
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
+#
+#*/
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = DebugSecExtraActionLib
+  FILE_GUID                      = 8fff7a60-a6f8-11e0-990a-0002a5d5c51b
+  MODULE_TYPE                    = BASE
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = DebugSecExtraActionLib
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+#  VALID_ARCHITECTURES           = ARM
+#
+
+[Sources.common]
+  DebugSecExtraActionLib.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+  ArmPkg/ArmPkg.dec
+  ArmPlatformPkg/ArmPlatformPkg.dec
+
+[LibraryClasses]
+  DebugLib
+  PcdLib
+  PL390GicSecLib
+  PrintLib
+  SerialPortLib
+
+[FeaturePcd]
+  gArmPlatformTokenSpaceGuid.PcdStandalone
+  gArmPlatformTokenSpaceGuid.PcdSystemMemoryInitializeInSec
+
+[FixedPcd]
+  gArmTokenSpaceGuid.PcdNormalFvBaseAddress
+  
+  gArmTokenSpaceGuid.PcdGicDistributorBase
+  gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase
index 159a4d0..abce21d 100644 (file)
-//
-//  Copyright (c) 2011, ARM Limited. All rights reserved.
-//  
-# This program and the accompanying materials                          
-#  are licensed and made available under the terms and conditions of the BSD License         
-#  which accompanies this distribution.  The full text of the license may be found at        
-#  http://opensource.org/licenses/bsd-license.php
-#
-#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
-#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
-#
-#
-
-#include <AsmMacroIoLib.h>
-#include <Base.h>
-#include <AutoGen.h>
-
-#start of the code section
-.text
+//\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 <AutoGen.h>\r
+\r
+#start of the code section\r
+.text\r
 .align 5\r
 \r
-# IMPORT
-GCC_ASM_IMPORT(PeiCommonExceptionEntry)
-
-# EXPORT
-GCC_ASM_EXPORT(PeiVectorTable)
+# IMPORT\r
+GCC_ASM_IMPORT(PeiCommonExceptionEntry)\r
+\r
+# EXPORT\r
+GCC_ASM_EXPORT(PeiVectorTable)\r
+\r
+//============================================================\r
+//Default Exception Handlers\r
+//============================================================\r
+  \r
+  \r
+ASM_PFX(PeiVectorTable):\r
+  b _DefaultResetHandler\r
+  b _DefaultUndefined\r
+  b _DefaultSWI\r
+  b _DefaultPrefetchAbort\r
+  b _DefaultDataAbort\r
+  b _DefaultReserved\r
+  b _DefaultIrq\r
+  b _DefaultFiq\r
+\r
+//\r
+// Default Exception handlers: There is no plan to return from any of these exceptions.\r
+// No context saving at all.\r
+//\r
+_DefaultResetHandler:\r
+  mov  r1, lr\r
+  # Switch to SVC for common stack\r
+  cps  #0x13\r
+  mov  r0, #0\r
+  blx  ASM_PFX(PeiCommonExceptionEntry)\r
+\r
+_DefaultUndefined:\r
+  sub  r1, LR, #4\r
+  # Switch to SVC for common stack\r
+  cps  #0x13\r
+  mov  r0, #1\r
+  blx  ASM_PFX(PeiCommonExceptionEntry)\r
+\r
+_DefaultSWI:\r
+  sub  r1, LR, #4\r
+  # Switch to SVC for common stack\r
+  cps  #0x13\r
+  mov  r0, #2\r
+  blx  ASM_PFX(PeiCommonExceptionEntry)\r
+\r
+_DefaultPrefetchAbort:\r
+  sub  r1, LR, #4\r
+  # Switch to SVC for common stack\r
+  cps  #0x13\r
+  mov  r0, #3\r
+  blx  ASM_PFX(PeiCommonExceptionEntry)\r
+\r
+_DefaultDataAbort:\r
+  sub  r1, LR, #8\r
+  # Switch to SVC for common stack\r
+  cps  #0x13\r
+  mov  r0, #4\r
+  blx  ASM_PFX(PeiCommonExceptionEntry)\r
+\r
+_DefaultReserved:\r
+  mov  r1, lr\r
+  # Switch to SVC for common stack\r
+  cps  #0x13\r
+  mov  r0, #5\r
+  blx  ASM_PFX(PeiCommonExceptionEntry)\r
+\r
+_DefaultIrq:\r
+  sub  r1, LR, #4\r
+  # Switch to SVC for common stack\r
+  cps  #0x13\r
+  mov  r0, #6\r
+  blx  ASM_PFX(PeiCommonExceptionEntry)\r
 \r
-//============================================================
-//Default Exception Handlers
-//============================================================
-  
-  
-ASM_PFX(PeiVectorTable):
-  b _DefaultResetHandler
-  b _DefaultUndefined
-  b _DefaultSWI
-  b _DefaultPrefetchAbort
-  b _DefaultDataAbort
-  b _DefaultReserved
-  b _DefaultIrq
-  b _DefaultFiq
-
-//
-// Default Exception handlers: There is no plan to return from any of these exceptions.
-// No context saving at all.
-//
-_DefaultResetHandler:
-  mov  r1, lr
-  # Switch to SVC for common stack
-  cps  #0x13
-  mov  r0, #0
-  blx  ASM_PFX(PeiCommonExceptionEntry)
-
-_DefaultUndefined:
-  sub  r1, LR, #4
-  # Switch to SVC for common stack
-  cps  #0x13
-  mov  r0, #1
-  blx  ASM_PFX(PeiCommonExceptionEntry)
-
-_DefaultSWI:
-  sub  r1, LR, #4
-  # Switch to SVC for common stack
-  cps  #0x13
-  mov  r0, #2
-  blx  ASM_PFX(PeiCommonExceptionEntry)
-
-_DefaultPrefetchAbort:
-  sub  r1, LR, #4
-  # Switch to SVC for common stack
-  cps  #0x13
-  mov  r0, #3
-  blx  ASM_PFX(PeiCommonExceptionEntry)
-
-_DefaultDataAbort:
-  sub  r1, LR, #8
-  # Switch to SVC for common stack
-  cps  #0x13
-  mov  r0, #4
-  blx  ASM_PFX(PeiCommonExceptionEntry)
-
-_DefaultReserved:
-  mov  r1, lr
-  # Switch to SVC for common stack
-  cps  #0x13
-  mov  r0, #5
-  blx  ASM_PFX(PeiCommonExceptionEntry)
-
-_DefaultIrq:
-  sub  r1, LR, #4
-  # Switch to SVC for common stack
-  cps  #0x13
-  mov  r0, #6
-  blx  ASM_PFX(PeiCommonExceptionEntry)
-
-_DefaultFiq:
-  sub  r1, LR, #4
-  # Switch to SVC for common stack
-  cps  #0x13
-  mov  r0, #7
-  blx  ASM_PFX(PeiCommonExceptionEntry)
+_DefaultFiq:\r
+  sub  r1, LR, #4\r
+  # Switch to SVC for common stack\r
+  cps  #0x13\r
+  mov  r0, #7\r
+  blx  ASM_PFX(PeiCommonExceptionEntry)\r
 \r
index 16e0d9d..55bd4af 100644 (file)
   PRESERVE8\r
   AREA    PrePeiCoreException, CODE, READONLY, CODEALIGN, ALIGN=5\r
 \r
-//============================================================
-//Default Exception Handlers
-//============================================================
-  
-  
-PeiVectorTable
-  b _DefaultResetHandler
-  b _DefaultUndefined
-  b _DefaultSWI
-  b _DefaultPrefetchAbort
-  b _DefaultDataAbort
-  b _DefaultReserved
-  b _DefaultIrq
-  b _DefaultFiq
-
+//============================================================\r
+//Default Exception Handlers\r
+//============================================================\r
+  \r
+  \r
+PeiVectorTable\r
+  b _DefaultResetHandler\r
+  b _DefaultUndefined\r
+  b _DefaultSWI\r
+  b _DefaultPrefetchAbort\r
+  b _DefaultDataAbort\r
+  b _DefaultReserved\r
+  b _DefaultIrq\r
+  b _DefaultFiq\r
+\r
 //\r
 // Default Exception handlers: There is no plan to return from any of these exceptions.\r
-// No context saving at all.
+// No context saving at all.\r
 //\r
-_DefaultResetHandler
+_DefaultResetHandler\r
    mov  r1, lr\r
-   cps       #0x13                     ; Switch to SVC for common stack
-   mov  r0, #0
-   blx   PeiCommonExceptionEntry
-
-_DefaultUndefined
+   cps       #0x13                     ; Switch to SVC for common stack\r
+   mov  r0, #0\r
+   blx   PeiCommonExceptionEntry\r
+\r
+_DefaultUndefined\r
    sub  r1, LR, #4\r
-   cps       #0x13                     ; Switch to SVC for common stack
-   mov  r0, #1
-   blx   PeiCommonExceptionEntry
-
-_DefaultSWI
+   cps       #0x13                     ; Switch to SVC for common stack\r
+   mov  r0, #1\r
+   blx   PeiCommonExceptionEntry\r
+\r
+_DefaultSWI\r
    sub  r1, LR, #4\r
-   cps       #0x13                     ; Switch to SVC for common stack
-   mov  r0, #2
-   blx   PeiCommonExceptionEntry
-
-_DefaultPrefetchAbort
+   cps       #0x13                     ; Switch to SVC for common stack\r
+   mov  r0, #2\r
+   blx   PeiCommonExceptionEntry\r
+\r
+_DefaultPrefetchAbort\r
    sub  r1, LR, #4\r
-   cps       #0x13                     ; Switch to SVC for common stack
-   mov  r0, #3
-   blx   PeiCommonExceptionEntry
-
-_DefaultDataAbort
+   cps       #0x13                     ; Switch to SVC for common stack\r
+   mov  r0, #3\r
+   blx   PeiCommonExceptionEntry\r
+\r
+_DefaultDataAbort\r
    sub  r1, LR, #8\r
-   cps       #0x13                     ; Switch to SVC for common stack
-   mov  r0, #4
-   blx   PeiCommonExceptionEntry
-
-_DefaultReserved
+   cps       #0x13                     ; Switch to SVC for common stack\r
+   mov  r0, #4\r
+   blx   PeiCommonExceptionEntry\r
+\r
+_DefaultReserved\r
    mov  r1, lr\r
-   cps       #0x13                     ; Switch to SVC for common stack
-   mov  r0, #5
-   blx   PeiCommonExceptionEntry
-   
-_DefaultIrq
+   cps       #0x13                     ; Switch to SVC for common stack\r
+   mov  r0, #5\r
+   blx   PeiCommonExceptionEntry\r
+   \r
+_DefaultIrq\r
    sub  r1, LR, #4\r
-   cps       #0x13                     ; Switch to SVC for common stack
-   mov  r0, #6
-   blx   PeiCommonExceptionEntry
-
-_DefaultFiq
+   cps       #0x13                     ; Switch to SVC for common stack\r
+   mov  r0, #6\r
+   blx   PeiCommonExceptionEntry\r
+\r
+_DefaultFiq\r
    sub  r1, LR, #4\r
-   cps       #0x13                     ; Switch to SVC for common stack
-   mov  r0, #7
-   blx   PeiCommonExceptionEntry
+   cps       #0x13                     ; Switch to SVC for common stack\r
+   mov  r0, #7\r
+   blx   PeiCommonExceptionEntry\r
 \r
   END\r
index 17a0002..35c4154 100644 (file)
@@ -69,7 +69,7 @@ PrimaryMain (
   PL390GicEnableDistributor(PcdGet32(PcdGicDistributorBase));\r
 \r
   // If ArmVe has not been built as Standalone then we need to wake up the secondary cores\r
-  if (!PcdGet32(PcdStandalone)) {\r
+  if (FeaturePcdGet(PcdSendSgiToBringUpSecondaryCores)) {\r
     // Sending SGI to all the Secondary CPU interfaces\r
     PL390GicSendSgiTo (PcdGet32(PcdGicDistributorBase), GIC_ICDSGIR_FILTER_EVERYONEELSE, 0x0E);\r
   }\r
index ccf0e7d..0b7f973 100644 (file)
@@ -16,6 +16,7 @@
 #include <Library/IoLib.h>\r
 #include <Library/BaseLib.h>\r
 #include <Library/BaseMemoryLib.h>\r
+#include <Library/DebugAgentLib.h>\r
 #include <Library/PrintLib.h>\r
 #include <Library/ArmLib.h>\r
 #include <Library/SerialPortLib.h>\r
@@ -62,7 +63,11 @@ CEntryPoint (
 \r
   //If not primary Jump to Secondary Main\r
   if(0 == CoreId) {\r
-    //Goto primary Main.\r
+    // Initialize the Debug Agent for Source Level Debugging\r
+    InitializeDebugAgent (DEBUG_AGENT_INIT_POSTMEM_SEC, NULL, NULL);\r
+    SaveAndSetDebugTimerInterrupt (TRUE);\r
+\r
+    // Goto primary Main.\r
     PrimaryMain (PeiCoreEntryPoint);\r
   } else {\r
     SecondaryMain (CoreId);\r
index bcde6c4..8c25544 100644 (file)
@@ -42,6 +42,7 @@
   ArmMPCoreMailBoxLib\r
   BaseLib\r
   DebugLib\r
+  DebugAgentLib\r
   IoLib\r
   PL390GicNonSecLib\r
   PrintLib\r
 [Ppis]\r
   gEfiTemporaryRamSupportPpiGuid\r
 \r
-[FixedPcd]\r
-  gArmPlatformTokenSpaceGuid.PcdStandalone\r
+[FeaturePcd]\r
+  gArmPlatformTokenSpaceGuid.PcdSendSgiToBringUpSecondaryCores\r
 \r
+[FixedPcd]\r
   gArmTokenSpaceGuid.PcdNormalFvBaseAddress\r
   gArmTokenSpaceGuid.PcdNormalFvSize\r
 \r
index 5b0886d..f37bcb0 100644 (file)
   ArmPlatformLib\r
   BaseLib\r
   DebugLib\r
+  DebugAgentLib\r
   IoLib\r
   PrintLib\r
-  SerialPortLib\r
 \r
 [Ppis]\r
   gEfiTemporaryRamSupportPpiGuid\r
 \r
-[FixedPcd]\r
-  gArmPlatformTokenSpaceGuid.PcdStandalone\r
+[FeaturePcd]\r
+  gArmPlatformTokenSpaceGuid.PcdSendSgiToBringUpSecondaryCores\r
 \r
+[FixedPcd]\r
   gArmTokenSpaceGuid.PcdNormalFvBaseAddress\r
   gArmTokenSpaceGuid.PcdNormalFvSize\r
 \r
index 256fcaf..c7d18d4 100755 (executable)
@@ -59,9 +59,9 @@
 [FeaturePcd]  
   gEmbeddedTokenSpaceGuid.PcdCacheEnable
   gEmbeddedTokenSpaceGuid.PcdPrePiProduceMemoryTypeInformationHob
+  gArmPlatformTokenSpaceGuid.PcdSendSgiToBringUpSecondaryCores
 
 [FixedPcd]
-  gArmPlatformTokenSpaceGuid.PcdStandalone
   gArmTokenSpaceGuid.PcdVFPEnabled
 
   gArmTokenSpaceGuid.PcdNormalFdBaseAddress
index c28fe3c..3af2655 100755 (executable)
@@ -57,9 +57,9 @@
 [FeaturePcd]  
   gEmbeddedTokenSpaceGuid.PcdCacheEnable
   gEmbeddedTokenSpaceGuid.PcdPrePiProduceMemoryTypeInformationHob
+  gArmPlatformTokenSpaceGuid.PcdSendSgiToBringUpSecondaryCores
 
 [FixedPcd]
-  gArmPlatformTokenSpaceGuid.PcdStandalone
   gArmTokenSpaceGuid.PcdVFPEnabled
 
   gArmTokenSpaceGuid.PcdNormalFdBaseAddress
index ef8629a..cf3825b 100644 (file)
   PRESERVE8\r
   AREA    SecException, CODE, READONLY, CODEALIGN, ALIGN=5\r
 \r
-//============================================================
-//Default Exception Handlers
-//============================================================
-  
-  
-SecVectorTable
-  b _DefaultResetHandler
-  b _DefaultUndefined
-  b _DefaultSWI
-  b _DefaultPrefetchAbort
-  b _DefaultDataAbort
-  b _DefaultReserved
-  b _DefaultIrq
-  b _DefaultFiq
+//============================================================\r
+//Default Exception Handlers\r
+//============================================================\r
+  \r
+  \r
+SecVectorTable\r
+  b _DefaultResetHandler\r
+  b _DefaultUndefined\r
+  b _DefaultSWI\r
+  b _DefaultPrefetchAbort\r
+  b _DefaultDataAbort\r
+  b _DefaultReserved\r
+  b _DefaultIrq\r
+  b _DefaultFiq\r
 \r
-//
+//\r
 // Default Exception handlers: There is no plan to return from any of these exceptions.\r
 // No context saving at all.\r
-//
-_DefaultResetHandler
+//\r
+_DefaultResetHandler\r
    mov  r1, lr\r
-   cps       #0x13                     ; Switch to SVC for common stack
-   mov  r0, #0
-   blx   SecCommonExceptionEntry
-
-_DefaultUndefined
+   cps       #0x13                     ; Switch to SVC for common stack\r
+   mov  r0, #0\r
+   blx   SecCommonExceptionEntry\r
+\r
+_DefaultUndefined\r
    sub  r1, LR\r
-   cps       #0x13                     ; Switch to SVC for common stack
-   mov  r0, #1
-   blx   SecCommonExceptionEntry
-
-_DefaultSWI
+   cps       #0x13                     ; Switch to SVC for common stack\r
+   mov  r0, #1\r
+   blx   SecCommonExceptionEntry\r
+\r
+_DefaultSWI\r
    sub  r1, LR, #4\r
-   cps       #0x13                     ; Switch to SVC for common stack
-   mov  r0, #2
-   blx   SecCommonExceptionEntry
-
-_DefaultPrefetchAbort
+   cps       #0x13                     ; Switch to SVC for common stack\r
+   mov  r0, #2\r
+   blx   SecCommonExceptionEntry\r
+\r
+_DefaultPrefetchAbort\r
    sub  r1, LR, #4\r
-   cps       #0x13                     ; Switch to SVC for common stack
-   mov  r0, #3
-   blx   SecCommonExceptionEntry
-
-_DefaultDataAbort
+   cps       #0x13                     ; Switch to SVC for common stack\r
+   mov  r0, #3\r
+   blx   SecCommonExceptionEntry\r
+\r
+_DefaultDataAbort\r
    sub  r1, LR, #8\r
-   cps       #0x13                     ; Switch to SVC for common stack
-   mov  r0, #4
-   blx   SecCommonExceptionEntry
-
-_DefaultReserved
+   cps       #0x13                     ; Switch to SVC for common stack\r
+   mov  r0, #4\r
+   blx   SecCommonExceptionEntry\r
+\r
+_DefaultReserved\r
    mov  r1, lr\r
-   cps       #0x13                     ; Switch to SVC for common stack
-   mov  r0, #5
-   blx   SecCommonExceptionEntry
-   
-_DefaultIrq
+   cps       #0x13                     ; Switch to SVC for common stack\r
+   mov  r0, #5\r
+   blx   SecCommonExceptionEntry\r
+   \r
+_DefaultIrq\r
    sub  r1, LR, #4\r
-   cps       #0x13                     ; Switch to SVC for common stack
-   mov  r0, #6
-   blx   SecCommonExceptionEntry
-
-_DefaultFiq
+   cps       #0x13                     ; Switch to SVC for common stack\r
+   mov  r0, #6\r
+   blx   SecCommonExceptionEntry\r
+\r
+_DefaultFiq\r
    sub  r1, LR, #4\r
-   cps       #0x13                     ; Switch to SVC for common stack
-   mov  r0, #7
-   blx   SecCommonExceptionEntry
+   cps       #0x13                     ; Switch to SVC for common stack\r
+   mov  r0, #7\r
+   blx   SecCommonExceptionEntry\r
 \r
   END\r
index 8ddc654..42df66e 100644 (file)
@@ -14,6 +14,7 @@
 **/
 
 #include <Library/DebugLib.h>
+#include <Library/DebugAgentLib.h>
 #include <Library/PcdLib.h>
 #include <Library/PrintLib.h>
 #include <Library/BaseLib.h>
@@ -70,6 +71,7 @@ CEntryPoint (
 {
   CHAR8           Buffer[100];
   UINTN           CharCount;
+  UINTN           JumpAddress;
 
   // Primary CPU clears out the SCU tag RAMs, secondaries wait
   if (CoreId == ARM_PRIMARY_CORE) {
@@ -85,6 +87,10 @@ CEntryPoint (
     CharCount = AsciiSPrint (Buffer,sizeof (Buffer),"UEFI firmware built at %a on %a\n\r",__TIME__, __DATE__);
     SerialPortWrite ((UINT8 *) Buffer, CharCount);
 
+    // Initialize the Debug Agent for Source Level Debugging
+    InitializeDebugAgent (DEBUG_AGENT_INIT_PREMEM_SEC, NULL, NULL);
+    SaveAndSetDebugTimerInterrupt (TRUE);
+
     // Now we've got UART, make the check:
     // - The Vector table must be 32-byte aligned
     ASSERT(((UINT32)SecVectorTable & ((1 << 5)-1)) == 0);
@@ -119,7 +125,7 @@ CEntryPoint (
 
     // If we skip the PEI Core we could want to initialize the DRAM in the SEC phase.
     // If we are in standalone, we need the initialization to copy the UEFI firmware into DRAM
-    if (FeaturePcdGet(PcdSkipPeiCore) || !PcdGet32(PcdStandalone)) {
+    if (FeaturePcdGet(PcdSystemMemoryInitializeInSec)) {
       // Initialize system memory (DRAM)
       ArmPlatformInitializeSystemMemory ();
     }
@@ -155,7 +161,7 @@ CEntryPoint (
       //
 
       PL390GicEnableDistributor (PcdGet32(PcdGicDistributorBase));
-      PL390GicEnableInterruptInterface(PcdGet32(PcdGicInterruptInterfaceBase));
+      PL390GicEnableInterruptInterface (PcdGet32(PcdGicInterruptInterfaceBase));
 
       // Send SGI to all Secondary core to wake them up from WFI state.
       PL390GicSendSgiTo (PcdGet32(PcdGicDistributorBase), GIC_ICDSGIR_FILTER_EVERYONEELSE, 0x0E);
@@ -170,11 +176,11 @@ CEntryPoint (
       ArmCallWFI();
 
       // Acknowledge the interrupt and send End of Interrupt signal.
-      PL390GicAcknowledgeSgiFrom(PcdGet32(PcdGicInterruptInterfaceBase), ARM_PRIMARY_CORE);
+      PL390GicAcknowledgeSgiFrom (PcdGet32(PcdGicInterruptInterfaceBase), ARM_PRIMARY_CORE);
     }
 
     // Transfer the interrupt to Non-secure World
-    PL390GicSetupNonSecure(PcdGet32(PcdGicDistributorBase),PcdGet32(PcdGicInterruptInterfaceBase));
+    PL390GicSetupNonSecure (PcdGet32(PcdGicDistributorBase),PcdGet32(PcdGicInterruptInterfaceBase));
 
     // Write to CP15 Non-secure Access Control Register :
     //   - Enable CP10 and CP11 accesses in NS World
@@ -195,84 +201,24 @@ CEntryPoint (
     if (CoreId == ARM_PRIMARY_CORE) {
       PL390GicEnableDistributor (PcdGet32(PcdGicDistributorBase));
     }
-    PL390GicEnableInterruptInterface(PcdGet32(PcdGicInterruptInterfaceBase));
+    PL390GicEnableInterruptInterface (PcdGet32(PcdGicInterruptInterfaceBase));
 
     // With Trustzone support the transition from Sec to Normal world is done by return_from_exception().
     // If we want to keep this function call we need to ensure the SVC's SPSR point to the same Program
     // Status Register as the the current one (CPSR).
-    copy_cpsr_into_spsr();
+    copy_cpsr_into_spsr ();
   }
 
-  // If ArmVe has not been built as Standalone then we need to patch the DRAM to add an infinite loop at the start address
-  if (!PcdGet32(PcdStandalone)) {
-    if (CoreId == ARM_PRIMARY_CORE) {
-      UINTN*   StartAddress = (UINTN*)PcdGet32(PcdNormalFvBaseAddress);
-
-      // Patch the DRAM to make an infinite loop at the start address
-      *StartAddress = 0xEAFFFFFE; // opcode for while(1)
-
-      CharCount = AsciiSPrint (Buffer,sizeof (Buffer),"Waiting for firmware at 0x%08X ...\n\r",StartAddress);
-      SerialPortWrite ((UINT8 *) Buffer, CharCount);
-
-      // To enter into Non Secure state, we need to make a return from exception
-      return_from_exception(PcdGet32(PcdNormalFvBaseAddress));
-    } else {
-      // When the primary core is stopped by the hardware debugger to copy the firmware
-      // into DRAM. The secondary cores are still running. As soon as the first bytes of
-      // the firmware are written into DRAM, the secondary cores will start to execute the
-      // code even if the firmware is not entirely written into the memory.
-      // That's why the secondary cores need to be parked in WFI and wake up once the
-      // firmware is ready.
-
-      // Enter Secondary Cores into non Secure State. To enter into Non Secure state, we need to make a return from exception
-      return_from_exception((UINTN)NonSecureWaitForFirmware);
-    }
-  } else if (FeaturePcdGet(PcdSkipPeiCore)) {
-    if (CoreId == ARM_PRIMARY_CORE) {
-      // Signal the secondary cores they can jump to PEI phase
-      PL390GicSendSgiTo (PcdGet32(PcdGicDistributorBase), GIC_ICDSGIR_FILTER_EVERYONEELSE, 0x0E);
+  JumpAddress = PcdGet32 (PcdNormalFvBaseAddress);
+  ArmPlatformSecExtraAction (CoreId, &JumpAddress);
 
-      // To enter into Non Secure state, we need to make a return from exception
-      return_from_exception(PcdGet32(PcdNormalFvBaseAddress));
-    } else {
-      // We wait for the primary core to finish to initialize the System Memory. When we skip PEI Core, we could set the stack in DRAM
-      // Without this synchronization the secondary cores will complete the SEC before the primary core has finished to intitialize the DRAM.
-      return_from_exception((UINTN)NonSecureWaitForFirmware);
-    }
-  } else {
-    // To enter into Non Secure state, we need to make a return from exception
-    return_from_exception(PcdGet32(PcdNormalFvBaseAddress));
-  }
+  return_from_exception (JumpAddress);
   //-------------------- Non Secure Mode ---------------------
 
   // PEI Core should always load and never return
   ASSERT (FALSE);
 }
 
-// When the firmware is built as not Standalone, the secondary cores need to wait the firmware
-// entirely written into DRAM. It is the firmware from DRAM which will wake up the secondary cores.
-VOID
-NonSecureWaitForFirmware (
-  VOID
-  )
-{
-  VOID (*secondary_start)(VOID);
-
-  // The secondary cores will execute the firmware once wake from WFI.
-  secondary_start = (VOID (*)())PcdGet32(PcdNormalFvBaseAddress);
-
-  ArmCallWFI();
-
-  // Acknowledge the interrupt and send End of Interrupt signal.
-  PL390GicAcknowledgeSgiFrom(PcdGet32(PcdGicInterruptInterfaceBase),ARM_PRIMARY_CORE);
-
-  // Jump to secondary core entry point.
-  secondary_start();
-
-  // PEI Core should always load and never return
-  ASSERT (FALSE);
-}
-
 VOID
 SecCommonExceptionEntry (
   IN UINT32 Entry,
index 974c31a..23dee11 100644 (file)
   ArmPlatformLib
   BaseLib
   DebugLib
+  DebugAgentLib
   IoLib
   PL390GicSecLib
   PrintLib
   SerialPortLib
   
 [FeaturePcd]
-  gArmTokenSpaceGuid.PcdSkipPeiCore
+  gArmPlatformTokenSpaceGuid.PcdSystemMemoryInitializeInSec
   
 [FixedPcd]
-  gArmPlatformTokenSpaceGuid.PcdStandalone
   gArmTokenSpaceGuid.PcdVFPEnabled
   gArmPlatformTokenSpaceGuid.PcdMPCoreSupport
   
index 3fd688b..5c00122 100644 (file)
@@ -1,20 +1,20 @@
-/** @file
-*
-*  Copyright (c) 2011, ARM Limited. All rights reserved.
-*  
-*  This program and the accompanying materials                          
-*  are licensed and made available under the terms and conditions of the BSD License         
-*  which accompanies this distribution.  The full text of the license may be found at        
-*  http://opensource.org/licenses/bsd-license.php                                            
-*
-*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
-*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
-*
-**/
+/** @file\r
+*\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 "Ebl.h"\r
-
-#include <Guid/GlobalVariable.h>
+\r
+#include <Guid/GlobalVariable.h>\r
 \r
 EFI_STATUS\r
 EblGetCmd (\r
@@ -23,55 +23,55 @@ EblGetCmd (
   )\r
 {\r
   EFI_STATUS        Status = EFI_INVALID_PARAMETER;\r
-  UINTN       Size;
-  VOID*       Value;
-  CHAR8*      AsciiVariableName = NULL;
-  CHAR16*     VariableName;
-  UINT32      Index;
-
-  if (Argc == 1) {
-    AsciiPrint("Variable name is missing.\n");
-    return Status;
-  }
-
-  for (Index = 1; Index < Argc; Index++) {
-    if (Argv[Index][0] == '-') {
-      AsciiPrint("Warning: '%a' not recognized.\n",Argv[Index]);
-    } else {
-      AsciiVariableName = Argv[Index];
-    }
-  }
-
-  if (AsciiVariableName == NULL) {
-    AsciiPrint("Variable name is missing.\n");
-    return Status;
-  } else {
-    VariableName = AllocatePool((AsciiStrLen (AsciiVariableName) + 1) * sizeof (CHAR16));
-    AsciiStrToUnicodeStr (AsciiVariableName,VariableName);
-  }
-
-  // Try to get the variable size.
-  Value = NULL;
-  Size = 0;
-  Status = gRT->GetVariable (VariableName, &gEfiGlobalVariableGuid, NULL, &Size, Value);
-  if (Status == EFI_NOT_FOUND) {
-    AsciiPrint("Variable name '%s' not found.\n",VariableName);
-  } else if (Status == EFI_BUFFER_TOO_SMALL) {
-    // Get the environment variable value
-    Value = AllocatePool (Size);
-    if (Value == NULL) {
-      return EFI_OUT_OF_RESOURCES;
-    }
-
-    Status = gRT->GetVariable ((CHAR16 *)VariableName, &gEfiGlobalVariableGuid, NULL, &Size, Value);
-    if (EFI_ERROR (Status)) {
-      AsciiPrint("Error: '%r'\n",Status);
-    } else {
-      AsciiPrint("%a=%a\n",AsciiVariableName,Value);
-    }
-    FreePool(Value);
-  } else {
-    AsciiPrint("Error: '%r'\n",Status);
+  UINTN       Size;\r
+  VOID*       Value;\r
+  CHAR8*      AsciiVariableName = NULL;\r
+  CHAR16*     VariableName;\r
+  UINT32      Index;\r
+\r
+  if (Argc == 1) {\r
+    AsciiPrint("Variable name is missing.\n");\r
+    return Status;\r
+  }\r
+\r
+  for (Index = 1; Index < Argc; Index++) {\r
+    if (Argv[Index][0] == '-') {\r
+      AsciiPrint("Warning: '%a' not recognized.\n",Argv[Index]);\r
+    } else {\r
+      AsciiVariableName = Argv[Index];\r
+    }\r
+  }\r
+\r
+  if (AsciiVariableName == NULL) {\r
+    AsciiPrint("Variable name is missing.\n");\r
+    return Status;\r
+  } else {\r
+    VariableName = AllocatePool((AsciiStrLen (AsciiVariableName) + 1) * sizeof (CHAR16));\r
+    AsciiStrToUnicodeStr (AsciiVariableName,VariableName);\r
+  }\r
+\r
+  // Try to get the variable size.\r
+  Value = NULL;\r
+  Size = 0;\r
+  Status = gRT->GetVariable (VariableName, &gEfiGlobalVariableGuid, NULL, &Size, Value);\r
+  if (Status == EFI_NOT_FOUND) {\r
+    AsciiPrint("Variable name '%s' not found.\n",VariableName);\r
+  } else if (Status == EFI_BUFFER_TOO_SMALL) {\r
+    // Get the environment variable value\r
+    Value = AllocatePool (Size);\r
+    if (Value == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+\r
+    Status = gRT->GetVariable ((CHAR16 *)VariableName, &gEfiGlobalVariableGuid, NULL, &Size, Value);\r
+    if (EFI_ERROR (Status)) {\r
+      AsciiPrint("Error: '%r'\n",Status);\r
+    } else {\r
+      AsciiPrint("%a=%a\n",AsciiVariableName,Value);\r
+    }\r
+    FreePool(Value);\r
+  } else {\r
+    AsciiPrint("Error: '%r'\n",Status);\r
   }\r
 \r
   FreePool(VariableName);\r
@@ -85,60 +85,60 @@ EblSetCmd (
   )\r
 {\r
   EFI_STATUS    Status = EFI_INVALID_PARAMETER;\r
-  CHAR8*        AsciiVariableSetting = NULL;
-  CHAR8*        AsciiVariableName;
-  CHAR8*        AsciiValue;
-  UINT32        AsciiValueLength;
-  CHAR16*       VariableName;
+  CHAR8*        AsciiVariableSetting = NULL;\r
+  CHAR8*        AsciiVariableName;\r
+  CHAR8*        AsciiValue;\r
+  UINT32        AsciiValueLength;\r
+  CHAR16*       VariableName;\r
   UINT32        Index;\r
   UINT32        EscapedQuotes = 0;\r
   BOOLEAN       Volatile = FALSE;\r
 \r
-  if (Argc == 1) {
-    AsciiPrint("Variable name is missing.\n");
-    return Status;
-  }
-
-  for (Index = 1; Index < Argc; Index++) {
-    if (AsciiStrCmp(Argv[Index],"-v") == 0) {
-      Volatile = 0;
-    } else if (Argv[Index][0] == '-') {
-      AsciiPrint("Warning: '%a' not recognized.\n",Argv[Index]);
-    } else {
-      AsciiVariableSetting = Argv[Index];
-    }
-  }
-
-  if (AsciiVariableSetting == NULL) {
-    AsciiPrint("Variable name is missing.\n");
-    return Status;
-  }
-  
-  // Check if it is a valid variable setting
+  if (Argc == 1) {\r
+    AsciiPrint("Variable name is missing.\n");\r
+    return Status;\r
+  }\r
+\r
+  for (Index = 1; Index < Argc; Index++) {\r
+    if (AsciiStrCmp(Argv[Index],"-v") == 0) {\r
+      Volatile = 0;\r
+    } else if (Argv[Index][0] == '-') {\r
+      AsciiPrint("Warning: '%a' not recognized.\n",Argv[Index]);\r
+    } else {\r
+      AsciiVariableSetting = Argv[Index];\r
+    }\r
+  }\r
+\r
+  if (AsciiVariableSetting == NULL) {\r
+    AsciiPrint("Variable name is missing.\n");\r
+    return Status;\r
+  }\r
+  \r
+  // Check if it is a valid variable setting\r
   AsciiValue = AsciiStrStr (AsciiVariableSetting,"=");\r
-  if (AsciiValue == NULL) {
-    //
-    // There is no value. It means this variable will be deleted
-    //
-
-    // Convert VariableName into Unicode
-    VariableName = AllocatePool((AsciiStrLen (AsciiVariableSetting) + 1) * sizeof (CHAR16));
-    AsciiStrToUnicodeStr (AsciiVariableSetting,VariableName);
-
-    Status = gRT->SetVariable (
-                          VariableName,
-                          &gEfiGlobalVariableGuid,
-                          ( !Volatile ? EFI_VARIABLE_NON_VOLATILE : 0) |
-                          EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
-                          0,
-                          NULL
-                          );
-    if (!EFI_ERROR(Status)) {
-      AsciiPrint("Variable '%s' deleted\n",VariableName);
-    } else {
-      AsciiPrint("Variable setting is incorrect. It should be VariableName=Value\n");
-    }
-    return Status;
+  if (AsciiValue == NULL) {\r
+    //\r
+    // There is no value. It means this variable will be deleted\r
+    //\r
+\r
+    // Convert VariableName into Unicode\r
+    VariableName = AllocatePool((AsciiStrLen (AsciiVariableSetting) + 1) * sizeof (CHAR16));\r
+    AsciiStrToUnicodeStr (AsciiVariableSetting,VariableName);\r
+\r
+    Status = gRT->SetVariable (\r
+                          VariableName,\r
+                          &gEfiGlobalVariableGuid,\r
+                          ( !Volatile ? EFI_VARIABLE_NON_VOLATILE : 0) |\r
+                          EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
+                          0,\r
+                          NULL\r
+                          );\r
+    if (!EFI_ERROR(Status)) {\r
+      AsciiPrint("Variable '%s' deleted\n",VariableName);\r
+    } else {\r
+      AsciiPrint("Variable setting is incorrect. It should be VariableName=Value\n");\r
+    }\r
+    return Status;\r
   }\r
 \r
   AsciiValue[0] = '\0';\r
@@ -167,20 +167,20 @@ EblSetCmd (
   }\r
 \r
   // Convert VariableName into Unicode\r
-  VariableName = AllocatePool((AsciiStrLen (AsciiVariableName) + 1) * sizeof (CHAR16));
+  VariableName = AllocatePool((AsciiStrLen (AsciiVariableName) + 1) * sizeof (CHAR16));\r
   AsciiStrToUnicodeStr (AsciiVariableName,VariableName);\r
 \r
-  Status = gRT->SetVariable (
-                      VariableName,
-                      &gEfiGlobalVariableGuid,
-                      ( !Volatile ? EFI_VARIABLE_NON_VOLATILE : 0) |
-                      EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
-                      AsciiStrLen (AsciiValue)+1,
-                      AsciiValue
+  Status = gRT->SetVariable (\r
+                      VariableName,\r
+                      &gEfiGlobalVariableGuid,\r
+                      ( !Volatile ? EFI_VARIABLE_NON_VOLATILE : 0) |\r
+                      EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
+                      AsciiStrLen (AsciiValue)+1,\r
+                      AsciiValue\r
                       );\r
   if (!EFI_ERROR(Status)) {\r
     AsciiPrint("'%a'='%a'\n",AsciiVariableName,AsciiValue);\r
-  }
+  }\r
 \r
   return Status;\r
 }\r
index 7cfc28e..85a32b7 100644 (file)
-/** @file
-  Implementation of the 6 PEI Ffs (FV) APIs in library form.
-
-  Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
-  
-  This program and the accompanying materials
-  are licensed and made available under the terms and conditions of the BSD License
-  which accompanies this distribution.  The full text of the license may be found at
-  http://opensource.org/licenses/bsd-license.php
-
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include <PiPei.h>
-
-#include <Library/BaseLib.h>
-#include <Library/PrePiLib.h>
-#include <Library/DebugLib.h>
-
-
-
-/**
-  Allocates one or more 4KB pages of type EfiBootServicesData.
-
-  Allocates the number of 4KB pages of MemoryType and returns a pointer to the
-  allocated buffer.  The buffer returned is aligned on a 4KB boundary.  If Pages is 0, then NULL
-  is returned.  If there is not enough memory remaining to satisfy the request, then NULL is
-  returned.
-
-  @param  Pages                 The number of 4 KB pages to allocate.
-
-  @return A pointer to the allocated buffer or NULL if allocation fails.
-
-**/
-VOID *
-EFIAPI
-AllocatePages (
-  IN UINTN            Pages
-  )
-{
-  EFI_PEI_HOB_POINTERS                    Hob;
-  EFI_PHYSICAL_ADDRESS                    Offset;
-
-  Hob.Raw = GetHobList ();
-
-  // Check to see if on 4k boundary
-  Offset = Hob.HandoffInformationTable->EfiFreeMemoryTop & 0xFFF;
-  if (Offset != 0) {
-    // If not aligned, make the allocation aligned.
-    Hob.HandoffInformationTable->EfiFreeMemoryTop -= Offset;
-  }
-
-  //
-  // Verify that there is sufficient memory to satisfy the allocation
-  //
-  if (Hob.HandoffInformationTable->EfiFreeMemoryTop - ((Pages * EFI_PAGE_SIZE) + sizeof (EFI_HOB_MEMORY_ALLOCATION)) < Hob.HandoffInformationTable->EfiFreeMemoryBottom) {
-    return 0;
-  } else {
-    //
-    // Update the PHIT to reflect the memory usage
-    //
-    Hob.HandoffInformationTable->EfiFreeMemoryTop -= Pages * EFI_PAGE_SIZE;
-
-    // This routine used to create a memory allocation HOB a la PEI, but that's not
-    // necessary for us.
-
-    //
-    // Create a memory allocation HOB.
-    //
-    BuildMemoryAllocationHob (
-        Hob.HandoffInformationTable->EfiFreeMemoryTop,
-        Pages * EFI_PAGE_SIZE,
-        EfiBootServicesData
-        );
-    return (VOID *)(UINTN)Hob.HandoffInformationTable->EfiFreeMemoryTop;
-  }
-}
-
-
-/**
-  Allocates one or more 4KB pages of type EfiBootServicesData at a specified alignment.
-
-  Allocates the number of 4KB pages specified by Pages of type EfiBootServicesData with an
-  alignment specified by Alignment.  The allocated buffer is returned.  If Pages is 0, then NULL is
-  returned.  If there is not enough memory at the specified alignment remaining to satisfy the
-  request, then NULL is returned.
-  If Alignment is not a power of two and Alignment is not zero, then ASSERT().
-
-  @param  Pages                 The number of 4 KB pages to allocate.
-  @param  Alignment             The requested alignment of the allocation.  Must be a power of two.
-                                If Alignment is zero, then byte alignment is used.
-
-  @return A pointer to the allocated buffer or NULL if allocation fails.
-
-**/
-VOID *
-EFIAPI
-AllocateAlignedPages (
-  IN UINTN  Pages,
-  IN UINTN  Alignment
-  )
-{
-  VOID    *Memory;
-  UINTN   AlignmentMask;
-
-  //
-  // Alignment must be a power of two or zero.
-  //
-  ASSERT ((Alignment & (Alignment - 1)) == 0);
-
-  if (Pages == 0) {
-    return NULL;
-  }
-  //
-  // Make sure that Pages plus EFI_SIZE_TO_PAGES (Alignment) does not overflow.
-  //
-  ASSERT (Pages <= (MAX_ADDRESS - EFI_SIZE_TO_PAGES (Alignment)));
-  //
-  // We would rather waste some memory to save PEI code size.
-  //
-  Memory = (VOID *)(UINTN)AllocatePages (Pages + EFI_SIZE_TO_PAGES (Alignment));
-  if (Alignment == 0) {
-    AlignmentMask = Alignment;
-  } else {
-    AlignmentMask = Alignment - 1;
-  }
-  return (VOID *) (UINTN) (((UINTN) Memory + AlignmentMask) & ~AlignmentMask);
-}
-
-
-
-
-/**
-  Allocates a buffer of type EfiBootServicesData.
-
-  Allocates the number bytes specified by AllocationSize of type EfiBootServicesData and returns a
-  pointer to the allocated buffer.  If AllocationSize is 0, then a valid buffer of 0 size is
-  returned.  If there is not enough memory remaining to satisfy the request, then NULL is returned.
-
-  @param  AllocationSize        The number of bytes to allocate.
-
-  @return A pointer to the allocated buffer or NULL if allocation fails.
-
-**/
-VOID *
-EFIAPI
-AllocatePool (
-  IN UINTN  AllocationSize
-  )
-{
-  EFI_HOB_MEMORY_POOL      *Hob;
-
-  Hob = GetHobList ();
-
-  
-  //
-  // Verify that there is sufficient memory to satisfy the allocation
-  //
-  if (AllocationSize > 0x10000) {
-    // Please call AllcoatePages for big allocations
-    return 0;
-  } else {
-
-    Hob = (EFI_HOB_MEMORY_POOL *)CreateHob (EFI_HOB_TYPE_MEMORY_POOL, (UINT16)(sizeof (EFI_HOB_TYPE_MEMORY_POOL) + AllocationSize));
-    return (VOID *)(Hob + 1);
-  }
-}
-
-/**
-  Frees a buffer that was previously allocated with one of the pool allocation functions in the
-  Memory Allocation Library.
-
-  Frees the buffer specified by Buffer.  Buffer must have been allocated on a previous call to the
-  pool allocation services of the Memory Allocation Library.  If it is not possible to free pool
-  resources, then this function will perform no actions.
-
-  If Buffer was not allocated with a pool allocation function in the Memory Allocation Library,
-  then ASSERT().
-
-  @param  Buffer                Pointer to the buffer to free.
-
-**/
-VOID
-EFIAPI
-FreePool (
-  IN VOID   *Buffer
-  )
-{
-  // Not implemented yet
-}
+/** @file\r
+  Implementation of the 6 PEI Ffs (FV) APIs in library form.\r
+\r
+  Copyright (c) 2008 - 2009, Apple Inc. 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
+#include <PiPei.h>\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/PrePiLib.h>\r
+#include <Library/DebugLib.h>\r
+\r
+\r
+\r
+/**\r
+  Allocates one or more 4KB pages of type EfiBootServicesData.\r
+\r
+  Allocates the number of 4KB pages of MemoryType and returns a pointer to the\r
+  allocated buffer.  The buffer returned is aligned on a 4KB boundary.  If Pages is 0, then NULL\r
+  is returned.  If there is not enough memory remaining to satisfy the request, then NULL is\r
+  returned.\r
+\r
+  @param  Pages                 The number of 4 KB pages to allocate.\r
+\r
+  @return A pointer to the allocated buffer or NULL if allocation fails.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+AllocatePages (\r
+  IN UINTN            Pages\r
+  )\r
+{\r
+  EFI_PEI_HOB_POINTERS                    Hob;\r
+  EFI_PHYSICAL_ADDRESS                    Offset;\r
+\r
+  Hob.Raw = GetHobList ();\r
+\r
+  // Check to see if on 4k boundary\r
+  Offset = Hob.HandoffInformationTable->EfiFreeMemoryTop & 0xFFF;\r
+  if (Offset != 0) {\r
+    // If not aligned, make the allocation aligned.\r
+    Hob.HandoffInformationTable->EfiFreeMemoryTop -= Offset;\r
+  }\r
+\r
+  //\r
+  // Verify that there is sufficient memory to satisfy the allocation\r
+  //\r
+  if (Hob.HandoffInformationTable->EfiFreeMemoryTop - ((Pages * EFI_PAGE_SIZE) + sizeof (EFI_HOB_MEMORY_ALLOCATION)) < Hob.HandoffInformationTable->EfiFreeMemoryBottom) {\r
+    return 0;\r
+  } else {\r
+    //\r
+    // Update the PHIT to reflect the memory usage\r
+    //\r
+    Hob.HandoffInformationTable->EfiFreeMemoryTop -= Pages * EFI_PAGE_SIZE;\r
+\r
+    // This routine used to create a memory allocation HOB a la PEI, but that's not\r
+    // necessary for us.\r
+\r
+    //\r
+    // Create a memory allocation HOB.\r
+    //\r
+    BuildMemoryAllocationHob (\r
+        Hob.HandoffInformationTable->EfiFreeMemoryTop,\r
+        Pages * EFI_PAGE_SIZE,\r
+        EfiBootServicesData\r
+        );\r
+    return (VOID *)(UINTN)Hob.HandoffInformationTable->EfiFreeMemoryTop;\r
+  }\r
+}\r
+\r
+\r
+/**\r
+  Allocates one or more 4KB pages of type EfiBootServicesData at a specified alignment.\r
+\r
+  Allocates the number of 4KB pages specified by Pages of type EfiBootServicesData with an\r
+  alignment specified by Alignment.  The allocated buffer is returned.  If Pages is 0, then NULL is\r
+  returned.  If there is not enough memory at the specified alignment remaining to satisfy the\r
+  request, then NULL is returned.\r
+  If Alignment is not a power of two and Alignment is not zero, then ASSERT().\r
+\r
+  @param  Pages                 The number of 4 KB pages to allocate.\r
+  @param  Alignment             The requested alignment of the allocation.  Must be a power of two.\r
+                                If Alignment is zero, then byte alignment is used.\r
+\r
+  @return A pointer to the allocated buffer or NULL if allocation fails.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+AllocateAlignedPages (\r
+  IN UINTN  Pages,\r
+  IN UINTN  Alignment\r
+  )\r
+{\r
+  VOID    *Memory;\r
+  UINTN   AlignmentMask;\r
+\r
+  //\r
+  // Alignment must be a power of two or zero.\r
+  //\r
+  ASSERT ((Alignment & (Alignment - 1)) == 0);\r
+\r
+  if (Pages == 0) {\r
+    return NULL;\r
+  }\r
+  //\r
+  // Make sure that Pages plus EFI_SIZE_TO_PAGES (Alignment) does not overflow.\r
+  //\r
+  ASSERT (Pages <= (MAX_ADDRESS - EFI_SIZE_TO_PAGES (Alignment)));\r
+  //\r
+  // We would rather waste some memory to save PEI code size.\r
+  //\r
+  Memory = (VOID *)(UINTN)AllocatePages (Pages + EFI_SIZE_TO_PAGES (Alignment));\r
+  if (Alignment == 0) {\r
+    AlignmentMask = Alignment;\r
+  } else {\r
+    AlignmentMask = Alignment - 1;\r
+  }\r
+  return (VOID *) (UINTN) (((UINTN) Memory + AlignmentMask) & ~AlignmentMask);\r
+}\r
+\r
+\r
+\r
+\r
+/**\r
+  Allocates a buffer of type EfiBootServicesData.\r
+\r
+  Allocates the number bytes specified by AllocationSize of type EfiBootServicesData and returns a\r
+  pointer to the allocated buffer.  If AllocationSize is 0, then a valid buffer of 0 size is\r
+  returned.  If there is not enough memory remaining to satisfy the request, then NULL is returned.\r
+\r
+  @param  AllocationSize        The number of bytes to allocate.\r
+\r
+  @return A pointer to the allocated buffer or NULL if allocation fails.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+AllocatePool (\r
+  IN UINTN  AllocationSize\r
+  )\r
+{\r
+  EFI_HOB_MEMORY_POOL      *Hob;\r
+\r
+  Hob = GetHobList ();\r
+\r
+  \r
+  //\r
+  // Verify that there is sufficient memory to satisfy the allocation\r
+  //\r
+  if (AllocationSize > 0x10000) {\r
+    // Please call AllcoatePages for big allocations\r
+    return 0;\r
+  } else {\r
+\r
+    Hob = (EFI_HOB_MEMORY_POOL *)CreateHob (EFI_HOB_TYPE_MEMORY_POOL, (UINT16)(sizeof (EFI_HOB_TYPE_MEMORY_POOL) + AllocationSize));\r
+    return (VOID *)(Hob + 1);\r
+  }\r
+}\r
+\r
+/**\r
+  Frees a buffer that was previously allocated with one of the pool allocation functions in the\r
+  Memory Allocation Library.\r
+\r
+  Frees the buffer specified by Buffer.  Buffer must have been allocated on a previous call to the\r
+  pool allocation services of the Memory Allocation Library.  If it is not possible to free pool\r
+  resources, then this function will perform no actions.\r
+\r
+  If Buffer was not allocated with a pool allocation function in the Memory Allocation Library,\r
+  then ASSERT().\r
+\r
+  @param  Buffer                Pointer to the buffer to free.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+FreePool (\r
+  IN VOID   *Buffer\r
+  )\r
+{\r
+  // Not implemented yet\r
+}\r