diff options
Diffstat (limited to 'arch/arm/oprofile/common.c')
| -rw-r--r-- | arch/arm/oprofile/common.c | 45 | 
1 files changed, 28 insertions, 17 deletions
diff --git a/arch/arm/oprofile/common.c b/arch/arm/oprofile/common.c index 4e0a371630b3..99c63d4b6af8 100644 --- a/arch/arm/oprofile/common.c +++ b/arch/arm/oprofile/common.c @@ -23,26 +23,37 @@  #include <asm/ptrace.h>  #ifdef CONFIG_HW_PERF_EVENTS + +/* + * OProfile has a curious naming scheme for the ARM PMUs, but they are + * part of the user ABI so we need to map from the perf PMU name for + * supported PMUs. + */ +static struct op_perf_name { +	char *perf_name; +	char *op_name; +} op_perf_name_map[] = { +	{ "xscale1",		"arm/xscale1"	}, +	{ "xscale1",		"arm/xscale2"	}, +	{ "v6",			"arm/armv6"	}, +	{ "v6mpcore",		"arm/mpcore"	}, +	{ "ARMv7 Cortex-A8",	"arm/armv7"	}, +	{ "ARMv7 Cortex-A9",	"arm/armv7-ca9"	}, +}; +  char *op_name_from_perf_id(void)  { -	enum arm_perf_pmu_ids id = armpmu_get_pmu_id(); - -	switch (id) { -	case ARM_PERF_PMU_ID_XSCALE1: -		return "arm/xscale1"; -	case ARM_PERF_PMU_ID_XSCALE2: -		return "arm/xscale2"; -	case ARM_PERF_PMU_ID_V6: -		return "arm/armv6"; -	case ARM_PERF_PMU_ID_V6MP: -		return "arm/mpcore"; -	case ARM_PERF_PMU_ID_CA8: -		return "arm/armv7"; -	case ARM_PERF_PMU_ID_CA9: -		return "arm/armv7-ca9"; -	default: -		return NULL; +	int i; +	struct op_perf_name names; +	const char *perf_name = perf_pmu_name(); + +	for (i = 0; i < ARRAY_SIZE(op_perf_name_map); ++i) { +		names = op_perf_name_map[i]; +		if (!strcmp(names.perf_name, perf_name)) +			return names.op_name;  	} + +	return NULL;  }  #endif  | 
