diff options
Diffstat (limited to 'src/cpu/kvm/timer.hh')
-rw-r--r-- | src/cpu/kvm/timer.hh | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/cpu/kvm/timer.hh b/src/cpu/kvm/timer.hh index a5105e7fa..df60b7227 100644 --- a/src/cpu/kvm/timer.hh +++ b/src/cpu/kvm/timer.hh @@ -42,6 +42,7 @@ #include <ctime> +#include "cpu/kvm/perfevent.hh" #include "sim/core.hh" /** @@ -203,4 +204,44 @@ class PosixKvmTimer : public BaseKvmTimer timer_t timer; }; +/** + * PerfEvent based timer using the host's CPU cycle counter. + * + * @warning There is a known problem in some versions of the PerfEvent + * API that prevents the counter overflow period from being updated + * reliably, which might break this timer. See PerfKvmCounter::period() + * for details. + */ +class PerfKvmTimer : public BaseKvmTimer +{ + public: + /** + * Create a timer that uses an existing hardware cycle counter. + * + * @note The performance counter must be configured for overflow + * sampling, which in practice means that it must have a non-zero + * sample period. The initial sample period is ignored since + * period will be updated when arm() is called. + * + * @param ctr Attached performance counter configured for overflow + * reporting. + * @param signo Signal to deliver + * @param hostFactor Performance scaling factor + * @param hostFreq Clock frequency of the host + */ + PerfKvmTimer(PerfKvmCounter &ctr, + int signo, + float hostFactor, Tick hostFreq); + ~PerfKvmTimer(); + + void arm(Tick ticks); + void disarm(); + + protected: + Tick calcResolution(); + + private: + PerfKvmCounter &hwOverflow; +}; + #endif |