1/** @file 2* 3* Copyright (c) 2013-2014, ARM Limited. All rights reserved. 4* 5* This program and the accompanying materials 6* are licensed and made available under the terms and conditions of the BSD License 7* which accompanies this distribution. The full text of the license may be found at 8* http://opensource.org/licenses/bsd-license.php 9* 10* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12* 13**/ 14 15#include <AsmMacroIoLibV8.h> 16#include <Library/ArmLib.h> 17 18.text 19.align 3 20 21GCC_ASM_EXPORT(ArmPlatformPeiBootAction) 22GCC_ASM_EXPORT(ArmPlatformGetCorePosition) 23GCC_ASM_EXPORT(ArmPlatformGetPrimaryCoreMpId) 24GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore) 25 26GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask) 27 28 29PrimaryCoreMpid: .word 0x0 30 31// 32// Return the core position from the value of its MpId register 33// 34// This function returns the core position from the position 0 in the processor. 35// This function might be called from assembler before any stack is set. 36// 37// @return Return the core position 38// 39//UINTN 40//ArmPlatformGetCorePosition ( 41// IN UINTN MpId 42// ); 43// With this function: CorePos = (ClusterId * 2) + CoreId 44ASM_PFX(ArmPlatformGetCorePosition): 45 and r1, r0, #ARM_CORE_MASK 46 and r0, r0, #ARM_CLUSTER_MASK 47 add r0, r1, r0, LSR #7 48 bx lr 49 50// 51// Return the MpId of the primary core 52// 53// This function returns the MpId of the primary core. 54// This function might be called from assembler before any stack is set. 55// 56// @return Return the MpId of the primary core 57// 58//UINTN 59//ArmPlatformGetPrimaryCoreMpId ( 60// VOID 61// ); 62ASM_PFX(ArmPlatformGetPrimaryCoreMpId): 63 ldr r0, =PrimaryCoreMpid 64 ldr r0, [r0] 65 bx lr 66 67// 68// Return a non-zero value if the callee is the primary core 69// 70// This function returns a non-zero value if the callee is the primary core. 71// The primary core is the core responsible to initialize the hardware and run UEFI. 72// This function might be called from assembler before any stack is set. 73// 74// @return Return a non-zero value if the callee is the primary core. 75// 76//UINTN 77//ArmPlatformIsPrimaryCore ( 78// IN UINTN MpId 79// ); 80ASM_PFX(ArmPlatformIsPrimaryCore): 81 LoadConstantToReg (_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask, r1) 82 ldr r1, [r1] 83 and r0, r0, r1 84 85 ldr r1, =PrimaryCoreMpid 86 ldr r1, [r1] 87 88 cmp r0, r1 89 moveq r0, #1 90 movne r0, #0 91 bx lr 92 93// 94// First platform specific function to be called in the PEI phase 95// 96// This function is actually the first function called by the PrePi 97// or PrePeiCore modules. It allows to retrieve arguments passed to 98// the UEFI firmware through the CPU registers. 99// 100ASM_PFX(ArmPlatformPeiBootAction): 101 // The trusted firmware passes the primary CPU MPID through r0 register. 102 // Save it in a variable. 103 ldr r1, =PrimaryCoreMpid 104 str r0, [r1] 105 bx lr 106