X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=ArmPlatformPkg%2FPrePeiCore%2FPrePeiCoreEntryPoint.S;h=737b6ac19d5d2b5311499bfb389c50c7a7f6e39c;hb=1377db63ff80bbb28da572c7b276ba56faea5f94;hp=53c16ccb6faa1c8a538fe6953b5dc43dd1002584;hpb=262a9b04441b9e38b8c43ae0e4c60ae62df35504;p=mirror_edk2.git diff --git a/ArmPlatformPkg/PrePeiCore/PrePeiCoreEntryPoint.S b/ArmPlatformPkg/PrePeiCore/PrePeiCoreEntryPoint.S index 53c16ccb6f..737b6ac19d 100644 --- a/ArmPlatformPkg/PrePeiCore/PrePeiCoreEntryPoint.S +++ b/ArmPlatformPkg/PrePeiCore/PrePeiCoreEntryPoint.S @@ -1,64 +1,85 @@ -// -// 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 -#include -#include -#include - -#start of the code section -.text -.align 3 - -#global symbols referenced by this module -GCC_ASM_IMPORT(CEntryPoint) - -StartupAddr: .word CEntryPoint - -#make _ModuleEntryPoint as global -GCC_ASM_EXPORT(_ModuleEntryPoint) - - -ASM_PFX(_ModuleEntryPoint): - # Identify CPU ID - mrc p15, 0, r0, c0, c0, 5 - and r0, #0xf - -_SetupStack: - # Setup Stack for the 4 CPU cores - LoadConstantToReg (FixedPcdGet32(PcdCPUCoresNonSecStackBase) ,r1) - LoadConstantToReg (FixedPcdGet32(PcdCPUCoresNonSecStackSize) ,r2) - - mov r3,r0 @ r3 = core_id - mul r3,r3,r2 @ r3 = core_id * stack_size = offset from the stack base - add r3,r3,r1 @ r3 = stack_base + offset - add r3,r3,r2,LSR #1 @ r3 = stack_offset + (stack_size/2) <-- the top half is for the heap - mov sp, r3 - - # lr points to area in reset vector block containing PEI core address. lr needs to - # be saved from the beginning as the _ModuleEntryPoint could call helper functions - # that will overwrite 'lr' - LoadConstantToReg (FixedPcdGet32(PcdNormalFdBaseAddress), r2) - add r2, r2, #4 - ldr r1, [r2] - - # move sec startup address into a data register - # ensure we're jumping to FV version of the code (not boot remapped alias) - ldr r2, StartupAddr - - # jump to PrePeiCore C code - # r0 = core_id - # r1 = pei_core_address - blx r2 - -.end +// +// 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 +#include +#include +#include + +.text +.align 3 + +GCC_ASM_IMPORT(CEntryPoint) +GCC_ASM_IMPORT(ArmReadMpidr) +GCC_ASM_EXPORT(_ModuleEntryPoint) + +StartupAddr: .word CEntryPoint + +ASM_PFX(_ModuleEntryPoint): + // Identify CPU ID + bl ASM_PFX(ArmReadMpidr) + // Get ID of this CPU in Multicore system + LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCoreMask), r1) + and r5, r0, r1 + + // Get the top of the primary stacks (and the base of the secondary stacks) + LoadConstantToReg (FixedPcdGet32(PcdCPUCoresStackBase), r1) + LoadConstantToReg (FixedPcdGet32(PcdCPUCorePrimaryStackSize), r2) + add r1, r1, r2 + + // Is it the Primary Core ? + LoadConstantToReg (FixedPcdGet32(PcdArmPrimaryCore), r3) + cmp r5, r3 + beq _SetupPrimaryCoreStack + +_SetupSecondaryCoreStack: + // r1 contains the base of the secondary stacks + + // Get the Core Position (ClusterId * 4) + CoreId + GetCorePositionInStack(r0, r5, r2) + // The stack starts at the top of the stack region. Add '1' to the Core Position to get the top of the stack + add r0, r0, #1 + + // StackOffset = CorePos * StackSize + LoadConstantToReg (FixedPcdGet32(PcdCPUCoreSecondaryStackSize), r2) + mul r0, r0, r2 + // SP = StackBase + StackOffset + add sp, r1, r0 + +_PrepareArguments: + // The PEI Core Entry Point has been computed by GenFV and stored in the second entry of the Reset Vector + LoadConstantToReg (FixedPcdGet32(PcdFvBaseAddress), r2) + add r2, r2, #4 + ldr r1, [r2] + + // Move sec startup address into a data register + // Ensure we're jumping to FV version of the code (not boot remapped alias) + ldr r3, StartupAddr + + // Jump to PrePeiCore C code + // r0 = mp_id + // r1 = pei_core_address + mov r0, r5 + blx r3 + +_SetupPrimaryCoreStack: + // r1 contains the top of the primary stack + LoadConstantToReg (FixedPcdGet32(PcdPeiGlobalVariableSize), r2) + + // The reserved space for global variable must be 8-bytes aligned for pushing + // 64-bit variable on the stack + SetPrimaryStack (r1, r2, r3) + b _PrepareArguments + +_NeverReturn: + b _NeverReturn