*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)
 
 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)
        }
 
        /* 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;
 }
 
        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.
                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;
 }