6 #ifndef WIDTH_EXTENDER_HEADER_ 7 #define WIDTH_EXTENDER_HEADER_ 35 virtual uint64 operator () () = 0;
41 std::shared_ptr<SafeMsrHandle> msr;
43 MsrHandleCounter(std::shared_ptr<SafeMsrHandle> msr_, uint64 msr_addr_) : msr(msr_), msr_addr(msr_addr_) { }
47 msr->read(msr_addr, &value);
52 template <u
int64 (FreeRunningBWCounters::*F)()>
55 std::shared_ptr<FreeRunningBWCounters> clientBW;
56 ClientImcCounter(std::shared_ptr<FreeRunningBWCounters> clientBW_) : clientBW(clientBW_) { }
57 uint64 operator () () {
return (clientBW.get()->*F)(); }
68 std::shared_ptr<SafeMsrHandle> msr;
69 MBLCounter(std::shared_ptr<SafeMsrHandle> msr_) : msr(msr_) { }
74 uint64 msr_qm_evtsel = 0, value = 0;
75 msr->read(IA32_QM_EVTSEL, &msr_qm_evtsel);
77 msr_qm_evtsel &= 0xfffffffffffffff0ULL;
78 msr_qm_evtsel |=
event & ((1ULL << 8) - 1ULL);
81 msr->write(IA32_QM_EVTSEL, msr_qm_evtsel);
82 msr->read(IA32_QM_CTR, &value);
91 std::shared_ptr<SafeMsrHandle> msr;
92 MBTCounter(std::shared_ptr<SafeMsrHandle> msr_) : msr(msr_) { }
97 uint64 msr_qm_evtsel = 0, value = 0;
98 msr->read(IA32_QM_EVTSEL, &msr_qm_evtsel);
100 msr_qm_evtsel &= 0xfffffffffffffff0ULL;
101 msr_qm_evtsel |=
event & ((1ULL << 8) - 1ULL);
104 msr->write(IA32_QM_EVTSEL, msr_qm_evtsel);
105 msr->read(IA32_QM_CTR, &value);
113 std::thread * UpdateThread;
118 uint64 extended_value;
119 uint64 last_raw_value;
120 uint64 counter_width;
121 uint32 watchdog_delay_ms;
128 uint64 internal_read()
130 uint64 result = 0, new_raw_value = 0;
133 new_raw_value = (*raw_counter)();
134 if (new_raw_value < last_raw_value)
136 extended_value += ((1ULL << counter_width) - last_raw_value) + new_raw_value;
140 extended_value += (new_raw_value - last_raw_value);
143 last_raw_value = new_raw_value;
145 result = extended_value;
147 CounterMutex.unlock();
158 return internal_read();
163 extended_value = last_raw_value = (*raw_counter)();
164 CounterMutex.unlock();
Definition: width_extender.h:30
Some common utility routines.
Definition: width_extender.h:39
Definition: width_extender.h:89
Main CPU counters header.
Definition: width_extender.h:53
Definition: width_extender.h:33
Definition: width_extender.h:66
Interfaces to access free-running bandwidth counters.