1 /*
2  * Copyright (c) 2021-2023, Arm Limited. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <stdbool.h>
8 
9 #include <arch.h>
10 #include <arch_helpers.h>
11 #include <lib/extensions/sys_reg_trace.h>
12 
sys_reg_trace_enable_per_world(per_world_context_t * per_world_ctx)13 void sys_reg_trace_enable_per_world(per_world_context_t *per_world_ctx)
14 {
15 	/*
16 	 * CPTR_EL3.TTA: Set to zero so that System register accesses to the
17 	 *  trace registers do not trap to EL3.
18 	 */
19 	uint64_t val = per_world_ctx->ctx_cptr_el3;
20 	val &= ~(TTA_BIT);
21 	per_world_ctx->ctx_cptr_el3 = val;
22 }
23 
sys_reg_trace_disable_per_world(per_world_context_t * per_world_ctx)24 void sys_reg_trace_disable_per_world(per_world_context_t *per_world_ctx)
25 {
26 	/*
27 	 * CPTR_EL3.TTA: Set to one so that System register accesses to the
28 	 *  trace registers trap to EL3, unless it is trapped by CPACR.TRCDIS,
29 	 *  CPACR_EL1.TTA, or CPTR_EL2.TTA
30 	 */
31 	uint64_t val = per_world_ctx->ctx_cptr_el3;
32 	val |= TTA_BIT;
33 	per_world_ctx->ctx_cptr_el3 = val;
34 }
35 
sys_reg_trace_init_el2_unused(void)36 void sys_reg_trace_init_el2_unused(void)
37 {
38 	/*
39 	 * CPTR_EL2.TTA: Set to zero so that Non-secure System register accesses
40 	 *  to the trace registers from both Execution states do not trap to
41 	 *  EL2. If PE trace unit System registers are not implemented then this
42 	 *  bit is reserved, and must be set to zero.
43 	 */
44 	write_cptr_el2(read_cptr_el2() & ~CPTR_EL2_TTA_BIT);
45 }
46