Commit 5682c460 authored by Michael Ellerman's avatar Michael Ellerman Committed by Benjamin Herrenschmidt

powerpc/perf: Convert mmcra_sipr/sihv() to regs_sipr/sihv()

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: default avatarMichael Ellerman <michael@ellerman.id.au>
Acked-by: default avatarPaul Mackerras <paulus@samba.org>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent 7a786832
...@@ -131,24 +131,24 @@ static inline void perf_get_data_addr(struct pt_regs *regs, u64 *addrp) ...@@ -131,24 +131,24 @@ static inline void perf_get_data_addr(struct pt_regs *regs, u64 *addrp)
*addrp = mfspr(SPRN_SDAR); *addrp = mfspr(SPRN_SDAR);
} }
static bool mmcra_sihv(unsigned long mmcra) static bool regs_sihv(struct pt_regs *regs)
{ {
unsigned long sihv = MMCRA_SIHV; unsigned long sihv = MMCRA_SIHV;
if (ppmu->flags & PPMU_ALT_SIPR) if (ppmu->flags & PPMU_ALT_SIPR)
sihv = POWER6_MMCRA_SIHV; 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; unsigned long sipr = MMCRA_SIPR;
if (ppmu->flags & PPMU_ALT_SIPR) if (ppmu->flags & PPMU_ALT_SIPR)
sipr = POWER6_MMCRA_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_flags_from_msr(struct pt_regs *regs)
...@@ -162,7 +162,6 @@ 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) static inline u32 perf_get_misc_flags(struct pt_regs *regs)
{ {
unsigned long mmcra = regs->dsisr;
unsigned long use_siar = regs->result; unsigned long use_siar = regs->result;
if (!use_siar) if (!use_siar)
...@@ -182,10 +181,12 @@ static inline u32 perf_get_misc_flags(struct pt_regs *regs) ...@@ -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 */ /* PR has priority over HV, so order below is important */
if (mmcra_sipr(mmcra)) if (regs_sipr(regs))
return PERF_RECORD_MISC_USER; 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_HYPERVISOR;
return PERF_RECORD_MISC_KERNEL; return PERF_RECORD_MISC_KERNEL;
} }
...@@ -201,6 +202,8 @@ static inline void perf_read_regs(struct pt_regs *regs) ...@@ -201,6 +202,8 @@ static inline void perf_read_regs(struct pt_regs *regs)
int marked = mmcra & MMCRA_SAMPLE_ENABLE; int marked = mmcra & MMCRA_SAMPLE_ENABLE;
int use_siar; int use_siar;
regs->dsisr = mmcra;
/* /*
* If this isn't a PMU exception (eg a software event) the SIAR is * If this isn't a PMU exception (eg a software event) the SIAR is
* not valid. Use pt_regs. * not valid. Use pt_regs.
...@@ -224,12 +227,11 @@ static inline void perf_read_regs(struct pt_regs *regs) ...@@ -224,12 +227,11 @@ static inline void perf_read_regs(struct pt_regs *regs)
use_siar = 1; use_siar = 1;
else if ((ppmu->flags & PPMU_NO_CONT_SAMPLING)) else if ((ppmu->flags & PPMU_NO_CONT_SAMPLING))
use_siar = 0; 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; use_siar = 0;
else else
use_siar = 1; use_siar = 1;
regs->dsisr = mmcra;
regs->result = use_siar; regs->result = use_siar;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment