mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-26 06:50:10 +00:00

Since BL31 PROGBITS and BL31 NOBITS sections are going to be in non-adjacent memory regions, potentially far from each other, some fixes are needed to support it completely. 1. adr instruction only allows computing the effective address of a location only within 1MB range of the PC. However, adrp instruction together with an add permits position independent address of any location with 4GB range of PC. 2. Since BL31 _RW_END_ marks the end of BL31 image, care must be taken that it is aligned to page size since we map this memory region in BL31 using xlat_v2 lib utils which mandate alignment of image size to page granularity. Change-Id: I3451cc030d03cb2032db3cc088f0c0e2c84bffda Signed-off-by: Madhukar Pappireddy <madhukar.pappireddy@arm.com>
48 lines
1.3 KiB
ArmAsm
48 lines
1.3 KiB
ArmAsm
/*
|
|
* Copyright (c) 2014-2020, ARM Limited and Contributors. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#include <asm_macros.S>
|
|
#include <lib/el3_runtime/cpu_data.h>
|
|
|
|
.globl init_cpu_data_ptr
|
|
.globl _cpu_data_by_index
|
|
|
|
/* -----------------------------------------------------------------
|
|
* void init_cpu_data_ptr(void)
|
|
*
|
|
* Initialise the TPIDR_EL3 register to refer to the cpu_data_t
|
|
* for the calling CPU. This must be called before cm_get_cpu_data()
|
|
*
|
|
* This can be called without a valid stack. It assumes that
|
|
* plat_my_core_pos() does not clobber register x10.
|
|
* clobbers: x0, x1, x10
|
|
* -----------------------------------------------------------------
|
|
*/
|
|
func init_cpu_data_ptr
|
|
mov x10, x30
|
|
bl plat_my_core_pos
|
|
bl _cpu_data_by_index
|
|
msr tpidr_el3, x0
|
|
ret x10
|
|
endfunc init_cpu_data_ptr
|
|
|
|
/* -----------------------------------------------------------------
|
|
* cpu_data_t *_cpu_data_by_index(uint32_t cpu_index)
|
|
*
|
|
* Return the cpu_data structure for the CPU with given linear index
|
|
*
|
|
* This can be called without a valid stack.
|
|
* clobbers: x0, x1
|
|
* -----------------------------------------------------------------
|
|
*/
|
|
func _cpu_data_by_index
|
|
mov_imm x1, CPU_DATA_SIZE
|
|
mul x0, x0, x1
|
|
adrp x1, percpu_data
|
|
add x1, x1, :lo12:percpu_data
|
|
add x0, x0, x1
|
|
ret
|
|
endfunc _cpu_data_by_index
|