Michael Ellerman [mich...@ellerman.id.au] wrote:
| From: Michael Ellerman <micha...@au1.ibm.com>
| 
| On power8 we have a new SIER (Sampled Instruction Event Register), which
| captures information about instructions when we have random sampling
| enabled.
| 
| Add support for loading the SIER into pt_regs, overloading regs->dar.
| Also set the new NO_SIPR flag in regs->result if we don't have SIPR.
| 
| Update regs_sihv/sipr() to look for SIPR/SIHV in SIER.
| 
| Signed-off-by: Michael Ellerman <micha...@au1.ibm.com>
| ---
|  arch/powerpc/include/asm/perf_event_server.h |    1 +
|  arch/powerpc/perf/core-book3s.c              |   19 +++++++++++++++++++
|  2 files changed, 20 insertions(+)
| 
| diff --git a/arch/powerpc/include/asm/perf_event_server.h 
b/arch/powerpc/include/asm/perf_event_server.h
| index e287aef..a1a1ad8 100644
| --- a/arch/powerpc/include/asm/perf_event_server.h
| +++ b/arch/powerpc/include/asm/perf_event_server.h
| @@ -53,6 +53,7 @@ struct power_pmu {
|  #define PPMU_NO_CONT_SAMPLING        0x00000008 /* no continuous sampling */
|  #define PPMU_SIAR_VALID              0x00000010 /* Processor has SIAR Valid 
bit */
|  #define PPMU_HAS_SSLOT               0x00000020 /* Has sampled slot in MMCRA 
*/
| +#define PPMU_HAS_SIER                0x00000040 /* Has SIER */
| 
|  /*
|   * Values for flags to get_alternatives()
| diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c
| index 4255b12..a4bbd4d 100644
| --- a/arch/powerpc/perf/core-book3s.c
| +++ b/arch/powerpc/perf/core-book3s.c
| @@ -116,6 +116,9 @@ static bool regs_sihv(struct pt_regs *regs)
|  {
|       unsigned long sihv = MMCRA_SIHV;
| 
| +     if (ppmu->flags & PPMU_HAS_SIER)
| +             return !!(regs->dar & SIER_SIHV);
| +

Were SIER_SIHV and SIER_SIPR defined in an earlier patch set ?

|       if (ppmu->flags & PPMU_ALT_SIPR)
|               sihv = POWER6_MMCRA_SIHV;
| 
| @@ -126,6 +129,9 @@ static bool regs_sipr(struct pt_regs *regs)
|  {
|       unsigned long sipr = MMCRA_SIPR;
| 
| +     if (ppmu->flags & PPMU_HAS_SIER)
| +             return !!(regs->dar & SIER_SIPR);
| +
|       if (ppmu->flags & PPMU_ALT_SIPR)
|               sipr = POWER6_MMCRA_SIPR;
| 
| @@ -184,6 +190,7 @@ static inline u32 perf_get_misc_flags(struct pt_regs 
*regs)
|  /*
|   * Overload regs->dsisr to store MMCRA so we only need to read it once
|   * on each interrupt.
| + * Overload regs->dar to store SIER if we have it.
|   * Overload regs->result to specify whether we should use the MSR (result
|   * is zero) or the SIAR (result is non zero).
|   */
| @@ -200,6 +207,18 @@ static inline void perf_read_regs(struct pt_regs *regs)
|               regs->result |= 2;
| 
|       /*
| +      * On power8 if we're in random sampling mode, the SIER is updated.
| +      * If we're in continuous sampling mode, we don't have SIPR.
| +      */
| +     if (ppmu->flags & PPMU_HAS_SIER) {
| +             if (marked)
| +                     regs->dar = mfspr(SPRN_SIER);
| +             else
| +                     regs->result |= 2;

Can we use a helper, regs_set_no_sipr() to set this - since we set and
test in more than one place ?

Other than these nits, the patchset looks good.

Sukadev

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to