projects
/
lttng-ust.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix: perf counters: sign-extend pmc register
[lttng-ust.git]
/
liblttng-ust
/
lttng-context-perf-counters.c
diff --git
a/liblttng-ust/lttng-context-perf-counters.c
b/liblttng-ust/lttng-context-perf-counters.c
index 97ddf977d1ba17706ae337bb66d3c1241da13038..c3728867af8f018d202ea38e8f126b51bd8015ac 100644
(file)
--- a/
liblttng-ust/lttng-context-perf-counters.c
+++ b/
liblttng-ust/lttng-context-perf-counters.c
@@
-110,11
+110,17
@@
uint64_t read_perf_counter(struct perf_event_mmap_page *pc)
cmm_barrier();
idx = pc->index;
cmm_barrier();
idx = pc->index;
- if (idx)
- count = pc->offset + rdpmc(idx - 1);
- else
+ if (idx) {
+ int64_t pmcval;
+
+ pmcval = rdpmc(idx - 1);
+ /* Sign-extend the pmc register result. */
+ pmcval <<= 64 - pc->pmc_width;
+ pmcval >>= 64 - pc->pmc_width;
+ count = pc->offset + pmcval;
+ } else {
count = 0;
count = 0;
-
+ }
cmm_barrier();
} while (CMM_LOAD_SHARED(pc->lock) != seq);
cmm_barrier();
} while (CMM_LOAD_SHARED(pc->lock) != seq);
This page took
0.023926 seconds
and
4
git commands to generate.