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