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 Hovoid 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 Hovoid 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 Karatotevvoid 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