xref: /arm-trusted-firmware/include/lib/el3_runtime/aarch32/context.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2016-2020, Arm Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #ifndef CONTEXT_H
8*91f16700Schasinglulu #define CONTEXT_H
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <lib/utils_def.h>
11*91f16700Schasinglulu 
12*91f16700Schasinglulu /*******************************************************************************
13*91f16700Schasinglulu  * Constants that allow assembler code to access members of and the 'regs'
14*91f16700Schasinglulu  * structure at their correct offsets.
15*91f16700Schasinglulu  ******************************************************************************/
16*91f16700Schasinglulu #define CTX_REGS_OFFSET		U(0x0)
17*91f16700Schasinglulu #define CTX_GPREG_R0		U(0x0)
18*91f16700Schasinglulu #define CTX_GPREG_R1		U(0x4)
19*91f16700Schasinglulu #define CTX_GPREG_R2		U(0x8)
20*91f16700Schasinglulu #define CTX_GPREG_R3		U(0xC)
21*91f16700Schasinglulu #define CTX_LR			U(0x10)
22*91f16700Schasinglulu #define CTX_SCR			U(0x14)
23*91f16700Schasinglulu #define CTX_SPSR		U(0x18)
24*91f16700Schasinglulu #define CTX_NS_SCTLR		U(0x1C)
25*91f16700Schasinglulu #define CTX_REGS_END		U(0x20)
26*91f16700Schasinglulu 
27*91f16700Schasinglulu #ifndef __ASSEMBLER__
28*91f16700Schasinglulu 
29*91f16700Schasinglulu #include <stdint.h>
30*91f16700Schasinglulu 
31*91f16700Schasinglulu #include <lib/cassert.h>
32*91f16700Schasinglulu 
33*91f16700Schasinglulu /*
34*91f16700Schasinglulu  * Common constants to help define the 'cpu_context' structure and its
35*91f16700Schasinglulu  * members below.
36*91f16700Schasinglulu  */
37*91f16700Schasinglulu #define WORD_SHIFT		U(2)
38*91f16700Schasinglulu #define DEFINE_REG_STRUCT(name, num_regs)	\
39*91f16700Schasinglulu 	typedef struct name {			\
40*91f16700Schasinglulu 		uint32_t ctx_regs[num_regs];	\
41*91f16700Schasinglulu 	}  __aligned(8) name##_t
42*91f16700Schasinglulu 
43*91f16700Schasinglulu /* Constants to determine the size of individual context structures */
44*91f16700Schasinglulu #define CTX_REG_ALL		(CTX_REGS_END >> WORD_SHIFT)
45*91f16700Schasinglulu 
46*91f16700Schasinglulu DEFINE_REG_STRUCT(regs, CTX_REG_ALL);
47*91f16700Schasinglulu 
48*91f16700Schasinglulu #undef CTX_REG_ALL
49*91f16700Schasinglulu 
50*91f16700Schasinglulu #define read_ctx_reg(ctx, offset)	((ctx)->ctx_regs[offset >> WORD_SHIFT])
51*91f16700Schasinglulu #define write_ctx_reg(ctx, offset, val)	(((ctx)->ctx_regs[offset >> WORD_SHIFT]) \
52*91f16700Schasinglulu 					 = val)
53*91f16700Schasinglulu typedef struct cpu_context {
54*91f16700Schasinglulu 	regs_t regs_ctx;
55*91f16700Schasinglulu } cpu_context_t;
56*91f16700Schasinglulu 
57*91f16700Schasinglulu /* Macros to access members of the 'cpu_context_t' structure */
58*91f16700Schasinglulu #define get_regs_ctx(h)		(&((cpu_context_t *) h)->regs_ctx)
59*91f16700Schasinglulu 
60*91f16700Schasinglulu /*
61*91f16700Schasinglulu  * Compile time assertions related to the 'cpu_context' structure to
62*91f16700Schasinglulu  * ensure that the assembler and the compiler view of the offsets of
63*91f16700Schasinglulu  * the structure members is the same.
64*91f16700Schasinglulu  */
65*91f16700Schasinglulu CASSERT(CTX_REGS_OFFSET == __builtin_offsetof(cpu_context_t, regs_ctx),
66*91f16700Schasinglulu 	assert_core_context_regs_offset_mismatch);
67*91f16700Schasinglulu 
68*91f16700Schasinglulu #endif /* __ASSEMBLER__ */
69*91f16700Schasinglulu 
70*91f16700Schasinglulu #endif /* CONTEXT_H */
71