xref: /rk3399_ARM-atf/lib/extensions/sys_reg_trace/aarch64/sys_reg_trace.c (revision 4d0b66323b242323ff738431c523aeb6d18dd3d5)
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 
13 void sys_reg_trace_enable(cpu_context_t *ctx)
14 {
15 	uint64_t val;
16 
17 	/* Retrieve CPTR_EL3 value from the given context 'ctx',
18 	 * and update CPTR_EL3.TTA bit to 0.
19 	 * This function is called while switching context to NS to
20 	 * allow system trace register access to NS-EL2 and NS-EL1
21 	 * when NS-EL2 is implemented but not used.
22 	 */
23 	val = read_ctx_reg(get_el3state_ctx(ctx), CTX_CPTR_EL3);
24 	val &= ~TTA_BIT;
25 	write_ctx_reg(get_el3state_ctx(ctx), CTX_CPTR_EL3, val);
26 }
27 
28 void sys_reg_trace_init_el2_unused(void)
29 {
30 	/*
31 	 * CPTR_EL2.TTA: Set to zero so that Non-secure System register accesses
32 	 *  to the trace registers from both Execution states do not trap to
33 	 *  EL2. If PE trace unit System registers are not implemented then this
34 	 *  bit is reserved, and must be set to zero.
35 	 */
36 	write_cptr_el2(read_cptr_el2() & ~CPTR_EL2_TTA_BIT);
37 }
38