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