mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-11 23:23:52 +08:00
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: Michael Ellerman <michael@ellerman.id.au> Acked-by: Paul Mackerras <paulus@samba.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
parent
7a7868326d
commit
5682c46026
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user