Skip to content
Snippets Groups Projects
Commit 5b7ec71f authored by Fernando Sahmkow's avatar Fernando Sahmkow Committed by FernandoS27
Browse files

Correct CNTPCT to use Clock Cycles instead of Cpu Cycles.

parent 99da6362
No related branches found
No related tags found
No related merge requests found
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "core/core.h" #include "core/core.h"
#include "core/core_cpu.h" #include "core/core_cpu.h"
#include "core/core_timing.h" #include "core/core_timing.h"
#include "core/core_timing_util.h"
#include "core/gdbstub/gdbstub.h" #include "core/gdbstub/gdbstub.h"
#include "core/hle/kernel/process.h" #include "core/hle/kernel/process.h"
#include "core/hle/kernel/svc.h" #include "core/hle/kernel/svc.h"
...@@ -119,7 +120,7 @@ public: ...@@ -119,7 +120,7 @@ public:
return std::max(parent.core_timing.GetDowncount(), 0); return std::max(parent.core_timing.GetDowncount(), 0);
} }
u64 GetCNTPCT() override { u64 GetCNTPCT() override {
return parent.core_timing.GetTicks(); return CpuCyclesToClockCycles(parent.core_timing.GetTicks());
} }
ARM_Dynarmic& parent; ARM_Dynarmic& parent;
...@@ -151,7 +152,7 @@ std::unique_ptr<Dynarmic::A64::Jit> ARM_Dynarmic::MakeJit() const { ...@@ -151,7 +152,7 @@ std::unique_ptr<Dynarmic::A64::Jit> ARM_Dynarmic::MakeJit() const {
config.tpidr_el0 = &cb->tpidr_el0; config.tpidr_el0 = &cb->tpidr_el0;
config.dczid_el0 = 4; config.dczid_el0 = 4;
config.ctr_el0 = 0x8444c004; config.ctr_el0 = 0x8444c004;
config.cntfrq_el0 = 19200000; // Value from fusee. config.cntfrq_el0 = Timing::CNTFREQ; // Value from fusee.
// Unpredictable instructions // Unpredictable instructions
config.define_unpredictable_behaviour = true; config.define_unpredictable_behaviour = true;
......
...@@ -60,4 +60,11 @@ s64 nsToCycles(u64 ns) { ...@@ -60,4 +60,11 @@ s64 nsToCycles(u64 ns) {
return (BASE_CLOCK_RATE * static_cast<s64>(ns)) / 1000000000; return (BASE_CLOCK_RATE * static_cast<s64>(ns)) / 1000000000;
} }
u64 CpuCyclesToClockCycles(u64 ticks) {
u64 result = ticks;
result *= CNTFREQ;
result /= BASE_CLOCK_RATE;
return static_cast<u64>(result);
}
} // namespace Core::Timing } // namespace Core::Timing
...@@ -11,6 +11,7 @@ namespace Core::Timing { ...@@ -11,6 +11,7 @@ namespace Core::Timing {
// The below clock rate is based on Switch's clockspeed being widely known as 1.020GHz // The below clock rate is based on Switch's clockspeed being widely known as 1.020GHz
// The exact value used is of course unverified. // The exact value used is of course unverified.
constexpr u64 BASE_CLOCK_RATE = 1019215872; // Switch clock speed is 1020MHz un/docked constexpr u64 BASE_CLOCK_RATE = 1019215872; // Switch clock speed is 1020MHz un/docked
constexpr u64 CNTFREQ = 19200000; // Value from fusee.
inline s64 msToCycles(int ms) { inline s64 msToCycles(int ms) {
// since ms is int there is no way to overflow // since ms is int there is no way to overflow
...@@ -61,4 +62,6 @@ inline u64 cyclesToMs(s64 cycles) { ...@@ -61,4 +62,6 @@ inline u64 cyclesToMs(s64 cycles) {
return cycles * 1000 / BASE_CLOCK_RATE; return cycles * 1000 / BASE_CLOCK_RATE;
} }
u64 CpuCyclesToClockCycles(u64 ticks);
} // namespace Core::Timing } // namespace Core::Timing
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment