1 /* 2 * Copyright (c) 2016-2020, 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 <lib/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 __ASSEMBLER__ 28 29 #include <stdint.h> 30 31 #include <lib/cassert.h> 32 33 /* 34 * Common constants to help define the 'cpu_context' structure and its 35 * members below. 36 */ 37 #define WORD_SHIFT U(2) 38 #define DEFINE_REG_STRUCT(name, num_regs) \ 39 typedef struct name { \ 40 uint32_t ctx_regs[num_regs]; \ 41 } __aligned(8) name##_t 42 43 /* Constants to determine the size of individual context structures */ 44 #define CTX_REG_ALL (CTX_REGS_END >> WORD_SHIFT) 45 46 DEFINE_REG_STRUCT(regs, CTX_REG_ALL); 47 48 #undef CTX_REG_ALL 49 50 #define read_ctx_reg(ctx, offset) ((ctx)->ctx_regs[offset >> WORD_SHIFT]) 51 #define write_ctx_reg(ctx, offset, val) (((ctx)->ctx_regs[offset >> WORD_SHIFT]) \ 52 = val) 53 typedef struct cpu_context { 54 regs_t regs_ctx; 55 } cpu_context_t; 56 57 /* Macros to access members of the 'cpu_context_t' structure */ 58 #define get_regs_ctx(h) (&((cpu_context_t *) h)->regs_ctx) 59 60 /* 61 * Compile time assertions related to the 'cpu_context' structure to 62 * ensure that the assembler and the compiler view of the offsets of 63 * the structure members is the same. 64 */ 65 CASSERT(CTX_REGS_OFFSET == __builtin_offsetof(cpu_context_t, regs_ctx), \ 66 assert_core_context_regs_offset_mismatch); 67 68 #endif /* __ASSEMBLER__ */ 69 70 #endif /* CONTEXT_H */ 71