perf_regs.c 800 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <errno.h>
  3. #include "perf_regs.h"
  4. #include "event.h"
  5. int __weak arch_sdt_arg_parse_op(char *old_op __maybe_unused,
  6. char **new_op __maybe_unused)
  7. {
  8. return SDT_ARG_SKIP;
  9. }
  10. uint64_t __weak arch__intr_reg_mask(void)
  11. {
  12. return PERF_REGS_MASK;
  13. }
  14. uint64_t __weak arch__user_reg_mask(void)
  15. {
  16. return PERF_REGS_MASK;
  17. }
  18. #ifdef HAVE_PERF_REGS_SUPPORT
  19. int perf_reg_value(u64 *valp, struct regs_dump *regs, int id)
  20. {
  21. int i, idx = 0;
  22. u64 mask = regs->mask;
  23. if (regs->cache_mask & (1ULL << id))
  24. goto out;
  25. if (!(mask & (1ULL << id)))
  26. return -EINVAL;
  27. for (i = 0; i < id; i++) {
  28. if (mask & (1ULL << i))
  29. idx++;
  30. }
  31. regs->cache_mask |= (1ULL << id);
  32. regs->cache_regs[id] = regs->regs[idx];
  33. out:
  34. *valp = regs->cache_regs[id];
  35. return 0;
  36. }
  37. #endif