powerpc/perf: Add regs_no_sipr()
authorMichael Ellerman <michael@ellerman.id.au>
Thu, 25 Apr 2013 19:28:26 +0000 (19:28 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Fri, 26 Apr 2013 06:11:09 +0000 (16:11 +1000)
On power8 the presence or absence of SIPR depends on settings at runtime,
so convert to using a dynamic flag for NO_SIPR. Existing backends that
set NO_SIPR unconditionally set the dynamic flag obviously.

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Acked-by: Paul Mackerras <paulus@samba.org>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/perf/core-book3s.c

index 5d3000178736fdc8962147d5ab4e839979e06778..1c13c3d899a6eb3d0d73bb2e28772f4515ae9afd 100644 (file)
@@ -156,6 +156,11 @@ static bool regs_sipr(struct pt_regs *regs)
        return !!(regs->dsisr & sipr);
 }
 
+static bool regs_no_sipr(struct pt_regs *regs)
+{
+       return !!(regs->result & 2);
+}
+
 static inline u32 perf_flags_from_msr(struct pt_regs *regs)
 {
        if (regs->msr & MSR_PR)
@@ -178,7 +183,7 @@ static inline u32 perf_get_misc_flags(struct pt_regs *regs)
         * SIAR which should give slightly more reliable
         * results
         */
-       if (ppmu->flags & PPMU_NO_SIPR) {
+       if (regs_no_sipr(regs)) {
                unsigned long siar = mfspr(SPRN_SIAR);
                if (siar >= PAGE_OFFSET)
                        return PERF_RECORD_MISC_KERNEL;
@@ -208,6 +213,10 @@ static inline void perf_read_regs(struct pt_regs *regs)
        int use_siar;
 
        regs->dsisr = mmcra;
+       regs->result = 0;
+
+       if (ppmu->flags & PPMU_NO_SIPR)
+               regs->result |= 2;
 
        /*
         * If this isn't a PMU exception (eg a software event) the SIAR is
@@ -232,12 +241,12 @@ static inline void perf_read_regs(struct pt_regs *regs)
                use_siar = 1;
        else if ((ppmu->flags & PPMU_NO_CONT_SAMPLING))
                use_siar = 0;
-       else if (!(ppmu->flags & PPMU_NO_SIPR) && regs_sipr(regs))
+       else if (!regs_no_sipr(regs) && regs_sipr(regs))
                use_siar = 0;
        else
                use_siar = 1;
 
-       regs->result = use_siar;
+       regs->result |= use_siar;
 }
 
 /*