xref: /rk3399_ARM-atf/include/lib/per_cpu/per_cpu_macros.S (revision 962958d309f6c0b7c1490ab1bec67804c58589f5)
1/*
2 * Copyright (c) 2025, Arm Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#ifndef PER_CPU_MACROS_S
8#define PER_CPU_MACROS_S
9
10#include <arch.h>
11#include <asm_macros.S>
12#include <lib/per_cpu/per_cpu_defs.h>
13
14/* -----------------------------------------------------------------
15 * per_cpu_cur <label>, <dst>, <clobber>
16 * Returns: <dst> = per-CPU address of <label>
17 * Clobbers: <dst> and <clobber>
18 *
19 * Defaults: dst=x0, clobber=x1
20 * ----------------------------------------------------------------- */
21.macro  per_cpu_cur label, dst=x0, clobber=x1
22	/* Safety checks */
23	.ifc \dst,\clobber
24	.error "per_cpu_cur: dst and clobber must be different"
25	.endif
26
27	/* dst = absolute address of label */
28	adr_l	\dst, \label
29
30	/* clobber = absolute address of __PER_CPU_START__ */
31	adr_l	\clobber, __PER_CPU_START__
32
33	/* dst = (label - __PER_CPU_START__) */
34	sub	\dst, \dst, \clobber
35
36	/* clobber = per-cpu base (TPIDR_EL3) */
37	mrs	\clobber, tpidr_el3
38
39	/* dst = base + offset */
40	add	\dst, \clobber, \dst
41.endm
42
43#endif /* PER_CPU_MACROS_S */
44