aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/powerpc/perf/core-book3s.c30
1 files changed, 6 insertions, 24 deletions
diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c
index 426180b84978..b2f873bc891b 100644
--- a/arch/powerpc/perf/core-book3s.c
+++ b/arch/powerpc/perf/core-book3s.c
@@ -110,7 +110,7 @@ static inline void power_pmu_bhrb_read(struct cpu_hw_events *cpuhw) {}
110 110
111static bool regs_use_siar(struct pt_regs *regs) 111static bool regs_use_siar(struct pt_regs *regs)
112{ 112{
113 return !!(regs->result & 1); 113 return !!regs->result;
114} 114}
115 115
116/* 116/*
@@ -181,11 +181,6 @@ static bool regs_sipr(struct pt_regs *regs)
181 return !!(regs->dsisr & sipr); 181 return !!(regs->dsisr & sipr);
182} 182}
183 183
184static bool regs_no_sipr(struct pt_regs *regs)
185{
186 return !!(regs->result & 2);
187}
188
189static inline u32 perf_flags_from_msr(struct pt_regs *regs) 184static inline u32 perf_flags_from_msr(struct pt_regs *regs)
190{ 185{
191 if (regs->msr & MSR_PR) 186 if (regs->msr & MSR_PR)
@@ -208,7 +203,7 @@ static inline u32 perf_get_misc_flags(struct pt_regs *regs)
208 * SIAR which should give slightly more reliable 203 * SIAR which should give slightly more reliable
209 * results 204 * results
210 */ 205 */
211 if (regs_no_sipr(regs)) { 206 if (ppmu->flags & PPMU_NO_SIPR) {
212 unsigned long siar = mfspr(SPRN_SIAR); 207 unsigned long siar = mfspr(SPRN_SIAR);
213 if (siar >= PAGE_OFFSET) 208 if (siar >= PAGE_OFFSET)
214 return PERF_RECORD_MISC_KERNEL; 209 return PERF_RECORD_MISC_KERNEL;
@@ -239,22 +234,9 @@ static inline void perf_read_regs(struct pt_regs *regs)
239 int use_siar; 234 int use_siar;
240 235
241 regs->dsisr = mmcra; 236 regs->dsisr = mmcra;
242 regs->result = 0;
243
244 if (ppmu->flags & PPMU_NO_SIPR)
245 regs->result |= 2;
246
247 /*
248 * On power8 if we're in random sampling mode, the SIER is updated.
249 * If we're in continuous sampling mode, we don't have SIPR.
250 */
251 if (ppmu->flags & PPMU_HAS_SIER) {
252 if (marked)
253 regs->dar = mfspr(SPRN_SIER);
254 else
255 regs->result |= 2;
256 }
257 237
238 if (ppmu->flags & PPMU_HAS_SIER)
239 regs->dar = mfspr(SPRN_SIER);
258 240
259 /* 241 /*
260 * If this isn't a PMU exception (eg a software event) the SIAR is 242 * If this isn't a PMU exception (eg a software event) the SIAR is
@@ -279,12 +261,12 @@ static inline void perf_read_regs(struct pt_regs *regs)
279 use_siar = 1; 261 use_siar = 1;
280 else if ((ppmu->flags & PPMU_NO_CONT_SAMPLING)) 262 else if ((ppmu->flags & PPMU_NO_CONT_SAMPLING))
281 use_siar = 0; 263 use_siar = 0;
282 else if (!regs_no_sipr(regs) && regs_sipr(regs)) 264 else if (!(ppmu->flags & PPMU_NO_SIPR) && regs_sipr(regs))
283 use_siar = 0; 265 use_siar = 0;
284 else 266 else
285 use_siar = 1; 267 use_siar = 1;
286 268
287 regs->result |= use_siar; 269 regs->result = use_siar;
288} 270}
289 271
290/* 272/*