diff options
author | Remy Noel <mocramis@gmail.com> | 2018-04-21 10:39:07 +0200 |
---|---|---|
committer | Remy Noel <mocramis@gmail.com> | 2018-04-21 10:39:07 +0200 |
commit | 7fa079430524d77eeec1e3e3097aba8f3c42b173 (patch) | |
tree | ad51fabfb80f6922f6d45b404c18a702688c77de | |
parent | af9d9e6ee727c3f4b879a0980e4d2835399f533a (diff) |
perfmon: fix overflo test only working on 64 bit counters.
-rw-r--r-- | kern/perfmon.c | 6 | ||||
-rw-r--r-- | kern/perfmon_i.h | 5 | ||||
-rw-r--r-- | test/test_perfmon_cpu.c | 7 |
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); |