[PATCH] [ppc64] POWER4 oprofile update

Anton Blanchard anton at samba.org
Tue Aug 17 04:08:47 EST 2004


POWER4 oprofile updates from Carl Love.

- Create mmcr0, mmcr1, mmcra oprofilefs files.
- Use kernel and user profile disable bits. (Some modifications by me)

Signed-off-by: Anton Blanchard <anton at samba.org>

diff -puN arch/ppc64/oprofile/common.c~oprofile-1 arch/ppc64/oprofile/common.c
--- foobar2/arch/ppc64/oprofile/common.c~oprofile-1	2004-08-15 07:28:56.850539856 +1000
+++ foobar2-anton/arch/ppc64/oprofile/common.c	2004-08-16 06:00:30.420792426 +1000
@@ -90,6 +90,14 @@ static int op_ppc64_create_files(struct
 {
 	int i;

+	/*
+	 * There is one mmcr0, mmcr1 and mmcra for setting the events for
+	 * all of the counters.
+	 */
+	oprofilefs_create_ulong(sb, root, "mmcr0", &sys.mmcr0);
+	oprofilefs_create_ulong(sb, root, "mmcr1", &sys.mmcr1);
+	oprofilefs_create_ulong(sb, root, "mmcra", &sys.mmcra);
+
 	for (i = 0; i < model->num_counters; ++i) {
 		struct dentry *dir;
 		char buf[3];
@@ -112,6 +120,10 @@ static int op_ppc64_create_files(struct
 	oprofilefs_create_ulong(sb, root, "enable_kernel", &sys.enable_kernel);
 	oprofilefs_create_ulong(sb, root, "enable_user", &sys.enable_user);

+	/* Default to tracing both kernel and user */
+	sys.enable_kernel = 1;
+	sys.enable_user = 1;
+
 	return 0;
 }

diff -puN arch/ppc64/oprofile/op_impl.h~oprofile-1 arch/ppc64/oprofile/op_impl.h
--- foobar2/arch/ppc64/oprofile/op_impl.h~oprofile-1	2004-08-15 07:28:56.856539395 +1000
+++ foobar2-anton/arch/ppc64/oprofile/op_impl.h	2004-08-16 06:02:45.825786713 +1000
@@ -19,6 +19,12 @@
 /* freeze counters. set to 1 on a perfmon exception */
 #define MMCR0_FC	(1UL << (31 - 0))

+/* freeze in supervisor state */
+#define MMCR0_KERNEL_DISABLE (1UL << (31 - 1))
+
+/* freeze in problem state */
+#define MMCR0_PROBLEM_DISABLE (1UL << (31 - 2))
+
 /* freeze counters while MSR mark = 1 */
 #define MMCR0_FCM1	(1UL << (31 - 3))

@@ -28,15 +34,15 @@
 /* freeze counters on enabled condition or event */
 #define MMCR0_FCECE	(1UL << (31 - 6))

-/* performance monitor alert has occurred, set to 0 after handling exception */
-#define MMCR0_PMAO	(1UL << (31 - 24))
-
 /* PMC1 count enable*/
 #define MMCR0_PMC1INTCONTROL	(1UL << (31 - 16))

 /* PMCn count enable*/
 #define MMCR0_PMCNINTCONTROL	(1UL << (31 - 17))

+/* performance monitor alert has occurred, set to 0 after handling exception */
+#define MMCR0_PMAO	(1UL << (31 - 24))
+
 /* state of MSR HV when SIAR set */
 #define MMCRA_SIHV	(1UL << (63 - 35))

@@ -60,6 +66,9 @@ struct op_counter_config {

 /* System-wide configuration as set via oprofilefs.  */
 struct op_system_config {
+	unsigned long mmcr0;
+	unsigned long mmcr1;
+	unsigned long mmcra;
 	unsigned long enable_kernel;
 	unsigned long enable_user;
 };
diff -puN arch/ppc64/oprofile/op_model_power4.c~oprofile-1 arch/ppc64/oprofile/op_model_power4.c
--- foobar2/arch/ppc64/oprofile/op_model_power4.c~oprofile-1	2004-08-15 07:28:56.863538857 +1000
+++ foobar2-anton/arch/ppc64/oprofile/op_model_power4.c	2004-08-16 06:00:31.582969777 +1000
@@ -27,6 +27,11 @@ static int num_counters;
 static int oprofile_running;
 static int mmcra_has_sihv;

+/* mmcr values are set in power4_reg_setup, used in power4_cpu_setup */
+static u32 mmcr0_val;
+static u64 mmcr1_val;
+static u32 mmcra_val;
+
 static void power4_reg_setup(struct op_counter_config *ctr,
 			     struct op_system_config *sys,
 			     int num_ctrs)
@@ -45,18 +50,36 @@ static void power4_reg_setup(struct op_c
 	if (cur_cpu_spec->cpu_features & CPU_FTR_MMCRA_SIHV)
 		mmcra_has_sihv = 1;

+	/*
+	 * The performance counter event settings are given in the mmcr0,
+	 * mmcr1 and mmcra values passed from the user in the
+	 * op_system_config structure (sys variable).
+	 */
+	mmcr0_val = sys->mmcr0;
+	mmcr1_val = sys->mmcr1;
+	mmcra_val = sys->mmcra;
+
 	for (i = 0; i < num_counters; ++i)
 		reset_value[i] = 0x80000000UL - ctr[i].count;

-	/* XXX setup user and kernel profiling */
+	/* setup user and kernel profiling */
+	if (sys->enable_kernel)
+		mmcr0_val &= ~MMCR0_KERNEL_DISABLE;
+	else
+		mmcr0_val |= MMCR0_KERNEL_DISABLE;
+
+	if (sys->enable_user)
+		mmcr0_val &= ~MMCR0_PROBLEM_DISABLE;
+	else
+		mmcr0_val |= MMCR0_PROBLEM_DISABLE;
 }

 extern void ppc64_enable_pmcs(void);

 static void power4_cpu_setup(void *unused)
 {
-	unsigned int mmcr0 = mfspr(SPRN_MMCR0);
-	unsigned long mmcra = mfspr(SPRN_MMCRA);
+	unsigned int mmcr0 = mmcr0_val;
+	unsigned long mmcra = mmcra_val;

 	ppc64_enable_pmcs();

@@ -68,6 +91,8 @@ static void power4_cpu_setup(void *unuse
 	mmcr0 |= MMCR0_PMC1INTCONTROL|MMCR0_PMCNINTCONTROL;
 	mtspr(SPRN_MMCR0, mmcr0);

+	mtspr(SPRN_MMCR1, mmcr1_val);
+
 	mmcra |= MMCRA_SAMPLE_ENABLE;
 	mtspr(SPRN_MMCRA, mmcra);

_

** Sent via the linuxppc64-dev mail list. See http://lists.linuxppc.org/





More information about the Linuxppc64-dev mailing list