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 170786364a902ceaf3b7c74c3c5e7ba626b41040..e037f9f97a2eec02c17d629bc4ed00aac2cc87bd 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 240e1e38ae7d788331c1a57a067fbd50acb582b4..736d479bfcfdb05296ce0337a8c42b4b0e6059ab 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 7938856a9b7a5b83ffd8cc1b0a434a4f267fa620..6101457a4cbcd1de592bc73d4dd4c883154dc12b 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 3eb3608954f9a07b15cd501e990e3fc8e3783f24..898dcc105d657a08534052604bf56915e0bb16e0 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 2ac5203404ac11df6bd45891784f07e8f4bc2911..0002d1a17cab89b250f049659e2ce6cc4afe84cb 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 aca849d97269af3ffac0dc92b9cd058e6e61b06a..69e724bcbbcc6581d6e471597c6823587567c698 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 e375709a0f21dae45abf1b1aff0ee0fc0eda2128..0cd0c8eec75011b02c089bab2073d6c7abddac1e 100644 (file)
   ArmRealViewEbHelper.asm   | RVCT
   ArmRealViewEbHelper.S     | GCC
 
-[Protocols]
-
 [FeaturePcd]
   gEmbeddedTokenSpaceGuid.PcdCacheEnable
-
-[FixedPcd]
-  gArmPlatformTokenSpaceGuid.PcdStandalone
index d4a603718b0829899a92c07427f0a9367b7bb44a..60b40074e51ba561c598554bdb86db11f196cdaa 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 1ad0e17877233e5b77db6fa1523f8bae67a3c152..bce88837a9da98adc3d818352a044181e8e665dc 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 fc158234a95d51c2aab922afaa8a62fcb91f2f7e..34e3d9929de2fc1c122f275b14b77aee84677a89 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 f160622d78184a4b7e7b38025e162833d7ada8eb..d3867ae931ceb4e1d2fb1d2aad6da13beda404e5 100644 (file)
   CTA9x4Helper.asm   | RVCT
   CTA9x4Helper.S     | GCC
 
-[Protocols]
-
 [FeaturePcd]
   gEmbeddedTokenSpaceGuid.PcdCacheEnable
   gArmPlatformTokenSpaceGuid.PcdNorFlashRemapping
 
 [FixedPcd]
-  gArmPlatformTokenSpaceGuid.PcdStandalone
-
   gArmTokenSpaceGuid.PcdSystemMemoryBase
   gArmTokenSpaceGuid.PcdSystemMemorySize
 
index 3f08784ff572577c936f9ea06f68127595d3b9cb..8674f7923b5686509e134b8b26dee2047493619c 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 1e25c1e72e5d477302736c377917e279f919a336..91550df9d42b693d880853e8f3d34be019406b63 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 ba0f8520b7608a05faacb88527eadcd9c8b492d3..c49812560e65b20bda279b4e77048ac1db9fc8ee 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 159a4d057808a9f5fbd252e88fd885a2320af2fa..abce21d0a523bb1eaf21adc064607c3135e1a172 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 16e0d9d14c2bd1c14c979861d477315103a0c47d..55bd4af1dd3400f16240c3846e2599bf43adfa66 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 17a0002dee4d828f2ebd932c3f7b5d0c0a0aeeb0..35c41540f48ef9a3b6fcdc6a0fab4a02dc086ee3 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 ccf0e7d3d453be27bf4c479773d811152a716921..0b7f973d53c94ef98f2c6c5b94b377c8f54ad94d 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 bcde6c4b1081f8223135c0232c742779e928f2cd..8c255443afd022cd2f315d47208d998dd911ed3d 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 5b0886d0dd1fd0598fffdd8bb9a28b3e19b3040d..f37bcb0751779a5aea865478e1aa5bb06e119fd2 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 256fcafee972195e4558839fade193fb955fd96c..c7d18d439489a7a5e3864037bd4ca4a24c6063f4 100755 (executable)
@@ -59,9 +59,9 @@
 [FeaturePcd]  
   gEmbeddedTokenSpaceGuid.PcdCacheEnable
   gEmbeddedTokenSpaceGuid.PcdPrePiProduceMemoryTypeInformationHob
+  gArmPlatformTokenSpaceGuid.PcdSendSgiToBringUpSecondaryCores
 
 [FixedPcd]
-  gArmPlatformTokenSpaceGuid.PcdStandalone
   gArmTokenSpaceGuid.PcdVFPEnabled
 
   gArmTokenSpaceGuid.PcdNormalFdBaseAddress
index c28fe3c6cbd0520b14555bc59ca5e3f7d395e990..3af265576e6ab7a08777582dfe97dd82c1c05e95 100755 (executable)
@@ -57,9 +57,9 @@
 [FeaturePcd]  
   gEmbeddedTokenSpaceGuid.PcdCacheEnable
   gEmbeddedTokenSpaceGuid.PcdPrePiProduceMemoryTypeInformationHob
+  gArmPlatformTokenSpaceGuid.PcdSendSgiToBringUpSecondaryCores
 
 [FixedPcd]
-  gArmPlatformTokenSpaceGuid.PcdStandalone
   gArmTokenSpaceGuid.PcdVFPEnabled
 
   gArmTokenSpaceGuid.PcdNormalFdBaseAddress
index ef8629a8975052cb164de08fb24ebfeb3ff9e562..cf3825bc6af4d6d6b312b2ffa15d5e233fe29e27 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 8ddc654c24a4e245c44d954a98f219c494de476a..42df66ea20066e47e7ef045eba74412cafae2d37 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 974c31a2fba7e2040bb38031bc5247eb711f3eae..23dee117d32aac94bd1a60d9566cc1ca5c89db6d 100644 (file)
   ArmPlatformLib
   BaseLib
   DebugLib
+  DebugAgentLib
   IoLib
   PL390GicSecLib
   PrintLib
   SerialPortLib
   
 [FeaturePcd]
-  gArmTokenSpaceGuid.PcdSkipPeiCore
+  gArmPlatformTokenSpaceGuid.PcdSystemMemoryInitializeInSec
   
 [FixedPcd]
-  gArmPlatformTokenSpaceGuid.PcdStandalone
   gArmTokenSpaceGuid.PcdVFPEnabled
   gArmPlatformTokenSpaceGuid.PcdMPCoreSupport
   
index 3fd688bee11943eff00bdb34e85d47368ddcb772..5c00122cdb16e6c5b1611eeea69073c1827bee46 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 7cfc28e1e7293d42ef4758080f534c9b3ac5d237..85a32b7362052bcb8c02a7876a2c129b2236e981 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