|
@@ -14,9 +14,6 @@
|
|
*/
|
|
*/
|
|
|
|
|
|
#include <linux/oprofile.h>
|
|
#include <linux/oprofile.h>
|
|
-#ifndef __powerpc64__
|
|
|
|
-#include <linux/slab.h>
|
|
|
|
-#endif /* ! __powerpc64__ */
|
|
|
|
#include <linux/init.h>
|
|
#include <linux/init.h>
|
|
#include <linux/smp.h>
|
|
#include <linux/smp.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/errno.h>
|
|
@@ -31,10 +28,6 @@ static struct op_powerpc_model *model;
|
|
static struct op_counter_config ctr[OP_MAX_COUNTER];
|
|
static struct op_counter_config ctr[OP_MAX_COUNTER];
|
|
static struct op_system_config sys;
|
|
static struct op_system_config sys;
|
|
|
|
|
|
-#ifndef __powerpc64__
|
|
|
|
-static char *cpu_type;
|
|
|
|
-#endif /* ! __powerpc64__ */
|
|
|
|
-
|
|
|
|
static void op_handle_interrupt(struct pt_regs *regs)
|
|
static void op_handle_interrupt(struct pt_regs *regs)
|
|
{
|
|
{
|
|
model->handle_interrupt(regs, ctr);
|
|
model->handle_interrupt(regs, ctr);
|
|
@@ -53,14 +46,7 @@ static int op_powerpc_setup(void)
|
|
model->reg_setup(ctr, &sys, model->num_counters);
|
|
model->reg_setup(ctr, &sys, model->num_counters);
|
|
|
|
|
|
/* Configure the registers on all cpus. */
|
|
/* Configure the registers on all cpus. */
|
|
-#ifdef __powerpc64__
|
|
|
|
on_each_cpu(model->cpu_setup, NULL, 0, 1);
|
|
on_each_cpu(model->cpu_setup, NULL, 0, 1);
|
|
-#else /* __powerpc64__ */
|
|
|
|
-#if 0
|
|
|
|
- /* FIXME: Make multi-cpu work */
|
|
|
|
- on_each_cpu(model->reg_setup, NULL, 0, 1);
|
|
|
|
-#endif
|
|
|
|
-#endif /* __powerpc64__ */
|
|
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
@@ -95,7 +81,7 @@ static int op_powerpc_create_files(struct super_block *sb, struct dentry *root)
|
|
{
|
|
{
|
|
int i;
|
|
int i;
|
|
|
|
|
|
-#ifdef __powerpc64__
|
|
|
|
|
|
+#ifdef CONFIG_PPC64
|
|
/*
|
|
/*
|
|
* There is one mmcr0, mmcr1 and mmcra for setting the events for
|
|
* There is one mmcr0, mmcr1 and mmcra for setting the events for
|
|
* all of the counters.
|
|
* all of the counters.
|
|
@@ -103,7 +89,7 @@ static int op_powerpc_create_files(struct super_block *sb, struct dentry *root)
|
|
oprofilefs_create_ulong(sb, root, "mmcr0", &sys.mmcr0);
|
|
oprofilefs_create_ulong(sb, root, "mmcr0", &sys.mmcr0);
|
|
oprofilefs_create_ulong(sb, root, "mmcr1", &sys.mmcr1);
|
|
oprofilefs_create_ulong(sb, root, "mmcr1", &sys.mmcr1);
|
|
oprofilefs_create_ulong(sb, root, "mmcra", &sys.mmcra);
|
|
oprofilefs_create_ulong(sb, root, "mmcra", &sys.mmcra);
|
|
-#endif /* __powerpc64__ */
|
|
|
|
|
|
+#endif
|
|
|
|
|
|
for (i = 0; i < model->num_counters; ++i) {
|
|
for (i = 0; i < model->num_counters; ++i) {
|
|
struct dentry *dir;
|
|
struct dentry *dir;
|
|
@@ -115,65 +101,46 @@ static int op_powerpc_create_files(struct super_block *sb, struct dentry *root)
|
|
oprofilefs_create_ulong(sb, dir, "enabled", &ctr[i].enabled);
|
|
oprofilefs_create_ulong(sb, dir, "enabled", &ctr[i].enabled);
|
|
oprofilefs_create_ulong(sb, dir, "event", &ctr[i].event);
|
|
oprofilefs_create_ulong(sb, dir, "event", &ctr[i].event);
|
|
oprofilefs_create_ulong(sb, dir, "count", &ctr[i].count);
|
|
oprofilefs_create_ulong(sb, dir, "count", &ctr[i].count);
|
|
-#ifdef __powerpc64__
|
|
|
|
|
|
+
|
|
/*
|
|
/*
|
|
- * We dont support per counter user/kernel selection, but
|
|
|
|
- * we leave the entries because userspace expects them
|
|
|
|
|
|
+ * Classic PowerPC doesn't support per-counter
|
|
|
|
+ * control like this, but the options are
|
|
|
|
+ * expected, so they remain. For Freescale
|
|
|
|
+ * Book-E style performance monitors, we do
|
|
|
|
+ * support them.
|
|
*/
|
|
*/
|
|
-#endif /* __powerpc64__ */
|
|
|
|
oprofilefs_create_ulong(sb, dir, "kernel", &ctr[i].kernel);
|
|
oprofilefs_create_ulong(sb, dir, "kernel", &ctr[i].kernel);
|
|
oprofilefs_create_ulong(sb, dir, "user", &ctr[i].user);
|
|
oprofilefs_create_ulong(sb, dir, "user", &ctr[i].user);
|
|
|
|
|
|
-#ifndef __powerpc64__
|
|
|
|
- /* FIXME: Not sure if this is used */
|
|
|
|
-#endif /* ! __powerpc64__ */
|
|
|
|
oprofilefs_create_ulong(sb, dir, "unit_mask", &ctr[i].unit_mask);
|
|
oprofilefs_create_ulong(sb, dir, "unit_mask", &ctr[i].unit_mask);
|
|
}
|
|
}
|
|
|
|
|
|
oprofilefs_create_ulong(sb, root, "enable_kernel", &sys.enable_kernel);
|
|
oprofilefs_create_ulong(sb, root, "enable_kernel", &sys.enable_kernel);
|
|
oprofilefs_create_ulong(sb, root, "enable_user", &sys.enable_user);
|
|
oprofilefs_create_ulong(sb, root, "enable_user", &sys.enable_user);
|
|
-#ifdef __powerpc64__
|
|
|
|
|
|
+#ifdef CONFIG_PPC64
|
|
oprofilefs_create_ulong(sb, root, "backtrace_spinlocks",
|
|
oprofilefs_create_ulong(sb, root, "backtrace_spinlocks",
|
|
&sys.backtrace_spinlocks);
|
|
&sys.backtrace_spinlocks);
|
|
-#endif /* __powerpc64__ */
|
|
|
|
|
|
+#endif
|
|
|
|
|
|
/* Default to tracing both kernel and user */
|
|
/* Default to tracing both kernel and user */
|
|
sys.enable_kernel = 1;
|
|
sys.enable_kernel = 1;
|
|
sys.enable_user = 1;
|
|
sys.enable_user = 1;
|
|
-#ifdef __powerpc64__
|
|
|
|
|
|
+#ifdef CONFIG_PPC64
|
|
/* Turn on backtracing through spinlocks by default */
|
|
/* Turn on backtracing through spinlocks by default */
|
|
sys.backtrace_spinlocks = 1;
|
|
sys.backtrace_spinlocks = 1;
|
|
-#endif /* __powerpc64__ */
|
|
|
|
|
|
+#endif
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
int __init oprofile_arch_init(struct oprofile_operations *ops)
|
|
int __init oprofile_arch_init(struct oprofile_operations *ops)
|
|
{
|
|
{
|
|
-#ifndef __powerpc64__
|
|
|
|
-#ifdef CONFIG_FSL_BOOKE
|
|
|
|
- model = &op_model_fsl_booke;
|
|
|
|
-#else
|
|
|
|
- return -ENODEV;
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
- cpu_type = kmalloc(32, GFP_KERNEL);
|
|
|
|
- if (NULL == cpu_type)
|
|
|
|
- return -ENOMEM;
|
|
|
|
-
|
|
|
|
- sprintf(cpu_type, "ppc/%s", cur_cpu_spec->cpu_name);
|
|
|
|
-
|
|
|
|
- model->num_counters = cur_cpu_spec->num_pmcs;
|
|
|
|
-
|
|
|
|
- ops->cpu_type = cpu_type;
|
|
|
|
-#else /* __powerpc64__ */
|
|
|
|
if (!cur_cpu_spec->oprofile_model || !cur_cpu_spec->oprofile_cpu_type)
|
|
if (!cur_cpu_spec->oprofile_model || !cur_cpu_spec->oprofile_cpu_type)
|
|
return -ENODEV;
|
|
return -ENODEV;
|
|
model = cur_cpu_spec->oprofile_model;
|
|
model = cur_cpu_spec->oprofile_model;
|
|
model->num_counters = cur_cpu_spec->num_pmcs;
|
|
model->num_counters = cur_cpu_spec->num_pmcs;
|
|
|
|
|
|
ops->cpu_type = cur_cpu_spec->oprofile_cpu_type;
|
|
ops->cpu_type = cur_cpu_spec->oprofile_cpu_type;
|
|
-#endif /* __powerpc64__ */
|
|
|
|
ops->create_files = op_powerpc_create_files;
|
|
ops->create_files = op_powerpc_create_files;
|
|
ops->setup = op_powerpc_setup;
|
|
ops->setup = op_powerpc_setup;
|
|
ops->shutdown = op_powerpc_shutdown;
|
|
ops->shutdown = op_powerpc_shutdown;
|
|
@@ -188,8 +155,4 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
|
|
|
|
|
|
void oprofile_arch_exit(void)
|
|
void oprofile_arch_exit(void)
|
|
{
|
|
{
|
|
-#ifndef __powerpc64__
|
|
|
|
- kfree(cpu_type);
|
|
|
|
- cpu_type = NULL;
|
|
|
|
-#endif /* ! __powerpc64__ */
|
|
|
|
}
|
|
}
|