powerpc/perf: Convert mmcra_sipr/sihv() to regs_sipr/sihv()
authorMichael Ellerman <michael@ellerman.id.au>
Thu, 25 Apr 2013 19:28:24 +0000 (19:28 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Fri, 26 Apr 2013 06:11:08 +0000 (16:11 +1000)
On power8 the SIPR and SIHV are not in MMCRA, so convert the routines
to take regs and change the names accordingly.

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 eb644806f00e3dc243b6b0a0cba3eca4fd6e6387..2417fe2a57366e40a9dd21b05610ced91376388d 100644 (file)
@@ -131,24 +131,24 @@ static inline void perf_get_data_addr(struct pt_regs *regs, u64 *addrp)
                *addrp = mfspr(SPRN_SDAR);
 }
 
-static bool mmcra_sihv(unsigned long mmcra)
+static bool regs_sihv(struct pt_regs *regs)
 {
        unsigned long sihv = MMCRA_SIHV;
 
        if (ppmu->flags & PPMU_ALT_SIPR)
                sihv = POWER6_MMCRA_SIHV;
 
-       return !!(mmcra & sihv);
+       return !!(regs->dsisr & sihv);
 }
 
-static bool mmcra_sipr(unsigned long mmcra)
+static bool regs_sipr(struct pt_regs *regs)
 {
        unsigned long sipr = MMCRA_SIPR;
 
        if (ppmu->flags & PPMU_ALT_SIPR)
                sipr = POWER6_MMCRA_SIPR;
 
-       return !!(mmcra & sipr);
+       return !!(regs->dsisr & sipr);
 }
 
 static inline u32 perf_flags_from_msr(struct pt_regs *regs)
@@ -162,7 +162,6 @@ static inline u32 perf_flags_from_msr(struct pt_regs *regs)
 
 static inline u32 perf_get_misc_flags(struct pt_regs *regs)
 {
-       unsigned long mmcra = regs->dsisr;
        unsigned long use_siar = regs->result;
 
        if (!use_siar)
@@ -182,10 +181,12 @@ static inline u32 perf_get_misc_flags(struct pt_regs *regs)
        }
 
        /* PR has priority over HV, so order below is important */
-       if (mmcra_sipr(mmcra))
+       if (regs_sipr(regs))
                return PERF_RECORD_MISC_USER;
-       if (mmcra_sihv(mmcra) && (freeze_events_kernel != MMCR0_FCHV))
+
+       if (regs_sihv(regs) && (freeze_events_kernel != MMCR0_FCHV))
                return PERF_RECORD_MISC_HYPERVISOR;
+
        return PERF_RECORD_MISC_KERNEL;
 }
 
@@ -201,6 +202,8 @@ static inline void perf_read_regs(struct pt_regs *regs)
        int marked = mmcra & MMCRA_SAMPLE_ENABLE;
        int use_siar;
 
+       regs->dsisr = mmcra;
+
        /*
         * If this isn't a PMU exception (eg a software event) the SIAR is
         * not valid. Use pt_regs.
@@ -224,12 +227,11 @@ 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) && mmcra_sipr(mmcra))
+       else if (!(ppmu->flags & PPMU_NO_SIPR) && regs_sipr(regs))
                use_siar = 0;
        else
                use_siar = 1;
 
-       regs->dsisr = mmcra;
        regs->result = use_siar;
 }