Seregon/ShadPKG

A tool for deriving PKG packet encryption keys for ps4 written in c++

C++/47.3 KB/No license
common/native_clock.cpp
ShadPKG / common / native_clock.cpp
1// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3 
4#include "common/native_clock.h"
5#include "common/rdtsc.h"
6#include "common/uint128.h"
7 
8namespace Common {
9 
10NativeClock::NativeClock()
11 : rdtsc_frequency{EstimateRDTSCFrequency()},
12 ns_rdtsc_factor{GetFixedPoint64Factor(std::nano::den, rdtsc_frequency)},
13 us_rdtsc_factor{GetFixedPoint64Factor(std::micro::den, rdtsc_frequency)},
14 ms_rdtsc_factor{GetFixedPoint64Factor(std::milli::den, rdtsc_frequency)} {}
15 
16u64 NativeClock::GetTimeNS(u64 base_ptc /*= 0*/) const {
17 return MultiplyHigh(GetUptime() - base_ptc, ns_rdtsc_factor);
18}
19 
20u64 NativeClock::GetTimeUS(u64 base_ptc /*= 0*/) const {
21 return MultiplyHigh(GetUptime() - base_ptc, us_rdtsc_factor);
22}
23 
24u64 NativeClock::GetTimeMS(u64 base_ptc /*= 0*/) const {
25 return MultiplyHigh(GetUptime() - base_ptc, ms_rdtsc_factor);
26}
27 
28u64 NativeClock::GetUptime() const {
29 return FencedRDTSC();
30}
31 
32} // namespace Common
33