blob: 134956689d77e268e5d69519f529591a187594ef [file] [log] [blame]
Manish V Badarkhef356f7e2021-06-29 11:44:20 +01001/*
Boyan Karatotev6468d4a2023-02-16 15:12:45 +00002 * Copyright (c) 2021-2023, Arm Limited. All rights reserved.
Manish V Badarkhef356f7e2021-06-29 11:44:20 +01003 *
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
Manish V Badarkhef356f7e2021-06-29 11:44:20 +010013void sys_reg_trace_enable(cpu_context_t *ctx)
14{
Boyan Karatotev919d3c82023-02-13 16:32:47 +000015 /*
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 = read_ctx_reg(get_el3state_ctx(ctx), CTX_CPTR_EL3);
20
21 val &= ~(TTA_BIT);
22 write_ctx_reg(get_el3state_ctx(ctx), CTX_CPTR_EL3, val);
23}
Manish V Badarkhef356f7e2021-06-29 11:44:20 +010024
Boyan Karatotev919d3c82023-02-13 16:32:47 +000025void sys_reg_trace_disable(cpu_context_t *ctx)
26{
27 /*
28 * CPTR_EL3.TTA: Set to one so that System register accesses to the
29 * trace registers trap to EL3, unless it is trapped by CPACR.TRCDIS,
30 * CPACR_EL1.TTA, or CPTR_EL2.TTA
Andre Przywara44e33e02022-11-17 16:42:09 +000031 */
Boyan Karatotev919d3c82023-02-13 16:32:47 +000032 uint64_t val = read_ctx_reg(get_el3state_ctx(ctx), CTX_CPTR_EL3);
33
34 val |= TTA_BIT;
Andre Przywara44e33e02022-11-17 16:42:09 +000035 write_ctx_reg(get_el3state_ctx(ctx), CTX_CPTR_EL3, val);
Manish V Badarkhef356f7e2021-06-29 11:44:20 +010036}
Boyan Karatotev6468d4a2023-02-16 15:12:45 +000037
38void sys_reg_trace_init_el2_unused(void)
39{
40 /*
41 * CPTR_EL2.TTA: Set to zero so that Non-secure System register accesses
42 * to the trace registers from both Execution states do not trap to
43 * EL2. If PE trace unit System registers are not implemented then this
44 * bit is reserved, and must be set to zero.
45 */
46 write_cptr_el2(read_cptr_el2() & ~CPTR_EL2_TTA_BIT);
47}