Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+11 −9
Original line number Original line Diff line number Diff line
@@ -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)


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)
	}
	}


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