perf_regs.c 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2022 Loongson Technology Corporation Limited
  4. *
  5. * Derived from MIPS:
  6. * Copyright (C) 2013 Cavium, Inc.
  7. */
  8. #include <linux/perf_event.h>
  9. #include <asm/ptrace.h>
  10. #ifdef CONFIG_32BIT
  11. u64 perf_reg_abi(struct task_struct *tsk)
  12. {
  13. return PERF_SAMPLE_REGS_ABI_32;
  14. }
  15. #else /* Must be CONFIG_64BIT */
  16. u64 perf_reg_abi(struct task_struct *tsk)
  17. {
  18. if (test_tsk_thread_flag(tsk, TIF_32BIT_REGS))
  19. return PERF_SAMPLE_REGS_ABI_32;
  20. else
  21. return PERF_SAMPLE_REGS_ABI_64;
  22. }
  23. #endif /* CONFIG_32BIT */
  24. int perf_reg_validate(u64 mask)
  25. {
  26. if (!mask)
  27. return -EINVAL;
  28. if (mask & ~((1ull << PERF_REG_LOONGARCH_MAX) - 1))
  29. return -EINVAL;
  30. return 0;
  31. }
  32. u64 perf_reg_value(struct pt_regs *regs, int idx)
  33. {
  34. if (WARN_ON_ONCE((u32)idx >= PERF_REG_LOONGARCH_MAX))
  35. return 0;
  36. if ((u32)idx == PERF_REG_LOONGARCH_PC)
  37. return regs->csr_era;
  38. return regs->regs[idx];
  39. }
  40. void perf_get_regs_user(struct perf_regs *regs_user,
  41. struct pt_regs *regs)
  42. {
  43. regs_user->regs = task_pt_regs(current);
  44. regs_user->abi = perf_reg_abi(current);
  45. }