diff options
author | bunnei <bunneidev@gmail.com> | 2020-06-28 12:37:50 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-28 12:37:50 -0400 |
commit | b05795d704e0c194215f815a5703db09e524b59a (patch) | |
tree | ecf4023b4ee0c91555c1d8263762fcb9dcb04a17 /src/common/x64/native_clock.cpp | |
parent | 8596a127724e9d7e27c4d7d9becd323c8d6d4f8e (diff) | |
parent | 2f8947583f2f0af4058600243d6c1d244e3c4890 (diff) |
Merge pull request #3955 from FernandoS27/prometheus-2b
Remake Kernel Scheduling, CPU Management & Boot Management (Prometheus)
Diffstat (limited to 'src/common/x64/native_clock.cpp')
-rw-r--r-- | src/common/x64/native_clock.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/common/x64/native_clock.cpp b/src/common/x64/native_clock.cpp index 26d4d0ba6..424b39b1f 100644 --- a/src/common/x64/native_clock.cpp +++ b/src/common/x64/native_clock.cpp @@ -3,6 +3,7 @@ // Refer to the license.txt file included. #include <chrono> +#include <mutex> #include <thread> #ifdef _MSC_VER @@ -52,7 +53,7 @@ NativeClock::NativeClock(u64 emulated_cpu_frequency, u64 emulated_clock_frequenc } u64 NativeClock::GetRTSC() { - rtsc_serialize.lock(); + std::scoped_lock scope{rtsc_serialize}; _mm_mfence(); const u64 current_measure = __rdtsc(); u64 diff = current_measure - last_measure; @@ -61,8 +62,15 @@ u64 NativeClock::GetRTSC() { last_measure = current_measure; } accumulated_ticks += diff; - rtsc_serialize.unlock(); - return accumulated_ticks; + /// The clock cannot be more precise than the guest timer, remove the lower bits + return accumulated_ticks & inaccuracy_mask; +} + +void NativeClock::Pause(bool is_paused) { + if (!is_paused) { + _mm_mfence(); + last_measure = __rdtsc(); + } } std::chrono::nanoseconds NativeClock::GetTimeNS() { |