Home | History | Annotate | Download | only in aarch32
      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