summaryrefslogtreecommitdiff
path: root/src/core/core.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2019-06-26 10:26:44 -0400
committerGravatar GitHub2019-06-26 10:26:44 -0400
commit4ed2774c26602d6ee1af316da5faf391d377d701 (patch)
treea1ef0e65dfd79f8badde8dcd24014432428c51f8 /src/core/core.cpp
parentMerge pull request #2603 from WamWooWam/master (diff)
parentglue: Correct missing bytes in ApplicationLaunchParameter (diff)
downloadyuzu-4ed2774c26602d6ee1af316da5faf391d377d701.tar.gz
yuzu-4ed2774c26602d6ee1af316da5faf391d377d701.tar.xz
yuzu-4ed2774c26602d6ee1af316da5faf391d377d701.zip
Merge pull request #2607 from DarkLordZach/arp-1
glue: Implement arp:w and arp:r services
Diffstat (limited to 'src/core/core.cpp')
-rw-r--r--src/core/core.cpp66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp
index c00dfd33c..df26eb109 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -25,6 +25,7 @@
25#include "core/hle/kernel/scheduler.h" 25#include "core/hle/kernel/scheduler.h"
26#include "core/hle/kernel/thread.h" 26#include "core/hle/kernel/thread.h"
27#include "core/hle/service/am/applets/applets.h" 27#include "core/hle/service/am/applets/applets.h"
28#include "core/hle/service/glue/manager.h"
28#include "core/hle/service/service.h" 29#include "core/hle/service/service.h"
29#include "core/hle/service/sm/sm.h" 30#include "core/hle/service/sm/sm.h"
30#include "core/loader/loader.h" 31#include "core/loader/loader.h"
@@ -33,12 +34,37 @@
33#include "core/settings.h" 34#include "core/settings.h"
34#include "core/telemetry_session.h" 35#include "core/telemetry_session.h"
35#include "file_sys/cheat_engine.h" 36#include "file_sys/cheat_engine.h"
37#include "file_sys/patch_manager.h"
36#include "video_core/debug_utils/debug_utils.h" 38#include "video_core/debug_utils/debug_utils.h"
37#include "video_core/renderer_base.h" 39#include "video_core/renderer_base.h"
38#include "video_core/video_core.h" 40#include "video_core/video_core.h"
39 41
40namespace Core { 42namespace Core {
41 43
44namespace {
45
46FileSys::StorageId GetStorageIdForFrontendSlot(
47 std::optional<FileSys::ContentProviderUnionSlot> slot) {
48 if (!slot.has_value()) {
49 return FileSys::StorageId::None;
50 }
51
52 switch (*slot) {
53 case FileSys::ContentProviderUnionSlot::UserNAND:
54 return FileSys::StorageId::NandUser;
55 case FileSys::ContentProviderUnionSlot::SysNAND:
56 return FileSys::StorageId::NandSystem;
57 case FileSys::ContentProviderUnionSlot::SDMC:
58 return FileSys::StorageId::SdCard;
59 case FileSys::ContentProviderUnionSlot::FrontendManual:
60 return FileSys::StorageId::Host;
61 default:
62 return FileSys::StorageId::None;
63 }
64}
65
66} // Anonymous namespace
67
42/*static*/ System System::s_instance; 68/*static*/ System System::s_instance;
43 69
44FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs, 70FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs,
@@ -110,6 +136,9 @@ struct System::Impl {
110 /// Create default implementations of applets if one is not provided. 136 /// Create default implementations of applets if one is not provided.
111 applet_manager.SetDefaultAppletsIfMissing(); 137 applet_manager.SetDefaultAppletsIfMissing();
112 138
139 /// Reset all glue registrations
140 arp_manager.ResetAll();
141
113 telemetry_session = std::make_unique<Core::TelemetrySession>(); 142 telemetry_session = std::make_unique<Core::TelemetrySession>();
114 service_manager = std::make_shared<Service::SM::ServiceManager>(); 143 service_manager = std::make_shared<Service::SM::ServiceManager>();
115 144
@@ -161,6 +190,7 @@ struct System::Impl {
161 return static_cast<ResultStatus>(static_cast<u32>(ResultStatus::ErrorLoader) + 190 return static_cast<ResultStatus>(static_cast<u32>(ResultStatus::ErrorLoader) +
162 static_cast<u32>(load_result)); 191 static_cast<u32>(load_result));
163 } 192 }
193 AddGlueRegistrationForProcess(*app_loader, *main_process);
164 kernel.MakeCurrentProcess(main_process.get()); 194 kernel.MakeCurrentProcess(main_process.get());
165 195
166 // Main process has been loaded and been made current. 196 // Main process has been loaded and been made current.
@@ -219,6 +249,31 @@ struct System::Impl {
219 return app_loader->ReadTitle(out); 249 return app_loader->ReadTitle(out);
220 } 250 }
221 251
252 void AddGlueRegistrationForProcess(Loader::AppLoader& loader, Kernel::Process& process) {
253 std::vector<u8> nacp_data;
254 FileSys::NACP nacp;
255 if (loader.ReadControlData(nacp) == Loader::ResultStatus::Success) {
256 nacp_data = nacp.GetRawBytes();
257 } else {
258 nacp_data.resize(sizeof(FileSys::RawNACP));
259 }
260
261 Service::Glue::ApplicationLaunchProperty launch{};
262 launch.title_id = process.GetTitleID();
263
264 FileSys::PatchManager pm{launch.title_id};
265 launch.version = pm.GetGameVersion().value_or(0);
266
267 // TODO(DarkLordZach): When FSController/Game Card Support is added, if
268 // current_process_game_card use correct StorageId
269 launch.base_game_storage_id = GetStorageIdForFrontendSlot(content_provider->GetSlotForEntry(
270 launch.title_id, FileSys::ContentRecordType::Program));
271 launch.update_storage_id = GetStorageIdForFrontendSlot(content_provider->GetSlotForEntry(
272 FileSys::GetUpdateTitleID(launch.title_id), FileSys::ContentRecordType::Program));
273
274 arp_manager.Register(launch.title_id, launch, std::move(nacp_data));
275 }
276
222 void SetStatus(ResultStatus new_status, const char* details = nullptr) { 277 void SetStatus(ResultStatus new_status, const char* details = nullptr) {
223 status = new_status; 278 status = new_status;
224 if (details) { 279 if (details) {
@@ -249,6 +304,9 @@ struct System::Impl {
249 /// Frontend applets 304 /// Frontend applets
250 Service::AM::Applets::AppletManager applet_manager; 305 Service::AM::Applets::AppletManager applet_manager;
251 306
307 /// Glue services
308 Service::Glue::ARPManager arp_manager;
309
252 /// Service manager 310 /// Service manager
253 std::shared_ptr<Service::SM::ServiceManager> service_manager; 311 std::shared_ptr<Service::SM::ServiceManager> service_manager;
254 312
@@ -500,6 +558,14 @@ const Reporter& System::GetReporter() const {
500 return impl->reporter; 558 return impl->reporter;
501} 559}
502 560
561Service::Glue::ARPManager& System::GetARPManager() {
562 return impl->arp_manager;
563}
564
565const Service::Glue::ARPManager& System::GetARPManager() const {
566 return impl->arp_manager;
567}
568
503System::ResultStatus System::Init(Frontend::EmuWindow& emu_window) { 569System::ResultStatus System::Init(Frontend::EmuWindow& emu_window) {
504 return impl->Init(*this, emu_window); 570 return impl->Init(*this, emu_window);
505} 571}