Explorar el Código

X64 Clock: Reduce accuracy to be less or equal to guest accuracy.

Fernando Sahmkow hace 6 años
padre
commit
534466754f

+ 2 - 1
src/common/x64/native_clock.cpp

@@ -62,7 +62,8 @@ u64 NativeClock::GetRTSC() {
     }
     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) {

+ 5 - 0
src/common/x64/native_clock.h

@@ -31,6 +31,11 @@ public:
 private:
     u64 GetRTSC();
 
+    /// value used to reduce the native clocks accuracy as some apss rely on
+    /// undefined behavior where the level of accuracy in the clock shouldn't
+    /// be higher.
+    static constexpr u64 inaccuracy_mask = ~(0x100 - 1);
+
     SpinLock rtsc_serialize{};
     u64 last_measure{};
     u64 accumulated_ticks{};

+ 3 - 0
src/core/arm/dynarmic/arm_dynarmic_64.cpp

@@ -184,6 +184,9 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable&
         config.enable_fast_dispatch = false;
     }
 
+    // CNTPCT uses wall clock.
+    config.wall_clock_cntpct = true;
+
     return std::make_shared<Dynarmic::A64::Jit>(config);
 }