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