Seregon/ShadPKG

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

C++/47.3 KB/No license
common/rdtsc.h
ShadPKG / common / rdtsc.h
1// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3 
4#pragma once
5 
6#include "common/arch.h"
7 
8#ifdef _MSC_VER
9#include <intrin.h>
10#endif
11 
12#include "common/shadpkg_types.h"
13 
14namespace Common {
15 
16#ifdef _MSC_VER
17__forceinline static u64 FencedRDTSC() {
18#ifdef ARCH_X86_64
19 _mm_lfence();
20 _ReadWriteBarrier();
21 const u64 result = __rdtsc();
22 _mm_lfence();
23 _ReadWriteBarrier();
24 return result;
25#else
26#error "Missing FencedRDTSC() implementation for target CPU architecture."
27#endif
28}
29#else
30static inline u64 FencedRDTSC() {
31#ifdef ARCH_X86_64
32 u64 eax;
33 u64 edx;
34 asm volatile("lfence\n\t"
35 "rdtsc\n\t"
36 "lfence\n\t"
37 : "=a"(eax), "=d"(edx));
38 return (edx << 32) | eax;
39#elif defined(ARCH_ARM64)
40 u64 ret;
41 asm volatile("isb\n\t"
42 "mrs %0, cntvct_el0\n\t"
43 "isb\n\t"
44 : "=r"(ret)::"memory");
45 return ret;
46#else
47#error "Missing FencedRDTSC() implementation for target CPU architecture."
48#endif
49}
50#endif
51 
52u64 EstimateRDTSCFrequency();
53 
54} // namespace Common
55