sys_reg_trace.c 1.2 KB

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