summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRemy Noel <mocramis@gmail.com>2018-04-21 10:39:07 +0200
committerRemy Noel <mocramis@gmail.com>2018-04-21 10:39:07 +0200
commit7fa079430524d77eeec1e3e3097aba8f3c42b173 (patch)
treead51fabfb80f6922f6d45b404c18a702688c77de
parentaf9d9e6ee727c3f4b879a0980e4d2835399f533a (diff)
perfmon: fix overflo test only working on 64 bit counters.
-rw-r--r--kern/perfmon.c6
-rw-r--r--kern/perfmon_i.h5
-rw-r--r--test/test_perfmon_cpu.c7
3 files changed, 15 insertions, 3 deletions
diff --git a/kern/perfmon.c b/kern/perfmon.c
index 4bedd99..e7a1dfd 100644
--- a/kern/perfmon.c
+++ b/kern/perfmon.c
@@ -632,6 +632,12 @@ perfmon_event_write(struct perfmon_event *event, uint64_t value)
return 0;
}
+int
+perfmon_get_pmc_width(void)
+{
+ return pmu_driver.get_pmc_width();
+}
+
#endif /* CONFIG_PERFMON_TEST */
void
diff --git a/kern/perfmon_i.h b/kern/perfmon_i.h
index 5cb4d45..28cf16b 100644
--- a/kern/perfmon_i.h
+++ b/kern/perfmon_i.h
@@ -32,6 +32,11 @@
*/
int perfmon_event_write(struct perfmon_event *event, uint64_t value);
+/*
+ * Returns the bit width of the register used in perfmon.
+ */
+int perfmon_get_pmc_width(void);
+
#endif /* CONFIG_PERFMON_TEST */
#endif /* _KERN_PERFMON_H */
diff --git a/test/test_perfmon_cpu.c b/test/test_perfmon_cpu.c
index 60db729..8ecb241 100644
--- a/test/test_perfmon_cpu.c
+++ b/test/test_perfmon_cpu.c
@@ -55,9 +55,11 @@ test_run(void *arg)
struct perfmon_event *ev_cycle, *ev_instruction;
struct perfmon_group *group;
int error;
+ uint64_t pmc_max;
(void)arg;
+ pmc_max = (1 << perfmon_get_pmc_width()) - 1;
error = perfmon_group_create(&group);
error_check(error, "perfmon_group_create");
@@ -85,10 +87,9 @@ test_run(void *arg)
printf("checking with overflow ...\n");
/* TODO: choose value depending of architecture */
- perfmon_event_write(ev_cycle,
- UINT64_MAX - perfmon_event_read(ev_cycle) / 2);
+ perfmon_event_write(ev_cycle, pmc_max - perfmon_event_read(ev_cycle) / 2);
perfmon_event_write(ev_instruction,
- UINT64_MAX - perfmon_event_read(ev_instruction) / 3);
+ pmc_max - perfmon_event_read(ev_instruction) / 3);
perfmon_event_reset(ev_cycle);
perfmon_event_reset(ev_instruction);