xref: /rk3399_ARM-atf/lib/extensions/sys_reg_trace/aarch64/sys_reg_trace.c (revision 956201137588c99483a36df5f3fbb3dedc45a2a0)
1d4582d30SManish V Badarkhe /*
260d330dcSBoyan Karatotev  * Copyright (c) 2021-2023, Arm Limited. All rights reserved.
3d4582d30SManish V Badarkhe  *
4d4582d30SManish V Badarkhe  * SPDX-License-Identifier: BSD-3-Clause
5d4582d30SManish V Badarkhe  */
6d4582d30SManish V Badarkhe 
7d4582d30SManish V Badarkhe #include <stdbool.h>
8d4582d30SManish V Badarkhe 
9d4582d30SManish V Badarkhe #include <arch.h>
10d4582d30SManish V Badarkhe #include <arch_helpers.h>
11d4582d30SManish V Badarkhe #include <lib/extensions/sys_reg_trace.h>
12d4582d30SManish V Badarkhe 
sys_reg_trace_enable_per_world(per_world_context_t * per_world_ctx)13*461c0a5dSElizabeth Ho void sys_reg_trace_enable_per_world(per_world_context_t *per_world_ctx)
14d4582d30SManish V Badarkhe {
15ece8f7d7SBoyan Karatotev 	/*
16ece8f7d7SBoyan Karatotev 	 * CPTR_EL3.TTA: Set to zero so that System register accesses to the
17ece8f7d7SBoyan Karatotev 	 *  trace registers do not trap to EL3.
18d4582d30SManish V Badarkhe 	 */
19*461c0a5dSElizabeth Ho 	uint64_t val = per_world_ctx->ctx_cptr_el3;
20ece8f7d7SBoyan Karatotev 	val &= ~(TTA_BIT);
21*461c0a5dSElizabeth Ho 	per_world_ctx->ctx_cptr_el3 = val;
22ece8f7d7SBoyan Karatotev }
23ece8f7d7SBoyan Karatotev 
sys_reg_trace_disable_per_world(per_world_context_t * per_world_ctx)24*461c0a5dSElizabeth Ho void sys_reg_trace_disable_per_world(per_world_context_t *per_world_ctx)
25ece8f7d7SBoyan Karatotev {
26ece8f7d7SBoyan Karatotev 	/*
27ece8f7d7SBoyan Karatotev 	 * CPTR_EL3.TTA: Set to one so that System register accesses to the
28ece8f7d7SBoyan Karatotev 	 *  trace registers trap to EL3, unless it is trapped by CPACR.TRCDIS,
29ece8f7d7SBoyan Karatotev 	 *  CPACR_EL1.TTA, or CPTR_EL2.TTA
30ece8f7d7SBoyan Karatotev 	 */
31*461c0a5dSElizabeth Ho 	uint64_t val = per_world_ctx->ctx_cptr_el3;
32ece8f7d7SBoyan Karatotev 	val |= TTA_BIT;
33*461c0a5dSElizabeth Ho 	per_world_ctx->ctx_cptr_el3 = val;
34d4582d30SManish V Badarkhe }
3560d330dcSBoyan Karatotev 
sys_reg_trace_init_el2_unused(void)3660d330dcSBoyan Karatotev void sys_reg_trace_init_el2_unused(void)
3760d330dcSBoyan Karatotev {
3860d330dcSBoyan Karatotev 	/*
3960d330dcSBoyan Karatotev 	 * CPTR_EL2.TTA: Set to zero so that Non-secure System register accesses
4060d330dcSBoyan Karatotev 	 *  to the trace registers from both Execution states do not trap to
4160d330dcSBoyan Karatotev 	 *  EL2. If PE trace unit System registers are not implemented then this
4260d330dcSBoyan Karatotev 	 *  bit is reserved, and must be set to zero.
4360d330dcSBoyan Karatotev 	 */
4460d330dcSBoyan Karatotev 	write_cptr_el2(read_cptr_el2() & ~CPTR_EL2_TTA_BIT);
4560d330dcSBoyan Karatotev }
46