blob: 5604c8e502947b1fa68299bbaa2abca0d8382e72 [file] [log] [blame]
Soby Mathew748be1d2016-05-05 14:10:46 +01001/*
Zelalem91d80612020-02-12 10:37:03 -06002 * Copyright (c) 2016-2020, ARM Limited and Contributors. All rights reserved.
Soby Mathew748be1d2016-05-05 14:10:46 +01003 *
dp-armfa3cf0b2017-05-03 09:38:09 +01004 * SPDX-License-Identifier: BSD-3-Clause
Soby Mathew748be1d2016-05-05 14:10:46 +01005 */
6
Antonio Nino Diaz864ca6f2018-10-31 15:25:35 +00007#ifndef CONTEXT_H
8#define CONTEXT_H
9
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000010#include <lib/utils_def.h>
Soby Mathew748be1d2016-05-05 14:10:46 +010011
12/*******************************************************************************
13 * Constants that allow assembler code to access members of and the 'regs'
14 * structure at their correct offsets.
15 ******************************************************************************/
Antonio Nino Diaz864ca6f2018-10-31 15:25:35 +000016#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)
Soby Mathew748be1d2016-05-05 14:10:46 +010026
Julius Werner53456fc2019-07-09 13:49:11 -070027#ifndef __ASSEMBLER__
Soby Mathew748be1d2016-05-05 14:10:46 +010028
Soby Mathew748be1d2016-05-05 14:10:46 +010029#include <stdint.h>
30
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000031#include <lib/cassert.h>
32
Soby Mathew748be1d2016-05-05 14:10:46 +010033/*
34 * Common constants to help define the 'cpu_context' structure and its
35 * members below.
36 */
Antonio Nino Diaz864ca6f2018-10-31 15:25:35 +000037#define WORD_SHIFT U(2)
Soby Mathew748be1d2016-05-05 14:10:46 +010038#define DEFINE_REG_STRUCT(name, num_regs) \
39 typedef struct name { \
Zelalem91d80612020-02-12 10:37:03 -060040 uint32_t ctx_regs[num_regs]; \
Soby Mathew748be1d2016-05-05 14:10:46 +010041 } __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
46DEFINE_REG_STRUCT(regs, CTX_REG_ALL);
47
48#undef CTX_REG_ALL
49
Zelalem91d80612020-02-12 10:37:03 -060050#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]) \
Soby Mathew748be1d2016-05-05 14:10:46 +010052 = val)
53typedef 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 */
65CASSERT(CTX_REGS_OFFSET == __builtin_offsetof(cpu_context_t, regs_ctx), \
66 assert_core_context_regs_offset_mismatch);
67
Julius Werner53456fc2019-07-09 13:49:11 -070068#endif /* __ASSEMBLER__ */
Soby Mathew748be1d2016-05-05 14:10:46 +010069
Antonio Nino Diaz864ca6f2018-10-31 15:25:35 +000070#endif /* CONTEXT_H */