sync_handle.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /*
  2. * Copyright (c) 2022, ARM Limited. All rights reserved.
  3. * Copyright (c) 2023, NVIDIA Corporation. All rights reserved.
  4. *
  5. * SPDX-License-Identifier: BSD-3-Clause
  6. */
  7. #ifndef TRAP_HANDLE_H
  8. #define TRAP_HANDLE_H
  9. #include <stdbool.h>
  10. #include <context.h>
  11. #define ISS_SYSREG_OPCODE_MASK 0x3ffc1eUL
  12. #define ISS_SYSREG_REG_MASK 0x0003e0UL
  13. #define ISS_SYSREG_REG_SHIFT 5U
  14. #define ISS_SYSREG_DIRECTION_MASK 0x000001UL
  15. #define ISS_SYSREG_OPCODE_RNDR 0x30c808U
  16. #define ISS_SYSREG_OPCODE_IMPDEF 0x303c00U
  17. #define ISS_SYSREG_OPCODE_RNDRRS 0x32c808U
  18. #define TRAP_RET_UNHANDLED -1
  19. #define TRAP_RET_REPEAT 0
  20. #define TRAP_RET_CONTINUE 1
  21. #ifndef __ASSEMBLER__
  22. static inline unsigned int get_sysreg_iss_rt(uint64_t esr)
  23. {
  24. return (esr & ISS_SYSREG_REG_MASK) >> ISS_SYSREG_REG_SHIFT;
  25. }
  26. static inline bool is_sysreg_iss_write(uint64_t esr)
  27. {
  28. return !(esr & ISS_SYSREG_DIRECTION_MASK);
  29. }
  30. /**
  31. * handle_sysreg_trap() - Handle AArch64 system register traps from lower ELs
  32. * @esr_el3: The content of ESR_EL3, containing the trap syndrome information
  33. * @ctx: Pointer to the lower EL context, containing saved registers
  34. *
  35. * Called by the exception handler when a synchronous trap identifies as a
  36. * system register trap (EC=0x18). ESR contains the encoding of the op[x] and
  37. * CRm/CRn fields, to identify the system register, and the target/source
  38. * GPR plus the direction (MRS/MSR). The lower EL's context can be altered
  39. * by the function, to inject back the result of the emulation.
  40. *
  41. * Return: indication how to proceed with the trap:
  42. * TRAP_RET_UNHANDLED(-1): trap is unhandled, trigger panic
  43. * TRAP_RET_REPEAT(0): trap was handled, return to the trapping instruction
  44. * (repeating it)
  45. * TRAP_RET_CONTINUE(1): trap was handled, return to the next instruction
  46. * (continuing after it)
  47. */
  48. int handle_sysreg_trap(uint64_t esr_el3, cpu_context_t *ctx);
  49. /* Handler for injecting UNDEF exception to lower EL */
  50. void inject_undef64(cpu_context_t *ctx);
  51. u_register_t create_spsr(u_register_t old_spsr, unsigned int target_el);
  52. /* Prototypes for system register emulation handlers provided by platforms. */
  53. int plat_handle_impdef_trap(uint64_t esr_el3, cpu_context_t *ctx);
  54. int plat_handle_rng_trap(uint64_t esr_el3, cpu_context_t *ctx);
  55. #endif /* __ASSEMBLER__ */
  56. #endif