X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=liblttng-ust%2Flttng-context-perf-counters.c;h=a7e1b63f4ab02f5666fbbe3c5c4a23b8dcda5a19;hb=4f58f54fdc949a00a05743ecf6d95144192c2ce2;hp=0b8f9fa2ee27bd1646d3785bc58668ea069063f7;hpb=380a81f4797534d6eadbba24ae80ed50a8e672f8;p=lttng-ust.git diff --git a/liblttng-ust/lttng-context-perf-counters.c b/liblttng-ust/lttng-context-perf-counters.c index 0b8f9fa2..a7e1b63f 100644 --- a/liblttng-ust/lttng-context-perf-counters.c +++ b/liblttng-ust/lttng-context-perf-counters.c @@ -113,11 +113,17 @@ uint64_t read_perf_counter( 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; - + } cmm_barrier(); } while (CMM_LOAD_SHARED(pc->lock) != seq);