1 // SPDX-License-Identifier: GPL-2.0
5 #include "util/sample.h"
7 int __weak arch_sdt_arg_parse_op(char *old_op __maybe_unused,
8 char **new_op __maybe_unused)
13 uint64_t __weak arch__intr_reg_mask(void)
15 return PERF_REGS_MASK;
18 uint64_t __weak arch__user_reg_mask(void)
20 return PERF_REGS_MASK;
23 #ifdef HAVE_PERF_REGS_SUPPORT
25 #define perf_event_arm_regs perf_event_arm64_regs
26 #include "../../arch/arm64/include/uapi/asm/perf_regs.h"
27 #undef perf_event_arm_regs
29 #include "../../arch/arm/include/uapi/asm/perf_regs.h"
30 #include "../../arch/csky/include/uapi/asm/perf_regs.h"
31 #include "../../arch/loongarch/include/uapi/asm/perf_regs.h"
32 #include "../../arch/mips/include/uapi/asm/perf_regs.h"
33 #include "../../arch/powerpc/include/uapi/asm/perf_regs.h"
34 #include "../../arch/riscv/include/uapi/asm/perf_regs.h"
35 #include "../../arch/s390/include/uapi/asm/perf_regs.h"
36 #include "../../arch/x86/include/uapi/asm/perf_regs.h"
38 static const char *__perf_reg_name_arm64(int id)
41 case PERF_REG_ARM64_X0:
43 case PERF_REG_ARM64_X1:
45 case PERF_REG_ARM64_X2:
47 case PERF_REG_ARM64_X3:
49 case PERF_REG_ARM64_X4:
51 case PERF_REG_ARM64_X5:
53 case PERF_REG_ARM64_X6:
55 case PERF_REG_ARM64_X7:
57 case PERF_REG_ARM64_X8:
59 case PERF_REG_ARM64_X9:
61 case PERF_REG_ARM64_X10:
63 case PERF_REG_ARM64_X11:
65 case PERF_REG_ARM64_X12:
67 case PERF_REG_ARM64_X13:
69 case PERF_REG_ARM64_X14:
71 case PERF_REG_ARM64_X15:
73 case PERF_REG_ARM64_X16:
75 case PERF_REG_ARM64_X17:
77 case PERF_REG_ARM64_X18:
79 case PERF_REG_ARM64_X19:
81 case PERF_REG_ARM64_X20:
83 case PERF_REG_ARM64_X21:
85 case PERF_REG_ARM64_X22:
87 case PERF_REG_ARM64_X23:
89 case PERF_REG_ARM64_X24:
91 case PERF_REG_ARM64_X25:
93 case PERF_REG_ARM64_X26:
95 case PERF_REG_ARM64_X27:
97 case PERF_REG_ARM64_X28:
99 case PERF_REG_ARM64_X29:
101 case PERF_REG_ARM64_SP:
103 case PERF_REG_ARM64_LR:
105 case PERF_REG_ARM64_PC:
107 case PERF_REG_ARM64_VG:
116 static const char *__perf_reg_name_arm(int id)
119 case PERF_REG_ARM_R0:
121 case PERF_REG_ARM_R1:
123 case PERF_REG_ARM_R2:
125 case PERF_REG_ARM_R3:
127 case PERF_REG_ARM_R4:
129 case PERF_REG_ARM_R5:
131 case PERF_REG_ARM_R6:
133 case PERF_REG_ARM_R7:
135 case PERF_REG_ARM_R8:
137 case PERF_REG_ARM_R9:
139 case PERF_REG_ARM_R10:
141 case PERF_REG_ARM_FP:
143 case PERF_REG_ARM_IP:
145 case PERF_REG_ARM_SP:
147 case PERF_REG_ARM_LR:
149 case PERF_REG_ARM_PC:
158 static const char *__perf_reg_name_csky(int id)
161 case PERF_REG_CSKY_A0:
163 case PERF_REG_CSKY_A1:
165 case PERF_REG_CSKY_A2:
167 case PERF_REG_CSKY_A3:
169 case PERF_REG_CSKY_REGS0:
171 case PERF_REG_CSKY_REGS1:
173 case PERF_REG_CSKY_REGS2:
175 case PERF_REG_CSKY_REGS3:
177 case PERF_REG_CSKY_REGS4:
179 case PERF_REG_CSKY_REGS5:
181 case PERF_REG_CSKY_REGS6:
183 case PERF_REG_CSKY_REGS7:
185 case PERF_REG_CSKY_REGS8:
187 case PERF_REG_CSKY_REGS9:
189 case PERF_REG_CSKY_SP:
191 case PERF_REG_CSKY_LR:
193 case PERF_REG_CSKY_PC:
195 #if defined(__CSKYABIV2__)
196 case PERF_REG_CSKY_EXREGS0:
198 case PERF_REG_CSKY_EXREGS1:
200 case PERF_REG_CSKY_EXREGS2:
202 case PERF_REG_CSKY_EXREGS3:
204 case PERF_REG_CSKY_EXREGS4:
206 case PERF_REG_CSKY_EXREGS5:
208 case PERF_REG_CSKY_EXREGS6:
210 case PERF_REG_CSKY_EXREGS7:
212 case PERF_REG_CSKY_EXREGS8:
214 case PERF_REG_CSKY_EXREGS9:
216 case PERF_REG_CSKY_EXREGS10:
218 case PERF_REG_CSKY_EXREGS11:
220 case PERF_REG_CSKY_EXREGS12:
222 case PERF_REG_CSKY_EXREGS13:
224 case PERF_REG_CSKY_EXREGS14:
226 case PERF_REG_CSKY_TLS:
228 case PERF_REG_CSKY_HI:
230 case PERF_REG_CSKY_LO:
240 static inline const char *__perf_reg_name_loongarch(int id)
243 case PERF_REG_LOONGARCH_PC:
245 case PERF_REG_LOONGARCH_R1:
247 case PERF_REG_LOONGARCH_R2:
249 case PERF_REG_LOONGARCH_R3:
251 case PERF_REG_LOONGARCH_R4:
253 case PERF_REG_LOONGARCH_R5:
255 case PERF_REG_LOONGARCH_R6:
257 case PERF_REG_LOONGARCH_R7:
259 case PERF_REG_LOONGARCH_R8:
261 case PERF_REG_LOONGARCH_R9:
263 case PERF_REG_LOONGARCH_R10:
265 case PERF_REG_LOONGARCH_R11:
267 case PERF_REG_LOONGARCH_R12:
269 case PERF_REG_LOONGARCH_R13:
271 case PERF_REG_LOONGARCH_R14:
273 case PERF_REG_LOONGARCH_R15:
275 case PERF_REG_LOONGARCH_R16:
277 case PERF_REG_LOONGARCH_R17:
279 case PERF_REG_LOONGARCH_R18:
281 case PERF_REG_LOONGARCH_R19:
283 case PERF_REG_LOONGARCH_R20:
285 case PERF_REG_LOONGARCH_R21:
287 case PERF_REG_LOONGARCH_R22:
289 case PERF_REG_LOONGARCH_R23:
291 case PERF_REG_LOONGARCH_R24:
293 case PERF_REG_LOONGARCH_R25:
295 case PERF_REG_LOONGARCH_R26:
297 case PERF_REG_LOONGARCH_R27:
299 case PERF_REG_LOONGARCH_R28:
301 case PERF_REG_LOONGARCH_R29:
303 case PERF_REG_LOONGARCH_R30:
305 case PERF_REG_LOONGARCH_R31:
313 static const char *__perf_reg_name_mips(int id)
316 case PERF_REG_MIPS_PC:
318 case PERF_REG_MIPS_R1:
320 case PERF_REG_MIPS_R2:
322 case PERF_REG_MIPS_R3:
324 case PERF_REG_MIPS_R4:
326 case PERF_REG_MIPS_R5:
328 case PERF_REG_MIPS_R6:
330 case PERF_REG_MIPS_R7:
332 case PERF_REG_MIPS_R8:
334 case PERF_REG_MIPS_R9:
336 case PERF_REG_MIPS_R10:
338 case PERF_REG_MIPS_R11:
340 case PERF_REG_MIPS_R12:
342 case PERF_REG_MIPS_R13:
344 case PERF_REG_MIPS_R14:
346 case PERF_REG_MIPS_R15:
348 case PERF_REG_MIPS_R16:
350 case PERF_REG_MIPS_R17:
352 case PERF_REG_MIPS_R18:
354 case PERF_REG_MIPS_R19:
356 case PERF_REG_MIPS_R20:
358 case PERF_REG_MIPS_R21:
360 case PERF_REG_MIPS_R22:
362 case PERF_REG_MIPS_R23:
364 case PERF_REG_MIPS_R24:
366 case PERF_REG_MIPS_R25:
368 case PERF_REG_MIPS_R28:
370 case PERF_REG_MIPS_R29:
372 case PERF_REG_MIPS_R30:
374 case PERF_REG_MIPS_R31:
382 static const char *__perf_reg_name_powerpc(int id)
385 case PERF_REG_POWERPC_R0:
387 case PERF_REG_POWERPC_R1:
389 case PERF_REG_POWERPC_R2:
391 case PERF_REG_POWERPC_R3:
393 case PERF_REG_POWERPC_R4:
395 case PERF_REG_POWERPC_R5:
397 case PERF_REG_POWERPC_R6:
399 case PERF_REG_POWERPC_R7:
401 case PERF_REG_POWERPC_R8:
403 case PERF_REG_POWERPC_R9:
405 case PERF_REG_POWERPC_R10:
407 case PERF_REG_POWERPC_R11:
409 case PERF_REG_POWERPC_R12:
411 case PERF_REG_POWERPC_R13:
413 case PERF_REG_POWERPC_R14:
415 case PERF_REG_POWERPC_R15:
417 case PERF_REG_POWERPC_R16:
419 case PERF_REG_POWERPC_R17:
421 case PERF_REG_POWERPC_R18:
423 case PERF_REG_POWERPC_R19:
425 case PERF_REG_POWERPC_R20:
427 case PERF_REG_POWERPC_R21:
429 case PERF_REG_POWERPC_R22:
431 case PERF_REG_POWERPC_R23:
433 case PERF_REG_POWERPC_R24:
435 case PERF_REG_POWERPC_R25:
437 case PERF_REG_POWERPC_R26:
439 case PERF_REG_POWERPC_R27:
441 case PERF_REG_POWERPC_R28:
443 case PERF_REG_POWERPC_R29:
445 case PERF_REG_POWERPC_R30:
447 case PERF_REG_POWERPC_R31:
449 case PERF_REG_POWERPC_NIP:
451 case PERF_REG_POWERPC_MSR:
453 case PERF_REG_POWERPC_ORIG_R3:
455 case PERF_REG_POWERPC_CTR:
457 case PERF_REG_POWERPC_LINK:
459 case PERF_REG_POWERPC_XER:
461 case PERF_REG_POWERPC_CCR:
463 case PERF_REG_POWERPC_SOFTE:
465 case PERF_REG_POWERPC_TRAP:
467 case PERF_REG_POWERPC_DAR:
469 case PERF_REG_POWERPC_DSISR:
471 case PERF_REG_POWERPC_SIER:
473 case PERF_REG_POWERPC_MMCRA:
475 case PERF_REG_POWERPC_MMCR0:
477 case PERF_REG_POWERPC_MMCR1:
479 case PERF_REG_POWERPC_MMCR2:
481 case PERF_REG_POWERPC_MMCR3:
483 case PERF_REG_POWERPC_SIER2:
485 case PERF_REG_POWERPC_SIER3:
487 case PERF_REG_POWERPC_PMC1:
489 case PERF_REG_POWERPC_PMC2:
491 case PERF_REG_POWERPC_PMC3:
493 case PERF_REG_POWERPC_PMC4:
495 case PERF_REG_POWERPC_PMC5:
497 case PERF_REG_POWERPC_PMC6:
499 case PERF_REG_POWERPC_SDAR:
501 case PERF_REG_POWERPC_SIAR:
509 static const char *__perf_reg_name_riscv(int id)
512 case PERF_REG_RISCV_PC:
514 case PERF_REG_RISCV_RA:
516 case PERF_REG_RISCV_SP:
518 case PERF_REG_RISCV_GP:
520 case PERF_REG_RISCV_TP:
522 case PERF_REG_RISCV_T0:
524 case PERF_REG_RISCV_T1:
526 case PERF_REG_RISCV_T2:
528 case PERF_REG_RISCV_S0:
530 case PERF_REG_RISCV_S1:
532 case PERF_REG_RISCV_A0:
534 case PERF_REG_RISCV_A1:
536 case PERF_REG_RISCV_A2:
538 case PERF_REG_RISCV_A3:
540 case PERF_REG_RISCV_A4:
542 case PERF_REG_RISCV_A5:
544 case PERF_REG_RISCV_A6:
546 case PERF_REG_RISCV_A7:
548 case PERF_REG_RISCV_S2:
550 case PERF_REG_RISCV_S3:
552 case PERF_REG_RISCV_S4:
554 case PERF_REG_RISCV_S5:
556 case PERF_REG_RISCV_S6:
558 case PERF_REG_RISCV_S7:
560 case PERF_REG_RISCV_S8:
562 case PERF_REG_RISCV_S9:
564 case PERF_REG_RISCV_S10:
566 case PERF_REG_RISCV_S11:
568 case PERF_REG_RISCV_T3:
570 case PERF_REG_RISCV_T4:
572 case PERF_REG_RISCV_T5:
574 case PERF_REG_RISCV_T6:
583 static const char *__perf_reg_name_s390(int id)
586 case PERF_REG_S390_R0:
588 case PERF_REG_S390_R1:
590 case PERF_REG_S390_R2:
592 case PERF_REG_S390_R3:
594 case PERF_REG_S390_R4:
596 case PERF_REG_S390_R5:
598 case PERF_REG_S390_R6:
600 case PERF_REG_S390_R7:
602 case PERF_REG_S390_R8:
604 case PERF_REG_S390_R9:
606 case PERF_REG_S390_R10:
608 case PERF_REG_S390_R11:
610 case PERF_REG_S390_R12:
612 case PERF_REG_S390_R13:
614 case PERF_REG_S390_R14:
616 case PERF_REG_S390_R15:
618 case PERF_REG_S390_FP0:
620 case PERF_REG_S390_FP1:
622 case PERF_REG_S390_FP2:
624 case PERF_REG_S390_FP3:
626 case PERF_REG_S390_FP4:
628 case PERF_REG_S390_FP5:
630 case PERF_REG_S390_FP6:
632 case PERF_REG_S390_FP7:
634 case PERF_REG_S390_FP8:
636 case PERF_REG_S390_FP9:
638 case PERF_REG_S390_FP10:
640 case PERF_REG_S390_FP11:
642 case PERF_REG_S390_FP12:
644 case PERF_REG_S390_FP13:
646 case PERF_REG_S390_FP14:
648 case PERF_REG_S390_FP15:
650 case PERF_REG_S390_MASK:
652 case PERF_REG_S390_PC:
661 static const char *__perf_reg_name_x86(int id)
664 case PERF_REG_X86_AX:
666 case PERF_REG_X86_BX:
668 case PERF_REG_X86_CX:
670 case PERF_REG_X86_DX:
672 case PERF_REG_X86_SI:
674 case PERF_REG_X86_DI:
676 case PERF_REG_X86_BP:
678 case PERF_REG_X86_SP:
680 case PERF_REG_X86_IP:
682 case PERF_REG_X86_FLAGS:
684 case PERF_REG_X86_CS:
686 case PERF_REG_X86_SS:
688 case PERF_REG_X86_DS:
690 case PERF_REG_X86_ES:
692 case PERF_REG_X86_FS:
694 case PERF_REG_X86_GS:
696 case PERF_REG_X86_R8:
698 case PERF_REG_X86_R9:
700 case PERF_REG_X86_R10:
702 case PERF_REG_X86_R11:
704 case PERF_REG_X86_R12:
706 case PERF_REG_X86_R13:
708 case PERF_REG_X86_R14:
710 case PERF_REG_X86_R15:
714 case PERF_REG_X86_XMM ## x: \
715 case PERF_REG_X86_XMM ## x + 1: \
741 const char *perf_reg_name(int id, const char *arch)
743 const char *reg_name = NULL;
745 if (!strcmp(arch, "csky"))
746 reg_name = __perf_reg_name_csky(id);
747 else if (!strcmp(arch, "loongarch"))
748 reg_name = __perf_reg_name_loongarch(id);
749 else if (!strcmp(arch, "mips"))
750 reg_name = __perf_reg_name_mips(id);
751 else if (!strcmp(arch, "powerpc"))
752 reg_name = __perf_reg_name_powerpc(id);
753 else if (!strcmp(arch, "riscv"))
754 reg_name = __perf_reg_name_riscv(id);
755 else if (!strcmp(arch, "s390"))
756 reg_name = __perf_reg_name_s390(id);
757 else if (!strcmp(arch, "x86"))
758 reg_name = __perf_reg_name_x86(id);
759 else if (!strcmp(arch, "arm"))
760 reg_name = __perf_reg_name_arm(id);
761 else if (!strcmp(arch, "arm64"))
762 reg_name = __perf_reg_name_arm64(id);
764 return reg_name ?: "unknown";
767 int perf_reg_value(u64 *valp, struct regs_dump *regs, int id)
770 u64 mask = regs->mask;
772 if ((u64)id >= PERF_SAMPLE_REGS_CACHE_SIZE)
775 if (regs->cache_mask & (1ULL << id))
778 if (!(mask & (1ULL << id)))
781 for (i = 0; i < id; i++) {
782 if (mask & (1ULL << i))
786 regs->cache_mask |= (1ULL << id);
787 regs->cache_regs[id] = regs->regs[idx];
790 *valp = regs->cache_regs[id];