dwarf-regs.c 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Mapping of DWARF debug register numbers into register names.
  4. *
  5. * Copyright IBM Corp. 2010, 2017
  6. * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>,
  7. * Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
  8. *
  9. */
  10. #include <errno.h>
  11. #include <stddef.h>
  12. #include <stdlib.h>
  13. #include <linux/kernel.h>
  14. #include <asm/ptrace.h>
  15. #include <string.h>
  16. #include <dwarf-regs.h>
  17. #include "dwarf-regs-table.h"
  18. const char *get_arch_regstr(unsigned int n)
  19. {
  20. return (n >= ARRAY_SIZE(s390_dwarf_regs)) ? NULL : s390_dwarf_regs[n];
  21. }
  22. /*
  23. * Convert the register name into an offset to struct pt_regs (kernel).
  24. * This is required by the BPF prologue generator. The BPF
  25. * program is called in the BPF overflow handler in the perf
  26. * core.
  27. */
  28. int regs_query_register_offset(const char *name)
  29. {
  30. unsigned long gpr;
  31. if (!name || strncmp(name, "%r", 2))
  32. return -EINVAL;
  33. errno = 0;
  34. gpr = strtoul(name + 2, NULL, 10);
  35. if (errno || gpr >= 16)
  36. return -EINVAL;
  37. return offsetof(user_pt_regs, gprs) + 8 * gpr;
  38. }