diff --git a/src/common/utils/time.hpp b/src/common/utils/time.hpp index e2d2e5c6..25236fe0 100644 --- a/src/common/utils/time.hpp +++ b/src/common/utils/time.hpp @@ -6,6 +6,8 @@ #if defined(_MSC_VER) #include #pragma intrinsic(__rdtsc) +#elif defined(__x86_64__) || defined(__i386__) || defined(__amd64__) +#include #endif constexpr auto HUNDRED_NANOSECONDS_IN_ONE_SECOND = 10000000LL; @@ -44,12 +46,10 @@ namespace utils #endif #elif defined(__x86_64__) || defined(__i386__) || defined(__amd64__) // If we are using clang or gcc - unsigned int lo, hi; - __asm__ __volatile__("rdtsc" : "=a"(lo), "=d"(hi)); - return ((uint64_t)hi << 32) | lo; + return __rdtsc(); // 64-bit with clang/gcc intrinsic #endif - return static_cast(std::chrono::high_resolution_clock::now().time_since_epoch().count()) * - 3.8; // should be base cpu frequency here; + int64_t count = std::chrono::high_resolution_clock::now().time_since_epoch().count(); + return static_cast((count * 38LL) / 10LL); } }; diff --git a/src/windows-emulator/windows_emulator.cpp b/src/windows-emulator/windows_emulator.cpp index d127d569..4db7c843 100644 --- a/src/windows-emulator/windows_emulator.cpp +++ b/src/windows-emulator/windows_emulator.cpp @@ -448,21 +448,15 @@ void windows_emulator::setup_hooks() }); this->emu().hook_instruction(x64_hookable_instructions::rdtsc, [&] { - uint64_t ticks = this->clock_.get()->timestamp_counter(); + uint64_t ticks = this->clock_->timestamp_counter(); static uint64_t fake_ticks = ticks; static uint64_t prev_ticks = 0; - if (prev_ticks != 0) + if (ticks > prev_ticks) { - if (ticks > prev_ticks) - { - fake_ticks += (ticks - prev_ticks); - } - } - if (fake_ticks > ticks) - { - fake_ticks = ticks; + fake_ticks += (ticks - prev_ticks); } + fake_ticks = std::min(fake_ticks, ticks); prev_ticks = ticks; this->emu().reg(x64_register::rax, fake_ticks & 0xFFFFFFFF);