Seregon/ShadPKG

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

C++/47.3 KB/No license
common/elf_info.h
ShadPKG / common / elf_info.h
1// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3 
4#pragma once
5 
6#include <string>
7#include <string_view>
8 
9#include "assert.h"
10#include "bit_field.h"
11#include "singleton.h"
12#include "types.h"
13 
14namespace Core {
15class Emulator;
16}
17 
18namespace Common {
19 
20union PSFAttributes {
21 /// Supports initial user's logout
22 BitField<0, 1, u32> support_initial_user_logout;
23 /// Enter button for the common dialog is cross.
24 BitField<1, 1, u32> enter_button_cross;
25 /// Warning dialog for PS Move is displayed in the options menu.
26 BitField<2, 1, u32> ps_move_warning;
27 /// Supports stereoscopic 3D.
28 BitField<3, 1, u32> support_stereoscopic_3d;
29 /// Suspends when PS button is pressed.
30 BitField<4, 1, u32> ps_button_suspend;
31 /// Enter button for the common dialog is assigned by the system software.
32 BitField<5, 1, u32> enter_button_system;
33 /// Overrides share menu behavior.
34 BitField<6, 1, u32> override_share_menu;
35 /// Suspends when PS button is pressed and special output resolution is set.
36 BitField<8, 1, u32> special_res_ps_button_suspend;
37 /// Enable HDCP.
38 BitField<9, 1, u32> enable_hdcp;
39 /// Disable HDCP for non-game.
40 BitField<10, 1, u32> disable_hdcp_non_game;
41 /// Supports PS VR.
42 BitField<14, 1, u32> support_ps_vr;
43 /// CPU mode (6 CPU)
44 BitField<15, 1, u32> six_cpu_mode;
45 /// CPU mode (7 CPU)
46 BitField<16, 1, u32> seven_cpu_mode;
47 /// Supports PS4 Pro (Neo) mode.
48 BitField<23, 1, u32> support_neo_mode;
49 /// Requires PS VR.
50 BitField<26, 1, u32> require_ps_vr;
51 /// Supports HDR.
52 BitField<29, 1, u32> support_hdr;
53 /// Display location.
54 BitField<31, 1, u32> display_location;
55 
56 u32 raw{};
57};
58static_assert(sizeof(PSFAttributes) == 4);
59 
60class ElfInfo {
61 friend class Core::Emulator;
62 
63 bool initialized = false;
64 
65 std::string game_serial{};
66 std::string title{};
67 std::string app_ver{};
68 u32 firmware_ver = 0;
69 u32 raw_firmware_ver = 0;
70 PSFAttributes psf_attributes{};
71 
72public:
73 static constexpr u32 FW_15 = 0x1500000;
74 static constexpr u32 FW_16 = 0x1600000;
75 static constexpr u32 FW_17 = 0x1700000;
76 static constexpr u32 FW_20 = 0x2000000;
77 static constexpr u32 FW_25 = 0x2500000;
78 static constexpr u32 FW_30 = 0x3000000;
79 static constexpr u32 FW_35 = 0x3500000;
80 static constexpr u32 FW_40 = 0x4000000;
81 static constexpr u32 FW_45 = 0x4500000;
82 static constexpr u32 FW_50 = 0x5000000;
83 static constexpr u32 FW_55 = 0x5500000;
84 static constexpr u32 FW_80 = 0x8000000;
85 
86 static ElfInfo& Instance() {
87 return *Singleton<ElfInfo>::Instance();
88 }
89 
90 [[nodiscard]] std::string_view GameSerial() const {
91 ASSERT(initialized);
92 return Instance().game_serial;
93 }
94 
95 [[nodiscard]] std::string_view Title() const {
96 ASSERT(initialized);
97 return title;
98 }
99 
100 [[nodiscard]] std::string_view AppVer() const {
101 ASSERT(initialized);
102 return app_ver;
103 }
104 
105 [[nodiscard]] u32 FirmwareVer() const {
106 ASSERT(initialized);
107 return firmware_ver;
108 }
109 
110 [[nodiscard]] u32 RawFirmwareVer() const {
111 ASSERT(initialized);
112 return raw_firmware_ver;
113 }
114 
115 [[nodiscard]] const PSFAttributes& GetPSFAttributes() const {
116 ASSERT(initialized);
117 return psf_attributes;
118 }
119};
120 
121} // namespace Common
122