diff --git a/rpcs3/Emu/Cell/lv2/sys_time.cpp b/rpcs3/Emu/Cell/lv2/sys_time.cpp index 93199296ae..178aaa429a 100644 --- a/rpcs3/Emu/Cell/lv2/sys_time.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_time.cpp @@ -6,6 +6,8 @@ #include "util/asm.hpp" +u64 timebase_offset; + #ifdef _WIN32 #include @@ -141,15 +143,22 @@ u64 get_timebased_time() const u64 time = count.QuadPart; const u64 freq = s_time_aux_info.perf_freq; - return (time / freq * g_timebase_freq + time % freq * g_timebase_freq / freq) * g_cfg.core.clocks_scale / 100u; + return ((time / freq * g_timebase_freq + time % freq * g_timebase_freq / freq) * g_cfg.core.clocks_scale / 100u) - timebase_offset; #else struct timespec ts; ensure(::clock_gettime(CLOCK_MONOTONIC, &ts) == 0); - return (static_cast(ts.tv_sec) * g_timebase_freq + static_cast(ts.tv_nsec) * g_timebase_freq / 1000000000ull) * g_cfg.core.clocks_scale / 100u; + return ((static_cast(ts.tv_sec) * g_timebase_freq + static_cast(ts.tv_nsec) * g_timebase_freq / 1000000000ull) * g_cfg.core.clocks_scale / 100u) - timebase_offset; #endif } +// Add an offset to get_timebased_time to avoid leaking PC's uptime into the game +void initalize_timebased_time() +{ + timebase_offset = 0; + timebase_offset = get_timebased_time(); +} + // Returns some relative time in microseconds, don't change this fact u64 get_system_time() { diff --git a/rpcs3/Emu/Cell/timers.hpp b/rpcs3/Emu/Cell/timers.hpp index bdc7a8b88e..ee9b58bb69 100644 --- a/rpcs3/Emu/Cell/timers.hpp +++ b/rpcs3/Emu/Cell/timers.hpp @@ -3,5 +3,6 @@ #include "util/types.hpp" u64 get_timebased_time(); +void initalize_timebased_time(); u64 get_system_time(); u64 get_guest_system_time(); diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index d7d040cd03..b386e806b5 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -642,6 +642,8 @@ game_boot_result Emulator::Load(const std::string& title_id, bool add_only, bool } } + initalize_timebased_time(); + // Set RTM usage g_use_rtm = utils::has_rtm() && ((utils::has_mpx() && g_cfg.core.enable_TSX == tsx_usage::enabled) || g_cfg.core.enable_TSX == tsx_usage::forced);