Skip to content

Commit 781fa48

Browse files
anjutsudhakarmpe
authored andcommitted
powerpc/perf: Add support for outputting extended regs in perf intr_regs
Add support for perf extended register capability in powerpc. The capability flag PERF_PMU_CAP_EXTENDED_REGS, is used to indicate the PMU which support extended registers. The generic code define the mask of extended registers as 0 for non supported architectures. Patch adds extended regs support for power9 platform by exposing MMCR0, MMCR1 and MMCR2 registers. REG_RESERVED mask needs update to include extended regs. PERF_REG_EXTENDED_MASK, contains mask value of the supported registers, is defined at runtime in the kernel based on platform since the supported registers may differ from one processor version to another and hence the MASK value. With the patch: available registers: r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 nip msr orig_r3 ctr link xer ccr softe trap dar dsisr sier mmcra mmcr0 mmcr1 mmcr2 PERF_RECORD_SAMPLE(IP, 0x1): 4784/4784: 0 period: 1 addr: 0 ... intr regs: mask 0xffffffffffff ABI 64-bit .... r0 0xc00000000012b77c .... r1 0xc000003fe5e03930 .... r2 0xc000000001b0e000 .... r3 0xc000003fdcddf800 .... r4 0xc000003fc7880000 .... r5 0x9c422724be .... r6 0xc000003fe5e03908 .... r7 0xffffff63bddc8706 .... r8 0x9e4 .... r9 0x0 .... r10 0x1 .... r11 0x0 .... r12 0xc0000000001299c0 .... r13 0xc000003ffffc4800 .... r14 0x0 .... r15 0x7fffdd8b8b00 .... r16 0x0 .... r17 0x7fffdd8be6b8 .... r18 0x7e7076607730 .... r19 0x2f .... r20 0xc00000001fc26c68 .... r21 0xc0002041e4227e00 .... r22 0xc00000002018fb60 .... r23 0x1 .... r24 0xc000003ffec4d900 .... r25 0x80000000 .... r26 0x0 .... r27 0x1 .... r28 0x1 .... r29 0xc000000001be1260 .... r30 0x6008010 .... r31 0xc000003ffebb7218 .... nip 0xc00000000012b910 .... msr 0x9000000000009033 .... orig_r3 0xc00000000012b86c .... ctr 0xc0000000001299c0 .... link 0xc00000000012b77c .... xer 0x0 .... ccr 0x28002222 .... softe 0x1 .... trap 0xf00 .... dar 0x0 .... dsisr 0x80000000000 .... sier 0x0 .... mmcra 0x80000000000 .... mmcr0 0x82008090 .... mmcr1 0x1e000000 .... mmcr2 0x0 ... thread: perf:4784 Signed-off-by: Anju T Sudhakar <[email protected]> Signed-off-by: Athira Rajeev <[email protected]> Tested-by: Nageswara R Sastry <[email protected]> Reviewed-by: Madhavan Srinivasan <[email protected]> Reviewed-by: Kajol Jain <[email protected]> Reviewed-and-tested-by: Ravi Bangoria <[email protected]> Signed-off-by: Michael Ellerman <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 030a2c6 commit 781fa48

File tree

6 files changed

+59
-4
lines changed

6 files changed

+59
-4
lines changed

arch/powerpc/include/asm/perf_event.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,7 @@ static inline bool is_sier_available(void) { return false; }
4040

4141
/* To support perf_regs sier update */
4242
extern bool is_sier_available(void);
43+
/* To define perf extended regs mask value */
44+
extern u64 PERF_REG_EXTENDED_MASK;
45+
#define PERF_REG_EXTENDED_MASK PERF_REG_EXTENDED_MASK
4346
#endif

arch/powerpc/include/asm/perf_event_server.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ struct power_pmu {
6262
int *blacklist_ev;
6363
/* BHRB entries in the PMU */
6464
int bhrb_nr;
65+
/*
66+
* set this flag with `PERF_PMU_CAP_EXTENDED_REGS` if
67+
* the pmu supports extended perf regs capability
68+
*/
69+
int capabilities;
6570
};
6671

6772
/*

arch/powerpc/include/uapi/asm/perf_regs.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,18 @@ enum perf_event_powerpc_regs {
4848
PERF_REG_POWERPC_DSISR,
4949
PERF_REG_POWERPC_SIER,
5050
PERF_REG_POWERPC_MMCRA,
51-
PERF_REG_POWERPC_MAX,
51+
/* Extended registers */
52+
PERF_REG_POWERPC_MMCR0,
53+
PERF_REG_POWERPC_MMCR1,
54+
PERF_REG_POWERPC_MMCR2,
55+
/* Max regs without the extended regs */
56+
PERF_REG_POWERPC_MAX = PERF_REG_POWERPC_MMCRA + 1,
5257
};
58+
59+
#define PERF_REG_PMU_MASK ((1ULL << PERF_REG_POWERPC_MAX) - 1)
60+
61+
/* PERF_REG_EXTENDED_MASK value for CPU_FTR_ARCH_300 */
62+
#define PERF_REG_PMU_MASK_300 (((1ULL << (PERF_REG_POWERPC_MMCR2 + 1)) - 1) - PERF_REG_PMU_MASK)
63+
64+
#define PERF_REG_MAX_ISA_300 (PERF_REG_POWERPC_MMCR2 + 1)
5365
#endif /* _UAPI_ASM_POWERPC_PERF_REGS_H */

arch/powerpc/perf/core-book3s.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2323,6 +2323,7 @@ int register_power_pmu(struct power_pmu *pmu)
23232323
pmu->name);
23242324

23252325
power_pmu.attr_groups = ppmu->attr_groups;
2326+
power_pmu.capabilities |= (ppmu->capabilities & PERF_PMU_CAP_EXTENDED_REGS);
23262327

23272328
#ifdef MSR_HV
23282329
/*

arch/powerpc/perf/perf_regs.c

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@
1313
#include <asm/ptrace.h>
1414
#include <asm/perf_regs.h>
1515

16+
u64 PERF_REG_EXTENDED_MASK;
17+
1618
#define PT_REGS_OFFSET(id, r) [id] = offsetof(struct pt_regs, r)
1719

18-
#define REG_RESERVED (~((1ULL << PERF_REG_POWERPC_MAX) - 1))
20+
#define REG_RESERVED (~(PERF_REG_EXTENDED_MASK | PERF_REG_PMU_MASK))
1921

2022
static unsigned int pt_regs_offset[PERF_REG_POWERPC_MAX] = {
2123
PT_REGS_OFFSET(PERF_REG_POWERPC_R0, gpr[0]),
@@ -69,10 +71,26 @@ static unsigned int pt_regs_offset[PERF_REG_POWERPC_MAX] = {
6971
PT_REGS_OFFSET(PERF_REG_POWERPC_MMCRA, dsisr),
7072
};
7173

74+
/* Function to return the extended register values */
75+
static u64 get_ext_regs_value(int idx)
76+
{
77+
switch (idx) {
78+
case PERF_REG_POWERPC_MMCR0:
79+
return mfspr(SPRN_MMCR0);
80+
case PERF_REG_POWERPC_MMCR1:
81+
return mfspr(SPRN_MMCR1);
82+
case PERF_REG_POWERPC_MMCR2:
83+
return mfspr(SPRN_MMCR2);
84+
default: return 0;
85+
}
86+
}
87+
7288
u64 perf_reg_value(struct pt_regs *regs, int idx)
7389
{
74-
if (WARN_ON_ONCE(idx >= PERF_REG_POWERPC_MAX))
75-
return 0;
90+
u64 perf_reg_extended_max = PERF_REG_POWERPC_MAX;
91+
92+
if (cpu_has_feature(CPU_FTR_ARCH_300))
93+
perf_reg_extended_max = PERF_REG_MAX_ISA_300;
7694

7795
if (idx == PERF_REG_POWERPC_SIER &&
7896
(IS_ENABLED(CONFIG_FSL_EMB_PERF_EVENT) ||
@@ -85,6 +103,16 @@ u64 perf_reg_value(struct pt_regs *regs, int idx)
85103
IS_ENABLED(CONFIG_PPC32)))
86104
return 0;
87105

106+
if (idx >= PERF_REG_POWERPC_MAX && idx < perf_reg_extended_max)
107+
return get_ext_regs_value(idx);
108+
109+
/*
110+
* If the idx is referring to value beyond the
111+
* supported registers, return 0 with a warning
112+
*/
113+
if (WARN_ON_ONCE(idx >= perf_reg_extended_max))
114+
return 0;
115+
88116
return regs_get_register(regs, pt_regs_offset[idx]);
89117
}
90118

arch/powerpc/perf/power9-pmu.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ enum {
9090
#define POWER9_MMCRA_IFM3 0x00000000C0000000UL
9191
#define POWER9_MMCRA_BHRB_MASK 0x00000000C0000000UL
9292

93+
extern u64 PERF_REG_EXTENDED_MASK;
94+
9395
/* Nasty Power9 specific hack */
9496
#define PVR_POWER9_CUMULUS 0x00002000
9597

@@ -434,6 +436,7 @@ static struct power_pmu power9_pmu = {
434436
.cache_events = &power9_cache_events,
435437
.attr_groups = power9_pmu_attr_groups,
436438
.bhrb_nr = 32,
439+
.capabilities = PERF_PMU_CAP_EXTENDED_REGS,
437440
};
438441

439442
int init_power9_pmu(void)
@@ -457,6 +460,9 @@ int init_power9_pmu(void)
457460
}
458461
}
459462

463+
/* Set the PERF_REG_EXTENDED_MASK here */
464+
PERF_REG_EXTENDED_MASK = PERF_REG_PMU_MASK_300;
465+
460466
rc = register_power_pmu(&power9_pmu);
461467
if (rc)
462468
return rc;

0 commit comments

Comments
 (0)