Merge pull request #2884 from ogniK5377/deglobal-sys-services

Remove usage of System::CurrentInterface() from most services
This commit is contained in:
Fernando Sahmkow 2019-09-22 09:38:13 -04:00 committed by GitHub
commit 4ace69de9c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
64 changed files with 290 additions and 211 deletions

View File

@ -1066,7 +1066,7 @@ IApplicationFunctions::IApplicationFunctions(Core::System& system_)
RegisterHandlers(functions); RegisterHandlers(functions);
auto& kernel = Core::System::GetInstance().Kernel(); auto& kernel = system.Kernel();
gpu_error_detected_event = Kernel::WritableEvent::CreateEventPair( gpu_error_detected_event = Kernel::WritableEvent::CreateEventPair(
kernel, Kernel::ResetType::Manual, "IApplicationFunctions:GpuErrorDetectedSystemEvent"); kernel, Kernel::ResetType::Manual, "IApplicationFunctions:GpuErrorDetectedSystemEvent");
} }

View File

@ -29,9 +29,9 @@ static bool CheckAOCTitleIDMatchesBase(u64 title_id, u64 base) {
return (title_id & DLC_BASE_TITLE_ID_MASK) == base; return (title_id & DLC_BASE_TITLE_ID_MASK) == base;
} }
static std::vector<u64> AccumulateAOCTitleIDs() { static std::vector<u64> AccumulateAOCTitleIDs(Core::System& system) {
std::vector<u64> add_on_content; std::vector<u64> add_on_content;
const auto& rcu = Core::System::GetInstance().GetContentProvider(); const auto& rcu = system.GetContentProvider();
const auto list = const auto list =
rcu.ListEntriesFilter(FileSys::TitleType::AOC, FileSys::ContentRecordType::Data); rcu.ListEntriesFilter(FileSys::TitleType::AOC, FileSys::ContentRecordType::Data);
std::transform(list.begin(), list.end(), std::back_inserter(add_on_content), std::transform(list.begin(), list.end(), std::back_inserter(add_on_content),
@ -47,7 +47,8 @@ static std::vector<u64> AccumulateAOCTitleIDs() {
return add_on_content; return add_on_content;
} }
AOC_U::AOC_U() : ServiceFramework("aoc:u"), add_on_content(AccumulateAOCTitleIDs()) { AOC_U::AOC_U(Core::System& system)
: ServiceFramework("aoc:u"), add_on_content(AccumulateAOCTitleIDs(system)), system(system) {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, nullptr, "CountAddOnContentByApplicationId"}, {0, nullptr, "CountAddOnContentByApplicationId"},
@ -65,7 +66,7 @@ AOC_U::AOC_U() : ServiceFramework("aoc:u"), add_on_content(AccumulateAOCTitleIDs
RegisterHandlers(functions); RegisterHandlers(functions);
auto& kernel = Core::System::GetInstance().Kernel(); auto& kernel = system.Kernel();
aoc_change_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Manual, aoc_change_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Manual,
"GetAddOnContentListChanged:Event"); "GetAddOnContentListChanged:Event");
} }
@ -86,7 +87,7 @@ void AOC_U::CountAddOnContent(Kernel::HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 3}; IPC::ResponseBuilder rb{ctx, 3};
rb.Push(RESULT_SUCCESS); rb.Push(RESULT_SUCCESS);
const auto current = Core::System::GetInstance().CurrentProcess()->GetTitleID(); const auto current = system.CurrentProcess()->GetTitleID();
const auto& disabled = Settings::values.disabled_addons[current]; const auto& disabled = Settings::values.disabled_addons[current];
if (std::find(disabled.begin(), disabled.end(), "DLC") != disabled.end()) { if (std::find(disabled.begin(), disabled.end(), "DLC") != disabled.end()) {
@ -113,7 +114,7 @@ void AOC_U::ListAddOnContent(Kernel::HLERequestContext& ctx) {
LOG_DEBUG(Service_AOC, "called with offset={}, count={}, process_id={}", offset, count, LOG_DEBUG(Service_AOC, "called with offset={}, count={}, process_id={}", offset, count,
process_id); process_id);
const auto current = Core::System::GetInstance().CurrentProcess()->GetTitleID(); const auto current = system.CurrentProcess()->GetTitleID();
std::vector<u32> out; std::vector<u32> out;
const auto& disabled = Settings::values.disabled_addons[current]; const auto& disabled = Settings::values.disabled_addons[current];
@ -159,7 +160,7 @@ void AOC_U::GetAddOnContentBaseId(Kernel::HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 4}; IPC::ResponseBuilder rb{ctx, 4};
rb.Push(RESULT_SUCCESS); rb.Push(RESULT_SUCCESS);
const auto title_id = Core::System::GetInstance().CurrentProcess()->GetTitleID(); const auto title_id = system.CurrentProcess()->GetTitleID();
FileSys::PatchManager pm{title_id}; FileSys::PatchManager pm{title_id};
const auto res = pm.GetControlMetadata(); const auto res = pm.GetControlMetadata();
@ -196,8 +197,8 @@ void AOC_U::GetAddOnContentListChangedEvent(Kernel::HLERequestContext& ctx) {
rb.PushCopyObjects(aoc_change_event.readable); rb.PushCopyObjects(aoc_change_event.readable);
} }
void InstallInterfaces(SM::ServiceManager& service_manager) { void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) {
std::make_shared<AOC_U>()->InstallAsService(service_manager); std::make_shared<AOC_U>(system)->InstallAsService(service_manager);
} }
} // namespace Service::AOC } // namespace Service::AOC

View File

@ -14,7 +14,7 @@ namespace Service::AOC {
class AOC_U final : public ServiceFramework<AOC_U> { class AOC_U final : public ServiceFramework<AOC_U> {
public: public:
AOC_U(); explicit AOC_U(Core::System& system);
~AOC_U() override; ~AOC_U() override;
private: private:
@ -26,9 +26,10 @@ private:
std::vector<u64> add_on_content; std::vector<u64> add_on_content;
Kernel::EventPair aoc_change_event; Kernel::EventPair aoc_change_event;
Core::System& system;
}; };
/// Registers all AOC services with the specified service manager. /// Registers all AOC services with the specified service manager.
void InstallInterfaces(SM::ServiceManager& service_manager); void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system);
} // namespace Service::AOC } // namespace Service::AOC

View File

@ -16,7 +16,7 @@ namespace Service::BtDrv {
class Bt final : public ServiceFramework<Bt> { class Bt final : public ServiceFramework<Bt> {
public: public:
explicit Bt() : ServiceFramework{"bt"} { explicit Bt(Core::System& system) : ServiceFramework{"bt"} {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, nullptr, "LeClientReadCharacteristic"}, {0, nullptr, "LeClientReadCharacteristic"},
@ -33,7 +33,7 @@ public:
// clang-format on // clang-format on
RegisterHandlers(functions); RegisterHandlers(functions);
auto& kernel = Core::System::GetInstance().Kernel(); auto& kernel = system.Kernel();
register_event = Kernel::WritableEvent::CreateEventPair( register_event = Kernel::WritableEvent::CreateEventPair(
kernel, Kernel::ResetType::Automatic, "BT:RegisterEvent"); kernel, Kernel::ResetType::Automatic, "BT:RegisterEvent");
} }
@ -163,9 +163,9 @@ public:
} }
}; };
void InstallInterfaces(SM::ServiceManager& sm) { void InstallInterfaces(SM::ServiceManager& sm, Core::System& system) {
std::make_shared<BtDrv>()->InstallAsService(sm); std::make_shared<BtDrv>()->InstallAsService(sm);
std::make_shared<Bt>()->InstallAsService(sm); std::make_shared<Bt>(system)->InstallAsService(sm);
} }
} // namespace Service::BtDrv } // namespace Service::BtDrv

View File

@ -8,9 +8,13 @@ namespace Service::SM {
class ServiceManager; class ServiceManager;
} }
namespace Core {
class System;
}
namespace Service::BtDrv { namespace Service::BtDrv {
/// Registers all BtDrv services with the specified service manager. /// Registers all BtDrv services with the specified service manager.
void InstallInterfaces(SM::ServiceManager& sm); void InstallInterfaces(SM::ServiceManager& sm, Core::System& system);
} // namespace Service::BtDrv } // namespace Service::BtDrv

View File

@ -17,7 +17,7 @@ namespace Service::BTM {
class IBtmUserCore final : public ServiceFramework<IBtmUserCore> { class IBtmUserCore final : public ServiceFramework<IBtmUserCore> {
public: public:
explicit IBtmUserCore() : ServiceFramework{"IBtmUserCore"} { explicit IBtmUserCore(Core::System& system) : ServiceFramework{"IBtmUserCore"} {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, &IBtmUserCore::AcquireBleScanEvent, "AcquireBleScanEvent"}, {0, &IBtmUserCore::AcquireBleScanEvent, "AcquireBleScanEvent"},
@ -56,7 +56,7 @@ public:
// clang-format on // clang-format on
RegisterHandlers(functions); RegisterHandlers(functions);
auto& kernel = Core::System::GetInstance().Kernel(); auto& kernel = system.Kernel();
scan_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Automatic, scan_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Automatic,
"IBtmUserCore:ScanEvent"); "IBtmUserCore:ScanEvent");
connection_event = Kernel::WritableEvent::CreateEventPair( connection_event = Kernel::WritableEvent::CreateEventPair(
@ -108,7 +108,7 @@ private:
class BTM_USR final : public ServiceFramework<BTM_USR> { class BTM_USR final : public ServiceFramework<BTM_USR> {
public: public:
explicit BTM_USR() : ServiceFramework{"btm:u"} { explicit BTM_USR(Core::System& system) : ServiceFramework{"btm:u"}, system(system) {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, &BTM_USR::GetCore, "GetCore"}, {0, &BTM_USR::GetCore, "GetCore"},
@ -123,8 +123,10 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(RESULT_SUCCESS); rb.Push(RESULT_SUCCESS);
rb.PushIpcInterface<IBtmUserCore>(); rb.PushIpcInterface<IBtmUserCore>(system);
} }
Core::System& system;
}; };
class BTM final : public ServiceFramework<BTM> { class BTM final : public ServiceFramework<BTM> {
@ -268,11 +270,11 @@ private:
} }
}; };
void InstallInterfaces(SM::ServiceManager& sm) { void InstallInterfaces(SM::ServiceManager& sm, Core::System& system) {
std::make_shared<BTM>()->InstallAsService(sm); std::make_shared<BTM>()->InstallAsService(sm);
std::make_shared<BTM_DBG>()->InstallAsService(sm); std::make_shared<BTM_DBG>()->InstallAsService(sm);
std::make_shared<BTM_SYS>()->InstallAsService(sm); std::make_shared<BTM_SYS>()->InstallAsService(sm);
std::make_shared<BTM_USR>()->InstallAsService(sm); std::make_shared<BTM_USR>(system)->InstallAsService(sm);
} }
} // namespace Service::BTM } // namespace Service::BTM

View File

@ -8,8 +8,12 @@ namespace Service::SM {
class ServiceManager; class ServiceManager;
} }
namespace Core {
class System;
};
namespace Service::BTM { namespace Service::BTM {
void InstallInterfaces(SM::ServiceManager& sm); void InstallInterfaces(SM::ServiceManager& sm, Core::System& system);
} // namespace Service::BTM } // namespace Service::BTM

View File

@ -20,8 +20,8 @@
namespace Service::Fatal { namespace Service::Fatal {
Module::Interface::Interface(std::shared_ptr<Module> module, const char* name) Module::Interface::Interface(std::shared_ptr<Module> module, Core::System& system, const char* name)
: ServiceFramework(name), module(std::move(module)) {} : ServiceFramework(name), module(std::move(module)), system(system) {}
Module::Interface::~Interface() = default; Module::Interface::~Interface() = default;
@ -64,7 +64,8 @@ enum class FatalType : u32 {
ErrorScreen = 2, ErrorScreen = 2,
}; };
static void GenerateErrorReport(ResultCode error_code, const FatalInfo& info) { static void GenerateErrorReport(Core::System& system, ResultCode error_code,
const FatalInfo& info) {
const auto title_id = Core::CurrentProcess()->GetTitleID(); const auto title_id = Core::CurrentProcess()->GetTitleID();
std::string crash_report = fmt::format( std::string crash_report = fmt::format(
"Yuzu {}-{} crash report\n" "Yuzu {}-{} crash report\n"
@ -101,18 +102,19 @@ static void GenerateErrorReport(ResultCode error_code, const FatalInfo& info) {
LOG_ERROR(Service_Fatal, "{}", crash_report); LOG_ERROR(Service_Fatal, "{}", crash_report);
Core::System::GetInstance().GetReporter().SaveCrashReport( system.GetReporter().SaveCrashReport(
title_id, error_code, info.set_flags, info.program_entry_point, info.sp, info.pc, title_id, error_code, info.set_flags, info.program_entry_point, info.sp, info.pc,
info.pstate, info.afsr0, info.afsr1, info.esr, info.far, info.registers, info.backtrace, info.pstate, info.afsr0, info.afsr1, info.esr, info.far, info.registers, info.backtrace,
info.backtrace_size, info.ArchAsString(), info.unk10); info.backtrace_size, info.ArchAsString(), info.unk10);
} }
static void ThrowFatalError(ResultCode error_code, FatalType fatal_type, const FatalInfo& info) { static void ThrowFatalError(Core::System& system, ResultCode error_code, FatalType fatal_type,
const FatalInfo& info) {
LOG_ERROR(Service_Fatal, "Threw fatal error type {} with error code 0x{:X}", LOG_ERROR(Service_Fatal, "Threw fatal error type {} with error code 0x{:X}",
static_cast<u32>(fatal_type), error_code.raw); static_cast<u32>(fatal_type), error_code.raw);
switch (fatal_type) { switch (fatal_type) {
case FatalType::ErrorReportAndScreen: case FatalType::ErrorReportAndScreen:
GenerateErrorReport(error_code, info); GenerateErrorReport(system, error_code, info);
[[fallthrough]]; [[fallthrough]];
case FatalType::ErrorScreen: case FatalType::ErrorScreen:
// Since we have no fatal:u error screen. We should just kill execution instead // Since we have no fatal:u error screen. We should just kill execution instead
@ -120,7 +122,7 @@ static void ThrowFatalError(ResultCode error_code, FatalType fatal_type, const F
break; break;
// Should not throw a fatal screen but should generate an error report // Should not throw a fatal screen but should generate an error report
case FatalType::ErrorReport: case FatalType::ErrorReport:
GenerateErrorReport(error_code, info); GenerateErrorReport(system, error_code, info);
break; break;
} }
} }
@ -130,7 +132,7 @@ void Module::Interface::ThrowFatal(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx}; IPC::RequestParser rp{ctx};
const auto error_code = rp.Pop<ResultCode>(); const auto error_code = rp.Pop<ResultCode>();
ThrowFatalError(error_code, FatalType::ErrorScreen, {}); ThrowFatalError(system, error_code, FatalType::ErrorScreen, {});
IPC::ResponseBuilder rb{ctx, 2}; IPC::ResponseBuilder rb{ctx, 2};
rb.Push(RESULT_SUCCESS); rb.Push(RESULT_SUCCESS);
} }
@ -141,7 +143,8 @@ void Module::Interface::ThrowFatalWithPolicy(Kernel::HLERequestContext& ctx) {
const auto error_code = rp.Pop<ResultCode>(); const auto error_code = rp.Pop<ResultCode>();
const auto fatal_type = rp.PopEnum<FatalType>(); const auto fatal_type = rp.PopEnum<FatalType>();
ThrowFatalError(error_code, fatal_type, {}); // No info is passed with ThrowFatalWithPolicy ThrowFatalError(system, error_code, fatal_type,
{}); // No info is passed with ThrowFatalWithPolicy
IPC::ResponseBuilder rb{ctx, 2}; IPC::ResponseBuilder rb{ctx, 2};
rb.Push(RESULT_SUCCESS); rb.Push(RESULT_SUCCESS);
} }
@ -157,15 +160,15 @@ void Module::Interface::ThrowFatalWithCpuContext(Kernel::HLERequestContext& ctx)
ASSERT_MSG(fatal_info.size() == sizeof(FatalInfo), "Invalid fatal info buffer size!"); ASSERT_MSG(fatal_info.size() == sizeof(FatalInfo), "Invalid fatal info buffer size!");
std::memcpy(&info, fatal_info.data(), sizeof(FatalInfo)); std::memcpy(&info, fatal_info.data(), sizeof(FatalInfo));
ThrowFatalError(error_code, fatal_type, info); ThrowFatalError(system, error_code, fatal_type, info);
IPC::ResponseBuilder rb{ctx, 2}; IPC::ResponseBuilder rb{ctx, 2};
rb.Push(RESULT_SUCCESS); rb.Push(RESULT_SUCCESS);
} }
void InstallInterfaces(SM::ServiceManager& service_manager) { void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) {
auto module = std::make_shared<Module>(); auto module = std::make_shared<Module>();
std::make_shared<Fatal_P>(module)->InstallAsService(service_manager); std::make_shared<Fatal_P>(module, system)->InstallAsService(service_manager);
std::make_shared<Fatal_U>(module)->InstallAsService(service_manager); std::make_shared<Fatal_U>(module, system)->InstallAsService(service_manager);
} }
} // namespace Service::Fatal } // namespace Service::Fatal

View File

@ -6,13 +6,17 @@
#include "core/hle/service/service.h" #include "core/hle/service/service.h"
namespace Core {
class System;
}
namespace Service::Fatal { namespace Service::Fatal {
class Module final { class Module final {
public: public:
class Interface : public ServiceFramework<Interface> { class Interface : public ServiceFramework<Interface> {
public: public:
explicit Interface(std::shared_ptr<Module> module, const char* name); explicit Interface(std::shared_ptr<Module> module, Core::System& system, const char* name);
~Interface() override; ~Interface() override;
void ThrowFatal(Kernel::HLERequestContext& ctx); void ThrowFatal(Kernel::HLERequestContext& ctx);
@ -21,9 +25,10 @@ public:
protected: protected:
std::shared_ptr<Module> module; std::shared_ptr<Module> module;
Core::System& system;
}; };
}; };
void InstallInterfaces(SM::ServiceManager& service_manager); void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system);
} // namespace Service::Fatal } // namespace Service::Fatal

View File

@ -6,8 +6,8 @@
namespace Service::Fatal { namespace Service::Fatal {
Fatal_P::Fatal_P(std::shared_ptr<Module> module) Fatal_P::Fatal_P(std::shared_ptr<Module> module, Core::System& system)
: Module::Interface(std::move(module), "fatal:p") {} : Module::Interface(std::move(module), system, "fatal:p") {}
Fatal_P::~Fatal_P() = default; Fatal_P::~Fatal_P() = default;

View File

@ -10,7 +10,7 @@ namespace Service::Fatal {
class Fatal_P final : public Module::Interface { class Fatal_P final : public Module::Interface {
public: public:
explicit Fatal_P(std::shared_ptr<Module> module); explicit Fatal_P(std::shared_ptr<Module> module, Core::System& system);
~Fatal_P() override; ~Fatal_P() override;
}; };

View File

@ -6,7 +6,8 @@
namespace Service::Fatal { namespace Service::Fatal {
Fatal_U::Fatal_U(std::shared_ptr<Module> module) : Module::Interface(std::move(module), "fatal:u") { Fatal_U::Fatal_U(std::shared_ptr<Module> module, Core::System& system)
: Module::Interface(std::move(module), system, "fatal:u") {
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, &Fatal_U::ThrowFatal, "ThrowFatal"}, {0, &Fatal_U::ThrowFatal, "ThrowFatal"},
{1, &Fatal_U::ThrowFatalWithPolicy, "ThrowFatalWithPolicy"}, {1, &Fatal_U::ThrowFatalWithPolicy, "ThrowFatalWithPolicy"},

View File

@ -10,7 +10,7 @@ namespace Service::Fatal {
class Fatal_U final : public Module::Interface { class Fatal_U final : public Module::Interface {
public: public:
explicit Fatal_U(std::shared_ptr<Module> module); explicit Fatal_U(std::shared_ptr<Module> module, Core::System& system);
~Fatal_U() override; ~Fatal_U() override;
}; };

View File

@ -149,7 +149,8 @@ private:
class INotificationService final : public ServiceFramework<INotificationService> { class INotificationService final : public ServiceFramework<INotificationService> {
public: public:
INotificationService(Common::UUID uuid) : ServiceFramework("INotificationService"), uuid(uuid) { INotificationService(Common::UUID uuid, Core::System& system)
: ServiceFramework("INotificationService"), uuid(uuid) {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, &INotificationService::GetEvent, "GetEvent"}, {0, &INotificationService::GetEvent, "GetEvent"},
@ -159,6 +160,9 @@ public:
// clang-format on // clang-format on
RegisterHandlers(functions); RegisterHandlers(functions);
notification_event = Kernel::WritableEvent::CreateEventPair(
system.Kernel(), Kernel::ResetType::Manual, "INotificationService:NotifyEvent");
} }
private: private:
@ -167,13 +171,6 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 1}; IPC::ResponseBuilder rb{ctx, 2, 1};
rb.Push(RESULT_SUCCESS); rb.Push(RESULT_SUCCESS);
if (!is_event_created) {
auto& kernel = Core::System::GetInstance().Kernel();
notification_event = Kernel::WritableEvent::CreateEventPair(
kernel, Kernel::ResetType::Manual, "INotificationService:NotifyEvent");
is_event_created = true;
}
rb.PushCopyObjects(notification_event.readable); rb.PushCopyObjects(notification_event.readable);
} }
@ -261,21 +258,21 @@ void Module::Interface::CreateNotificationService(Kernel::HLERequestContext& ctx
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(RESULT_SUCCESS); rb.Push(RESULT_SUCCESS);
rb.PushIpcInterface<INotificationService>(uuid); rb.PushIpcInterface<INotificationService>(uuid, system);
} }
Module::Interface::Interface(std::shared_ptr<Module> module, const char* name) Module::Interface::Interface(std::shared_ptr<Module> module, Core::System& system, const char* name)
: ServiceFramework(name), module(std::move(module)) {} : ServiceFramework(name), module(std::move(module)), system(system) {}
Module::Interface::~Interface() = default; Module::Interface::~Interface() = default;
void InstallInterfaces(SM::ServiceManager& service_manager) { void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) {
auto module = std::make_shared<Module>(); auto module = std::make_shared<Module>();
std::make_shared<Friend>(module, "friend:a")->InstallAsService(service_manager); std::make_shared<Friend>(module, system, "friend:a")->InstallAsService(service_manager);
std::make_shared<Friend>(module, "friend:m")->InstallAsService(service_manager); std::make_shared<Friend>(module, system, "friend:m")->InstallAsService(service_manager);
std::make_shared<Friend>(module, "friend:s")->InstallAsService(service_manager); std::make_shared<Friend>(module, system, "friend:s")->InstallAsService(service_manager);
std::make_shared<Friend>(module, "friend:u")->InstallAsService(service_manager); std::make_shared<Friend>(module, system, "friend:u")->InstallAsService(service_manager);
std::make_shared<Friend>(module, "friend:v")->InstallAsService(service_manager); std::make_shared<Friend>(module, system, "friend:v")->InstallAsService(service_manager);
} }
} // namespace Service::Friend } // namespace Service::Friend

View File

@ -6,13 +6,17 @@
#include "core/hle/service/service.h" #include "core/hle/service/service.h"
namespace Core {
class System;
}
namespace Service::Friend { namespace Service::Friend {
class Module final { class Module final {
public: public:
class Interface : public ServiceFramework<Interface> { class Interface : public ServiceFramework<Interface> {
public: public:
explicit Interface(std::shared_ptr<Module> module, const char* name); explicit Interface(std::shared_ptr<Module> module, Core::System& system, const char* name);
~Interface() override; ~Interface() override;
void CreateFriendService(Kernel::HLERequestContext& ctx); void CreateFriendService(Kernel::HLERequestContext& ctx);
@ -20,10 +24,11 @@ public:
protected: protected:
std::shared_ptr<Module> module; std::shared_ptr<Module> module;
Core::System& system;
}; };
}; };
/// Registers all Friend services with the specified service manager. /// Registers all Friend services with the specified service manager.
void InstallInterfaces(SM::ServiceManager& service_manager); void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system);
} // namespace Service::Friend } // namespace Service::Friend

View File

@ -6,8 +6,8 @@
namespace Service::Friend { namespace Service::Friend {
Friend::Friend(std::shared_ptr<Module> module, const char* name) Friend::Friend(std::shared_ptr<Module> module, Core::System& system, const char* name)
: Interface(std::move(module), name) { : Interface(std::move(module), system, name) {
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, &Friend::CreateFriendService, "CreateFriendService"}, {0, &Friend::CreateFriendService, "CreateFriendService"},
{1, &Friend::CreateNotificationService, "CreateNotificationService"}, {1, &Friend::CreateNotificationService, "CreateNotificationService"},

View File

@ -10,7 +10,7 @@ namespace Service::Friend {
class Friend final : public Module::Interface { class Friend final : public Module::Interface {
public: public:
explicit Friend(std::shared_ptr<Module> module, const char* name); explicit Friend(std::shared_ptr<Module> module, Core::System& system, const char* name);
~Friend() override; ~Friend() override;
}; };

View File

@ -6,7 +6,7 @@
namespace Service::HID { namespace Service::HID {
ControllerBase::ControllerBase() = default; ControllerBase::ControllerBase(Core::System& system) : system(system) {}
ControllerBase::~ControllerBase() = default; ControllerBase::~ControllerBase() = default;
void ControllerBase::ActivateController() { void ControllerBase::ActivateController() {

View File

@ -11,10 +11,14 @@ namespace Core::Timing {
class CoreTiming; class CoreTiming;
} }
namespace Core {
class System;
}
namespace Service::HID { namespace Service::HID {
class ControllerBase { class ControllerBase {
public: public:
ControllerBase(); explicit ControllerBase(Core::System& system);
virtual ~ControllerBase(); virtual ~ControllerBase();
// Called when the controller is initialized // Called when the controller is initialized
@ -46,5 +50,7 @@ protected:
s64_le entry_count; s64_le entry_count;
}; };
static_assert(sizeof(CommonHeader) == 0x20, "CommonHeader is an invalid size"); static_assert(sizeof(CommonHeader) == 0x20, "CommonHeader is an invalid size");
Core::System& system;
}; };
} // namespace Service::HID } // namespace Service::HID

View File

@ -14,7 +14,8 @@ constexpr s32 HID_JOYSTICK_MAX = 0x7fff;
constexpr s32 HID_JOYSTICK_MIN = -0x7fff; constexpr s32 HID_JOYSTICK_MIN = -0x7fff;
enum class JoystickId : std::size_t { Joystick_Left, Joystick_Right }; enum class JoystickId : std::size_t { Joystick_Left, Joystick_Right };
Controller_DebugPad::Controller_DebugPad() = default; Controller_DebugPad::Controller_DebugPad(Core::System& system)
: ControllerBase(system), system(system) {}
Controller_DebugPad::~Controller_DebugPad() = default; Controller_DebugPad::~Controller_DebugPad() = default;
void Controller_DebugPad::OnInit() {} void Controller_DebugPad::OnInit() {}

View File

@ -16,7 +16,7 @@
namespace Service::HID { namespace Service::HID {
class Controller_DebugPad final : public ControllerBase { class Controller_DebugPad final : public ControllerBase {
public: public:
Controller_DebugPad(); explicit Controller_DebugPad(Core::System& system);
~Controller_DebugPad() override; ~Controller_DebugPad() override;
// Called when the controller is initialized // Called when the controller is initialized
@ -89,5 +89,6 @@ private:
buttons; buttons;
std::array<std::unique_ptr<Input::AnalogDevice>, Settings::NativeAnalog::NUM_STICKS_HID> std::array<std::unique_ptr<Input::AnalogDevice>, Settings::NativeAnalog::NUM_STICKS_HID>
analogs; analogs;
Core::System& system;
}; };
} // namespace Service::HID } // namespace Service::HID

View File

@ -10,7 +10,8 @@
namespace Service::HID { namespace Service::HID {
constexpr std::size_t SHARED_MEMORY_OFFSET = 0x3BA00; constexpr std::size_t SHARED_MEMORY_OFFSET = 0x3BA00;
Controller_Gesture::Controller_Gesture() = default; Controller_Gesture::Controller_Gesture(Core::System& system)
: ControllerBase(system), system(system) {}
Controller_Gesture::~Controller_Gesture() = default; Controller_Gesture::~Controller_Gesture() = default;
void Controller_Gesture::OnInit() {} void Controller_Gesture::OnInit() {}

View File

@ -12,7 +12,7 @@
namespace Service::HID { namespace Service::HID {
class Controller_Gesture final : public ControllerBase { class Controller_Gesture final : public ControllerBase {
public: public:
Controller_Gesture(); explicit Controller_Gesture(Core::System& system);
~Controller_Gesture() override; ~Controller_Gesture() override;
// Called when the controller is initialized // Called when the controller is initialized
@ -59,5 +59,6 @@ private:
std::array<GestureState, 17> gesture_states; std::array<GestureState, 17> gesture_states;
}; };
SharedMemory shared_memory{}; SharedMemory shared_memory{};
Core::System& system;
}; };
} // namespace Service::HID } // namespace Service::HID

View File

@ -12,7 +12,8 @@ namespace Service::HID {
constexpr std::size_t SHARED_MEMORY_OFFSET = 0x3800; constexpr std::size_t SHARED_MEMORY_OFFSET = 0x3800;
constexpr u8 KEYS_PER_BYTE = 8; constexpr u8 KEYS_PER_BYTE = 8;
Controller_Keyboard::Controller_Keyboard() = default; Controller_Keyboard::Controller_Keyboard(Core::System& system)
: ControllerBase(system), system(system) {}
Controller_Keyboard::~Controller_Keyboard() = default; Controller_Keyboard::~Controller_Keyboard() = default;
void Controller_Keyboard::OnInit() {} void Controller_Keyboard::OnInit() {}

View File

@ -15,7 +15,7 @@
namespace Service::HID { namespace Service::HID {
class Controller_Keyboard final : public ControllerBase { class Controller_Keyboard final : public ControllerBase {
public: public:
Controller_Keyboard(); explicit Controller_Keyboard(Core::System& system);
~Controller_Keyboard() override; ~Controller_Keyboard() override;
// Called when the controller is initialized // Called when the controller is initialized
@ -53,5 +53,6 @@ private:
keyboard_keys; keyboard_keys;
std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeKeyboard::NumKeyboardMods> std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeKeyboard::NumKeyboardMods>
keyboard_mods; keyboard_mods;
Core::System& system;
}; };
} // namespace Service::HID } // namespace Service::HID

View File

@ -11,7 +11,7 @@
namespace Service::HID { namespace Service::HID {
constexpr std::size_t SHARED_MEMORY_OFFSET = 0x3400; constexpr std::size_t SHARED_MEMORY_OFFSET = 0x3400;
Controller_Mouse::Controller_Mouse() = default; Controller_Mouse::Controller_Mouse(Core::System& system) : ControllerBase(system), system(system) {}
Controller_Mouse::~Controller_Mouse() = default; Controller_Mouse::~Controller_Mouse() = default;
void Controller_Mouse::OnInit() {} void Controller_Mouse::OnInit() {}

View File

@ -14,7 +14,7 @@
namespace Service::HID { namespace Service::HID {
class Controller_Mouse final : public ControllerBase { class Controller_Mouse final : public ControllerBase {
public: public:
Controller_Mouse(); explicit Controller_Mouse(Core::System& system);
~Controller_Mouse() override; ~Controller_Mouse() override;
// Called when the controller is initialized // Called when the controller is initialized
@ -53,5 +53,6 @@ private:
std::unique_ptr<Input::MouseDevice> mouse_device; std::unique_ptr<Input::MouseDevice> mouse_device;
std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeMouseButton::NumMouseButtons> std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeMouseButton::NumMouseButtons>
mouse_button_devices; mouse_button_devices;
Core::System& system;
}; };
} // namespace Service::HID } // namespace Service::HID

View File

@ -93,7 +93,7 @@ u32 Controller_NPad::IndexToNPad(std::size_t index) {
}; };
} }
Controller_NPad::Controller_NPad() = default; Controller_NPad::Controller_NPad(Core::System& system) : ControllerBase(system), system(system) {}
Controller_NPad::~Controller_NPad() = default; Controller_NPad::~Controller_NPad() = default;
void Controller_NPad::InitNewlyAddedControler(std::size_t controller_idx) { void Controller_NPad::InitNewlyAddedControler(std::size_t controller_idx) {
@ -168,7 +168,7 @@ void Controller_NPad::InitNewlyAddedControler(std::size_t controller_idx) {
} }
void Controller_NPad::OnInit() { void Controller_NPad::OnInit() {
auto& kernel = Core::System::GetInstance().Kernel(); auto& kernel = system.Kernel();
styleset_changed_event = Kernel::WritableEvent::CreateEventPair( styleset_changed_event = Kernel::WritableEvent::CreateEventPair(
kernel, Kernel::ResetType::Automatic, "npad:NpadStyleSetChanged"); kernel, Kernel::ResetType::Automatic, "npad:NpadStyleSetChanged");

View File

@ -20,7 +20,7 @@ constexpr u32 NPAD_UNKNOWN = 16; // TODO(ogniK): What is this?
class Controller_NPad final : public ControllerBase { class Controller_NPad final : public ControllerBase {
public: public:
Controller_NPad(); explicit Controller_NPad(Core::System& system);
~Controller_NPad() override; ~Controller_NPad() override;
// Called when the controller is initialized // Called when the controller is initialized
@ -327,5 +327,6 @@ private:
std::array<ControllerPad, 10> npad_pad_states{}; std::array<ControllerPad, 10> npad_pad_states{};
bool IsControllerSupported(NPadControllerType controller); bool IsControllerSupported(NPadControllerType controller);
bool is_in_lr_assignment_mode{false}; bool is_in_lr_assignment_mode{false};
Core::System& system;
}; };
} // namespace Service::HID } // namespace Service::HID

View File

@ -9,7 +9,8 @@
namespace Service::HID { namespace Service::HID {
Controller_Stubbed::Controller_Stubbed() = default; Controller_Stubbed::Controller_Stubbed(Core::System& system)
: ControllerBase(system), system(system) {}
Controller_Stubbed::~Controller_Stubbed() = default; Controller_Stubbed::~Controller_Stubbed() = default;
void Controller_Stubbed::OnInit() {} void Controller_Stubbed::OnInit() {}

View File

@ -10,7 +10,7 @@
namespace Service::HID { namespace Service::HID {
class Controller_Stubbed final : public ControllerBase { class Controller_Stubbed final : public ControllerBase {
public: public:
Controller_Stubbed(); explicit Controller_Stubbed(Core::System& system);
~Controller_Stubbed() override; ~Controller_Stubbed() override;
// Called when the controller is initialized // Called when the controller is initialized
@ -30,5 +30,6 @@ public:
private: private:
bool smart_update{}; bool smart_update{};
std::size_t common_offset{}; std::size_t common_offset{};
Core::System& system;
}; };
} // namespace Service::HID } // namespace Service::HID

View File

@ -13,7 +13,8 @@
namespace Service::HID { namespace Service::HID {
constexpr std::size_t SHARED_MEMORY_OFFSET = 0x400; constexpr std::size_t SHARED_MEMORY_OFFSET = 0x400;
Controller_Touchscreen::Controller_Touchscreen() = default; Controller_Touchscreen::Controller_Touchscreen(Core::System& system)
: ControllerBase(system), system(system) {}
Controller_Touchscreen::~Controller_Touchscreen() = default; Controller_Touchscreen::~Controller_Touchscreen() = default;
void Controller_Touchscreen::OnInit() {} void Controller_Touchscreen::OnInit() {}

View File

@ -14,7 +14,7 @@
namespace Service::HID { namespace Service::HID {
class Controller_Touchscreen final : public ControllerBase { class Controller_Touchscreen final : public ControllerBase {
public: public:
Controller_Touchscreen(); explicit Controller_Touchscreen(Core::System& system);
~Controller_Touchscreen() override; ~Controller_Touchscreen() override;
// Called when the controller is initialized // Called when the controller is initialized
@ -69,5 +69,6 @@ private:
TouchScreenSharedMemory shared_memory{}; TouchScreenSharedMemory shared_memory{};
std::unique_ptr<Input::TouchDevice> touch_device; std::unique_ptr<Input::TouchDevice> touch_device;
s64_le last_touch{}; s64_le last_touch{};
Core::System& system;
}; };
} // namespace Service::HID } // namespace Service::HID

View File

@ -10,7 +10,7 @@
namespace Service::HID { namespace Service::HID {
constexpr std::size_t SHARED_MEMORY_OFFSET = 0x3C00; constexpr std::size_t SHARED_MEMORY_OFFSET = 0x3C00;
Controller_XPad::Controller_XPad() = default; Controller_XPad::Controller_XPad(Core::System& system) : ControllerBase(system), system(system) {}
Controller_XPad::~Controller_XPad() = default; Controller_XPad::~Controller_XPad() = default;
void Controller_XPad::OnInit() {} void Controller_XPad::OnInit() {}

View File

@ -12,7 +12,7 @@
namespace Service::HID { namespace Service::HID {
class Controller_XPad final : public ControllerBase { class Controller_XPad final : public ControllerBase {
public: public:
Controller_XPad(); explicit Controller_XPad(Core::System& system);
~Controller_XPad() override; ~Controller_XPad() override;
// Called when the controller is initialized // Called when the controller is initialized
@ -56,5 +56,6 @@ private:
}; };
static_assert(sizeof(SharedMemory) == 0x1000, "SharedMemory is an invalid size"); static_assert(sizeof(SharedMemory) == 0x1000, "SharedMemory is an invalid size");
SharedMemory shared_memory{}; SharedMemory shared_memory{};
Core::System& system;
}; };
} // namespace Service::HID } // namespace Service::HID

View File

@ -42,13 +42,14 @@ constexpr s64 accelerometer_update_ticks = static_cast<s64>(Core::Timing::BASE_C
constexpr s64 gyroscope_update_ticks = static_cast<s64>(Core::Timing::BASE_CLOCK_RATE / 100); constexpr s64 gyroscope_update_ticks = static_cast<s64>(Core::Timing::BASE_CLOCK_RATE / 100);
constexpr std::size_t SHARED_MEMORY_SIZE = 0x40000; constexpr std::size_t SHARED_MEMORY_SIZE = 0x40000;
IAppletResource::IAppletResource() : ServiceFramework("IAppletResource") { IAppletResource::IAppletResource(Core::System& system)
: ServiceFramework("IAppletResource"), system(system) {
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, &IAppletResource::GetSharedMemoryHandle, "GetSharedMemoryHandle"}, {0, &IAppletResource::GetSharedMemoryHandle, "GetSharedMemoryHandle"},
}; };
RegisterHandlers(functions); RegisterHandlers(functions);
auto& kernel = Core::System::GetInstance().Kernel(); auto& kernel = system.Kernel();
shared_mem = Kernel::SharedMemory::Create( shared_mem = Kernel::SharedMemory::Create(
kernel, nullptr, SHARED_MEMORY_SIZE, Kernel::MemoryPermission::ReadWrite, kernel, nullptr, SHARED_MEMORY_SIZE, Kernel::MemoryPermission::ReadWrite,
Kernel::MemoryPermission::Read, 0, Kernel::MemoryRegion::BASE, "HID:SharedMemory"); Kernel::MemoryPermission::Read, 0, Kernel::MemoryRegion::BASE, "HID:SharedMemory");
@ -74,7 +75,7 @@ IAppletResource::IAppletResource() : ServiceFramework("IAppletResource") {
GetController<Controller_Stubbed>(HidController::Unknown3).SetCommonHeaderOffset(0x5000); GetController<Controller_Stubbed>(HidController::Unknown3).SetCommonHeaderOffset(0x5000);
// Register update callbacks // Register update callbacks
auto& core_timing = Core::System::GetInstance().CoreTiming(); auto& core_timing = system.CoreTiming();
pad_update_event = pad_update_event =
core_timing.RegisterEvent("HID::UpdatePadCallback", [this](u64 userdata, s64 cycles_late) { core_timing.RegisterEvent("HID::UpdatePadCallback", [this](u64 userdata, s64 cycles_late) {
UpdateControllers(userdata, cycles_late); UpdateControllers(userdata, cycles_late);
@ -96,7 +97,7 @@ void IAppletResource::DeactivateController(HidController controller) {
} }
IAppletResource ::~IAppletResource() { IAppletResource ::~IAppletResource() {
Core::System::GetInstance().CoreTiming().UnscheduleEvent(pad_update_event, 0); system.CoreTiming().UnscheduleEvent(pad_update_event, 0);
} }
void IAppletResource::GetSharedMemoryHandle(Kernel::HLERequestContext& ctx) { void IAppletResource::GetSharedMemoryHandle(Kernel::HLERequestContext& ctx) {
@ -108,7 +109,7 @@ void IAppletResource::GetSharedMemoryHandle(Kernel::HLERequestContext& ctx) {
} }
void IAppletResource::UpdateControllers(u64 userdata, s64 cycles_late) { void IAppletResource::UpdateControllers(u64 userdata, s64 cycles_late) {
auto& core_timing = Core::System::GetInstance().CoreTiming(); auto& core_timing = system.CoreTiming();
const bool should_reload = Settings::values.is_device_reload_pending.exchange(false); const bool should_reload = Settings::values.is_device_reload_pending.exchange(false);
for (const auto& controller : controllers) { for (const auto& controller : controllers) {
@ -141,13 +142,13 @@ private:
std::shared_ptr<IAppletResource> Hid::GetAppletResource() { std::shared_ptr<IAppletResource> Hid::GetAppletResource() {
if (applet_resource == nullptr) { if (applet_resource == nullptr) {
applet_resource = std::make_shared<IAppletResource>(); applet_resource = std::make_shared<IAppletResource>(system);
} }
return applet_resource; return applet_resource;
} }
Hid::Hid() : ServiceFramework("hid") { Hid::Hid(Core::System& system) : ServiceFramework("hid"), system(system) {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, &Hid::CreateAppletResource, "CreateAppletResource"}, {0, &Hid::CreateAppletResource, "CreateAppletResource"},
@ -286,7 +287,7 @@ void Hid::CreateAppletResource(Kernel::HLERequestContext& ctx) {
LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); LOG_DEBUG(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id);
if (applet_resource == nullptr) { if (applet_resource == nullptr) {
applet_resource = std::make_shared<IAppletResource>(); applet_resource = std::make_shared<IAppletResource>(system);
} }
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
@ -1053,14 +1054,14 @@ void ReloadInputDevices() {
Settings::values.is_device_reload_pending.store(true); Settings::values.is_device_reload_pending.store(true);
} }
void InstallInterfaces(SM::ServiceManager& service_manager) { void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) {
std::make_shared<Hid>()->InstallAsService(service_manager); std::make_shared<Hid>(system)->InstallAsService(service_manager);
std::make_shared<HidBus>()->InstallAsService(service_manager); std::make_shared<HidBus>()->InstallAsService(service_manager);
std::make_shared<HidDbg>()->InstallAsService(service_manager); std::make_shared<HidDbg>()->InstallAsService(service_manager);
std::make_shared<HidSys>()->InstallAsService(service_manager); std::make_shared<HidSys>()->InstallAsService(service_manager);
std::make_shared<HidTmp>()->InstallAsService(service_manager); std::make_shared<HidTmp>()->InstallAsService(service_manager);
std::make_shared<IRS>()->InstallAsService(service_manager); std::make_shared<IRS>(system)->InstallAsService(service_manager);
std::make_shared<IRS_SYS>()->InstallAsService(service_manager); std::make_shared<IRS_SYS>()->InstallAsService(service_manager);
std::make_shared<XCD_SYS>()->InstallAsService(service_manager); std::make_shared<XCD_SYS>()->InstallAsService(service_manager);

View File

@ -42,7 +42,7 @@ enum class HidController : std::size_t {
class IAppletResource final : public ServiceFramework<IAppletResource> { class IAppletResource final : public ServiceFramework<IAppletResource> {
public: public:
IAppletResource(); explicit IAppletResource(Core::System& system);
~IAppletResource() override; ~IAppletResource() override;
void ActivateController(HidController controller); void ActivateController(HidController controller);
@ -61,7 +61,7 @@ public:
private: private:
template <typename T> template <typename T>
void MakeController(HidController controller) { void MakeController(HidController controller) {
controllers[static_cast<std::size_t>(controller)] = std::make_unique<T>(); controllers[static_cast<std::size_t>(controller)] = std::make_unique<T>(system);
} }
void GetSharedMemoryHandle(Kernel::HLERequestContext& ctx); void GetSharedMemoryHandle(Kernel::HLERequestContext& ctx);
@ -70,6 +70,7 @@ private:
Kernel::SharedPtr<Kernel::SharedMemory> shared_mem; Kernel::SharedPtr<Kernel::SharedMemory> shared_mem;
Core::Timing::EventType* pad_update_event; Core::Timing::EventType* pad_update_event;
Core::System& system;
std::array<std::unique_ptr<ControllerBase>, static_cast<size_t>(HidController::MaxControllers)> std::array<std::unique_ptr<ControllerBase>, static_cast<size_t>(HidController::MaxControllers)>
controllers{}; controllers{};
@ -77,7 +78,7 @@ private:
class Hid final : public ServiceFramework<Hid> { class Hid final : public ServiceFramework<Hid> {
public: public:
Hid(); explicit Hid(Core::System& system);
~Hid() override; ~Hid() override;
std::shared_ptr<IAppletResource> GetAppletResource(); std::shared_ptr<IAppletResource> GetAppletResource();
@ -126,12 +127,13 @@ private:
void SwapNpadAssignment(Kernel::HLERequestContext& ctx); void SwapNpadAssignment(Kernel::HLERequestContext& ctx);
std::shared_ptr<IAppletResource> applet_resource; std::shared_ptr<IAppletResource> applet_resource;
Core::System& system;
}; };
/// Reload input devices. Used when input configuration changed /// Reload input devices. Used when input configuration changed
void ReloadInputDevices(); void ReloadInputDevices();
/// Registers all HID services with the specified service manager. /// Registers all HID services with the specified service manager.
void InstallInterfaces(SM::ServiceManager& service_manager); void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system);
} // namespace Service::HID } // namespace Service::HID

View File

@ -11,7 +11,7 @@
namespace Service::HID { namespace Service::HID {
IRS::IRS() : ServiceFramework{"irs"} { IRS::IRS(Core::System& system) : ServiceFramework{"irs"}, system(system) {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{302, &IRS::ActivateIrsensor, "ActivateIrsensor"}, {302, &IRS::ActivateIrsensor, "ActivateIrsensor"},
@ -37,7 +37,7 @@ IRS::IRS() : ServiceFramework{"irs"} {
RegisterHandlers(functions); RegisterHandlers(functions);
auto& kernel = Core::System::GetInstance().Kernel(); auto& kernel = system.Kernel();
shared_mem = Kernel::SharedMemory::Create( shared_mem = Kernel::SharedMemory::Create(
kernel, nullptr, 0x8000, Kernel::MemoryPermission::ReadWrite, kernel, nullptr, 0x8000, Kernel::MemoryPermission::ReadWrite,
Kernel::MemoryPermission::Read, 0, Kernel::MemoryRegion::BASE, "IRS:SharedMemory"); Kernel::MemoryPermission::Read, 0, Kernel::MemoryRegion::BASE, "IRS:SharedMemory");
@ -98,7 +98,7 @@ void IRS::GetImageTransferProcessorState(Kernel::HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 5}; IPC::ResponseBuilder rb{ctx, 5};
rb.Push(RESULT_SUCCESS); rb.Push(RESULT_SUCCESS);
rb.PushRaw<u64>(Core::System::GetInstance().CoreTiming().GetTicks()); rb.PushRaw<u64>(system.CoreTiming().GetTicks());
rb.PushRaw<u32>(0); rb.PushRaw<u32>(0);
} }

View File

@ -15,7 +15,7 @@ namespace Service::HID {
class IRS final : public ServiceFramework<IRS> { class IRS final : public ServiceFramework<IRS> {
public: public:
explicit IRS(); explicit IRS(Core::System& system);
~IRS() override; ~IRS() override;
private: private:
@ -39,6 +39,7 @@ private:
void ActivateIrsensorWithFunctionLevel(Kernel::HLERequestContext& ctx); void ActivateIrsensorWithFunctionLevel(Kernel::HLERequestContext& ctx);
Kernel::SharedPtr<Kernel::SharedMemory> shared_mem; Kernel::SharedPtr<Kernel::SharedMemory> shared_mem;
const u32 device_handle{0xABCD}; const u32 device_handle{0xABCD};
Core::System& system;
}; };
class IRS_SYS final : public ServiceFramework<IRS_SYS> { class IRS_SYS final : public ServiceFramework<IRS_SYS> {

View File

@ -78,7 +78,7 @@ public:
class RelocatableObject final : public ServiceFramework<RelocatableObject> { class RelocatableObject final : public ServiceFramework<RelocatableObject> {
public: public:
explicit RelocatableObject() : ServiceFramework{"ldr:ro"} { explicit RelocatableObject(Core::System& system) : ServiceFramework{"ldr:ro"}, system(system) {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, &RelocatableObject::LoadNro, "LoadNro"}, {0, &RelocatableObject::LoadNro, "LoadNro"},
@ -364,7 +364,7 @@ public:
vm_manager.ReprotectRange(*map_address + header.rw_offset, header.rw_size, vm_manager.ReprotectRange(*map_address + header.rw_offset, header.rw_size,
Kernel::VMAPermission::ReadWrite); Kernel::VMAPermission::ReadWrite);
Core::System::GetInstance().InvalidateCpuInstructionCaches(); system.InvalidateCpuInstructionCaches();
nro.insert_or_assign(*map_address, nro.insert_or_assign(*map_address,
NROInfo{hash, nro_address, nro_size, bss_address, bss_size}); NROInfo{hash, nro_address, nro_size, bss_address, bss_size});
@ -430,7 +430,7 @@ public:
.IsSuccess()); .IsSuccess());
} }
Core::System::GetInstance().InvalidateCpuInstructionCaches(); system.InvalidateCpuInstructionCaches();
nro.erase(iter); nro.erase(iter);
IPC::ResponseBuilder rb{ctx, 2}; IPC::ResponseBuilder rb{ctx, 2};
@ -516,13 +516,14 @@ private:
Common::Is4KBAligned(header.text_size) && Common::Is4KBAligned(header.ro_size) && Common::Is4KBAligned(header.text_size) && Common::Is4KBAligned(header.ro_size) &&
Common::Is4KBAligned(header.rw_size); Common::Is4KBAligned(header.rw_size);
} }
Core::System& system;
}; };
void InstallInterfaces(SM::ServiceManager& sm) { void InstallInterfaces(SM::ServiceManager& sm, Core::System& system) {
std::make_shared<DebugMonitor>()->InstallAsService(sm); std::make_shared<DebugMonitor>()->InstallAsService(sm);
std::make_shared<ProcessManager>()->InstallAsService(sm); std::make_shared<ProcessManager>()->InstallAsService(sm);
std::make_shared<Shell>()->InstallAsService(sm); std::make_shared<Shell>()->InstallAsService(sm);
std::make_shared<RelocatableObject>()->InstallAsService(sm); std::make_shared<RelocatableObject>(system)->InstallAsService(sm);
} }
} // namespace Service::LDR } // namespace Service::LDR

View File

@ -11,6 +11,6 @@ class ServiceManager;
namespace Service::LDR { namespace Service::LDR {
/// Registers all LDR services with the specified service manager. /// Registers all LDR services with the specified service manager.
void InstallInterfaces(SM::ServiceManager& sm); void InstallInterfaces(SM::ServiceManager& sm, Core::System& system);
} // namespace Service::LDR } // namespace Service::LDR

View File

@ -23,9 +23,9 @@ constexpr ResultCode ERR_TAG_FAILED(ErrorModule::NFP,
constexpr ResultCode ERR_NO_APPLICATION_AREA(ErrorModule::NFP, 152); constexpr ResultCode ERR_NO_APPLICATION_AREA(ErrorModule::NFP, 152);
} // namespace ErrCodes } // namespace ErrCodes
Module::Interface::Interface(std::shared_ptr<Module> module, const char* name) Module::Interface::Interface(std::shared_ptr<Module> module, Core::System& system, const char* name)
: ServiceFramework(name), module(std::move(module)) { : ServiceFramework(name), module(std::move(module)), system(system) {
auto& kernel = Core::System::GetInstance().Kernel(); auto& kernel = system.Kernel();
nfc_tag_load = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Automatic, nfc_tag_load = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Automatic,
"IUser:NFCTagDetected"); "IUser:NFCTagDetected");
} }
@ -34,8 +34,8 @@ Module::Interface::~Interface() = default;
class IUser final : public ServiceFramework<IUser> { class IUser final : public ServiceFramework<IUser> {
public: public:
IUser(Module::Interface& nfp_interface) IUser(Module::Interface& nfp_interface, Core::System& system)
: ServiceFramework("NFP::IUser"), nfp_interface(nfp_interface) { : ServiceFramework("NFP::IUser"), nfp_interface(nfp_interface), system(system) {
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, &IUser::Initialize, "Initialize"}, {0, &IUser::Initialize, "Initialize"},
{1, &IUser::Finalize, "Finalize"}, {1, &IUser::Finalize, "Finalize"},
@ -65,7 +65,7 @@ public:
}; };
RegisterHandlers(functions); RegisterHandlers(functions);
auto& kernel = Core::System::GetInstance().Kernel(); auto& kernel = system.Kernel();
deactivate_event = Kernel::WritableEvent::CreateEventPair( deactivate_event = Kernel::WritableEvent::CreateEventPair(
kernel, Kernel::ResetType::Automatic, "IUser:DeactivateEvent"); kernel, Kernel::ResetType::Automatic, "IUser:DeactivateEvent");
availability_change_event = Kernel::WritableEvent::CreateEventPair( availability_change_event = Kernel::WritableEvent::CreateEventPair(
@ -324,6 +324,7 @@ private:
Kernel::EventPair deactivate_event; Kernel::EventPair deactivate_event;
Kernel::EventPair availability_change_event; Kernel::EventPair availability_change_event;
const Module::Interface& nfp_interface; const Module::Interface& nfp_interface;
Core::System& system;
}; };
void Module::Interface::CreateUserInterface(Kernel::HLERequestContext& ctx) { void Module::Interface::CreateUserInterface(Kernel::HLERequestContext& ctx) {
@ -331,7 +332,7 @@ void Module::Interface::CreateUserInterface(Kernel::HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(RESULT_SUCCESS); rb.Push(RESULT_SUCCESS);
rb.PushIpcInterface<IUser>(*this); rb.PushIpcInterface<IUser>(*this, system);
} }
bool Module::Interface::LoadAmiibo(const std::vector<u8>& buffer) { bool Module::Interface::LoadAmiibo(const std::vector<u8>& buffer) {
@ -353,9 +354,9 @@ const Module::Interface::AmiiboFile& Module::Interface::GetAmiiboBuffer() const
return amiibo; return amiibo;
} }
void InstallInterfaces(SM::ServiceManager& service_manager) { void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) {
auto module = std::make_shared<Module>(); auto module = std::make_shared<Module>();
std::make_shared<NFP_User>(module)->InstallAsService(service_manager); std::make_shared<NFP_User>(module, system)->InstallAsService(service_manager);
} }
} // namespace Service::NFP } // namespace Service::NFP

View File

@ -16,7 +16,7 @@ class Module final {
public: public:
class Interface : public ServiceFramework<Interface> { class Interface : public ServiceFramework<Interface> {
public: public:
explicit Interface(std::shared_ptr<Module> module, const char* name); explicit Interface(std::shared_ptr<Module> module, Core::System& system, const char* name);
~Interface() override; ~Interface() override;
struct ModelInfo { struct ModelInfo {
@ -43,9 +43,10 @@ public:
protected: protected:
std::shared_ptr<Module> module; std::shared_ptr<Module> module;
Core::System& system;
}; };
}; };
void InstallInterfaces(SM::ServiceManager& service_manager); void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system);
} // namespace Service::NFP } // namespace Service::NFP

View File

@ -6,8 +6,8 @@
namespace Service::NFP { namespace Service::NFP {
NFP_User::NFP_User(std::shared_ptr<Module> module) NFP_User::NFP_User(std::shared_ptr<Module> module, Core::System& system)
: Module::Interface(std::move(module), "nfp:user") { : Module::Interface(std::move(module), system, "nfp:user") {
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, &NFP_User::CreateUserInterface, "CreateUserInterface"}, {0, &NFP_User::CreateUserInterface, "CreateUserInterface"},
}; };

View File

@ -10,7 +10,7 @@ namespace Service::NFP {
class NFP_User final : public Module::Interface { class NFP_User final : public Module::Interface {
public: public:
explicit NFP_User(std::shared_ptr<Module> module); explicit NFP_User(std::shared_ptr<Module> module, Core::System& system);
~NFP_User() override; ~NFP_User() override;
}; };

View File

@ -31,7 +31,7 @@ public:
class IRequest final : public ServiceFramework<IRequest> { class IRequest final : public ServiceFramework<IRequest> {
public: public:
explicit IRequest() : ServiceFramework("IRequest") { explicit IRequest(Core::System& system) : ServiceFramework("IRequest") {
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, &IRequest::GetRequestState, "GetRequestState"}, {0, &IRequest::GetRequestState, "GetRequestState"},
{1, &IRequest::GetResult, "GetResult"}, {1, &IRequest::GetResult, "GetResult"},
@ -61,7 +61,7 @@ public:
}; };
RegisterHandlers(functions); RegisterHandlers(functions);
auto& kernel = Core::System::GetInstance().Kernel(); auto& kernel = system.Kernel();
event1 = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Automatic, event1 = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Automatic,
"IRequest:Event1"); "IRequest:Event1");
event2 = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Automatic, event2 = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Automatic,
@ -130,7 +130,7 @@ public:
class IGeneralService final : public ServiceFramework<IGeneralService> { class IGeneralService final : public ServiceFramework<IGeneralService> {
public: public:
IGeneralService(); IGeneralService(Core::System& system);
private: private:
void GetClientId(Kernel::HLERequestContext& ctx) { void GetClientId(Kernel::HLERequestContext& ctx) {
@ -155,7 +155,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(RESULT_SUCCESS); rb.Push(RESULT_SUCCESS);
rb.PushIpcInterface<IRequest>(); rb.PushIpcInterface<IRequest>(system);
} }
void RemoveNetworkProfile(Kernel::HLERequestContext& ctx) { void RemoveNetworkProfile(Kernel::HLERequestContext& ctx) {
LOG_WARNING(Service_NIFM, "(STUBBED) called"); LOG_WARNING(Service_NIFM, "(STUBBED) called");
@ -198,9 +198,11 @@ private:
rb.Push(RESULT_SUCCESS); rb.Push(RESULT_SUCCESS);
rb.Push<u8>(0); rb.Push<u8>(0);
} }
Core::System& system;
}; };
IGeneralService::IGeneralService() : ServiceFramework("IGeneralService") { IGeneralService::IGeneralService(Core::System& system)
: ServiceFramework("IGeneralService"), system(system) {
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{1, &IGeneralService::GetClientId, "GetClientId"}, {1, &IGeneralService::GetClientId, "GetClientId"},
{2, &IGeneralService::CreateScanRequest, "CreateScanRequest"}, {2, &IGeneralService::CreateScanRequest, "CreateScanRequest"},
@ -245,7 +247,8 @@ IGeneralService::IGeneralService() : ServiceFramework("IGeneralService") {
class NetworkInterface final : public ServiceFramework<NetworkInterface> { class NetworkInterface final : public ServiceFramework<NetworkInterface> {
public: public:
explicit NetworkInterface(const char* name) : ServiceFramework{name} { explicit NetworkInterface(const char* name, Core::System& system)
: ServiceFramework{name}, system(system) {
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{4, &NetworkInterface::CreateGeneralServiceOld, "CreateGeneralServiceOld"}, {4, &NetworkInterface::CreateGeneralServiceOld, "CreateGeneralServiceOld"},
{5, &NetworkInterface::CreateGeneralService, "CreateGeneralService"}, {5, &NetworkInterface::CreateGeneralService, "CreateGeneralService"},
@ -258,7 +261,7 @@ public:
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(RESULT_SUCCESS); rb.Push(RESULT_SUCCESS);
rb.PushIpcInterface<IGeneralService>(); rb.PushIpcInterface<IGeneralService>(system);
} }
void CreateGeneralService(Kernel::HLERequestContext& ctx) { void CreateGeneralService(Kernel::HLERequestContext& ctx) {
@ -266,14 +269,17 @@ public:
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(RESULT_SUCCESS); rb.Push(RESULT_SUCCESS);
rb.PushIpcInterface<IGeneralService>(); rb.PushIpcInterface<IGeneralService>(system);
} }
private:
Core::System& system;
}; };
void InstallInterfaces(SM::ServiceManager& service_manager) { void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) {
std::make_shared<NetworkInterface>("nifm:a")->InstallAsService(service_manager); std::make_shared<NetworkInterface>("nifm:a", system)->InstallAsService(service_manager);
std::make_shared<NetworkInterface>("nifm:s")->InstallAsService(service_manager); std::make_shared<NetworkInterface>("nifm:s", system)->InstallAsService(service_manager);
std::make_shared<NetworkInterface>("nifm:u")->InstallAsService(service_manager); std::make_shared<NetworkInterface>("nifm:u", system)->InstallAsService(service_manager);
} }
} // namespace Service::NIFM } // namespace Service::NIFM

View File

@ -8,9 +8,13 @@ namespace Service::SM {
class ServiceManager; class ServiceManager;
} }
namespace Core {
class System;
}
namespace Service::NIFM { namespace Service::NIFM {
/// Registers all NIFM services with the specified service manager. /// Registers all NIFM services with the specified service manager.
void InstallInterfaces(SM::ServiceManager& service_manager); void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system);
} // namespace Service::NIFM } // namespace Service::NIFM

View File

@ -126,7 +126,7 @@ public:
class IEnsureNetworkClockAvailabilityService final class IEnsureNetworkClockAvailabilityService final
: public ServiceFramework<IEnsureNetworkClockAvailabilityService> { : public ServiceFramework<IEnsureNetworkClockAvailabilityService> {
public: public:
IEnsureNetworkClockAvailabilityService() explicit IEnsureNetworkClockAvailabilityService(Core::System& system)
: ServiceFramework("IEnsureNetworkClockAvailabilityService") { : ServiceFramework("IEnsureNetworkClockAvailabilityService") {
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, &IEnsureNetworkClockAvailabilityService::StartTask, "StartTask"}, {0, &IEnsureNetworkClockAvailabilityService::StartTask, "StartTask"},
@ -139,7 +139,7 @@ public:
}; };
RegisterHandlers(functions); RegisterHandlers(functions);
auto& kernel = Core::System::GetInstance().Kernel(); auto& kernel = system.Kernel();
finished_event = Kernel::WritableEvent::CreateEventPair( finished_event = Kernel::WritableEvent::CreateEventPair(
kernel, Kernel::ResetType::Automatic, kernel, Kernel::ResetType::Automatic,
"IEnsureNetworkClockAvailabilityService:FinishEvent"); "IEnsureNetworkClockAvailabilityService:FinishEvent");
@ -200,7 +200,7 @@ private:
class NTC final : public ServiceFramework<NTC> { class NTC final : public ServiceFramework<NTC> {
public: public:
explicit NTC() : ServiceFramework{"ntc"} { explicit NTC(Core::System& system) : ServiceFramework{"ntc"}, system(system) {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, &NTC::OpenEnsureNetworkClockAvailabilityService, "OpenEnsureNetworkClockAvailabilityService"}, {0, &NTC::OpenEnsureNetworkClockAvailabilityService, "OpenEnsureNetworkClockAvailabilityService"},
@ -218,7 +218,7 @@ private:
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(RESULT_SUCCESS); rb.Push(RESULT_SUCCESS);
rb.PushIpcInterface<IEnsureNetworkClockAvailabilityService>(); rb.PushIpcInterface<IEnsureNetworkClockAvailabilityService>(system);
} }
// TODO(ogniK): Do we need these? // TODO(ogniK): Do we need these?
@ -235,13 +235,14 @@ private:
IPC::ResponseBuilder rb{ctx, 2}; IPC::ResponseBuilder rb{ctx, 2};
rb.Push(RESULT_SUCCESS); rb.Push(RESULT_SUCCESS);
} }
Core::System& system;
}; };
void InstallInterfaces(SM::ServiceManager& sm) { void InstallInterfaces(SM::ServiceManager& sm, Core::System& system) {
std::make_shared<NIM>()->InstallAsService(sm); std::make_shared<NIM>()->InstallAsService(sm);
std::make_shared<NIM_ECA>()->InstallAsService(sm); std::make_shared<NIM_ECA>()->InstallAsService(sm);
std::make_shared<NIM_SHP>()->InstallAsService(sm); std::make_shared<NIM_SHP>()->InstallAsService(sm);
std::make_shared<NTC>()->InstallAsService(sm); std::make_shared<NTC>(system)->InstallAsService(sm);
} }
} // namespace Service::NIM } // namespace Service::NIM

View File

@ -8,8 +8,12 @@ namespace Service::SM {
class ServiceManager; class ServiceManager;
} }
namespace Core {
class System;
}
namespace Service::NIM { namespace Service::NIM {
void InstallInterfaces(SM::ServiceManager& sm); void InstallInterfaces(SM::ServiceManager& sm, Core::System& system);
} // namespace Service::NIM } // namespace Service::NIM

View File

@ -617,7 +617,8 @@ public:
} }
}; };
void InstallInterfaces(SM::ServiceManager& service_manager, FileSystem::FileSystemController& fsc) { void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) {
std::make_shared<NS>("ns:am2")->InstallAsService(service_manager); std::make_shared<NS>("ns:am2")->InstallAsService(service_manager);
std::make_shared<NS>("ns:ec")->InstallAsService(service_manager); std::make_shared<NS>("ns:ec")->InstallAsService(service_manager);
std::make_shared<NS>("ns:rid")->InstallAsService(service_manager); std::make_shared<NS>("ns:rid")->InstallAsService(service_manager);
@ -628,7 +629,7 @@ void InstallInterfaces(SM::ServiceManager& service_manager, FileSystem::FileSyst
std::make_shared<NS_SU>()->InstallAsService(service_manager); std::make_shared<NS_SU>()->InstallAsService(service_manager);
std::make_shared<NS_VM>()->InstallAsService(service_manager); std::make_shared<NS_VM>()->InstallAsService(service_manager);
std::make_shared<PL_U>(fsc)->InstallAsService(service_manager); std::make_shared<PL_U>(system)->InstallAsService(service_manager);
} }
} // namespace Service::NS } // namespace Service::NS

View File

@ -97,8 +97,7 @@ private:
}; };
/// Registers all NS services with the specified service manager. /// Registers all NS services with the specified service manager.
void InstallInterfaces(SM::ServiceManager& service_manager, FileSystem::FileSystemController& fsc); void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system);
} // namespace NS } // namespace NS
} // namespace Service } // namespace Service

View File

@ -150,8 +150,9 @@ struct PL_U::Impl {
std::vector<FontRegion> shared_font_regions; std::vector<FontRegion> shared_font_regions;
}; };
PL_U::PL_U(FileSystem::FileSystemController& fsc) PL_U::PL_U(Core::System& system)
: ServiceFramework("pl:u"), impl{std::make_unique<Impl>()} { : ServiceFramework("pl:u"), impl{std::make_unique<Impl>()}, system(system) {
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, &PL_U::RequestLoad, "RequestLoad"}, {0, &PL_U::RequestLoad, "RequestLoad"},
{1, &PL_U::GetLoadState, "GetLoadState"}, {1, &PL_U::GetLoadState, "GetLoadState"},
@ -161,6 +162,9 @@ PL_U::PL_U(FileSystem::FileSystemController& fsc)
{5, &PL_U::GetSharedFontInOrderOfPriority, "GetSharedFontInOrderOfPriority"}, {5, &PL_U::GetSharedFontInOrderOfPriority, "GetSharedFontInOrderOfPriority"},
}; };
RegisterHandlers(functions); RegisterHandlers(functions);
auto& fsc = system.GetFileSystemController();
// Attempt to load shared font data from disk // Attempt to load shared font data from disk
const auto* nand = fsc.GetSystemNANDContents(); const auto* nand = fsc.GetSystemNANDContents();
std::size_t offset = 0; std::size_t offset = 0;
@ -325,7 +329,7 @@ void PL_U::GetSharedMemoryNativeHandle(Kernel::HLERequestContext& ctx) {
Kernel::MemoryState::Shared); Kernel::MemoryState::Shared);
// Create shared font memory object // Create shared font memory object
auto& kernel = Core::System::GetInstance().Kernel(); auto& kernel = system.Kernel();
impl->shared_font_mem = Kernel::SharedMemory::Create( impl->shared_font_mem = Kernel::SharedMemory::Create(
kernel, Core::CurrentProcess(), SHARED_FONT_MEM_SIZE, Kernel::MemoryPermission::ReadWrite, kernel, Core::CurrentProcess(), SHARED_FONT_MEM_SIZE, Kernel::MemoryPermission::ReadWrite,
Kernel::MemoryPermission::Read, SHARED_FONT_MEM_VADDR, Kernel::MemoryRegion::BASE, Kernel::MemoryPermission::Read, SHARED_FONT_MEM_VADDR, Kernel::MemoryRegion::BASE,

View File

@ -17,7 +17,7 @@ namespace NS {
class PL_U final : public ServiceFramework<PL_U> { class PL_U final : public ServiceFramework<PL_U> {
public: public:
PL_U(FileSystem::FileSystemController& fsc); explicit PL_U(Core::System& system);
~PL_U() override; ~PL_U() override;
private: private:
@ -30,6 +30,7 @@ private:
struct Impl; struct Impl;
std::unique_ptr<Impl> impl; std::unique_ptr<Impl> impl;
Core::System& system;
}; };
} // namespace NS } // namespace NS

View File

@ -29,26 +29,28 @@ namespace Service::NVFlinger {
constexpr s64 frame_ticks = static_cast<s64>(Core::Timing::BASE_CLOCK_RATE / 60); constexpr s64 frame_ticks = static_cast<s64>(Core::Timing::BASE_CLOCK_RATE / 60);
constexpr s64 frame_ticks_30fps = static_cast<s64>(Core::Timing::BASE_CLOCK_RATE / 30); constexpr s64 frame_ticks_30fps = static_cast<s64>(Core::Timing::BASE_CLOCK_RATE / 30);
NVFlinger::NVFlinger(Core::Timing::CoreTiming& core_timing) : core_timing{core_timing} { NVFlinger::NVFlinger(Core::System& system) : system(system) {
displays.emplace_back(0, "Default"); displays.emplace_back(0, "Default", system);
displays.emplace_back(1, "External"); displays.emplace_back(1, "External", system);
displays.emplace_back(2, "Edid"); displays.emplace_back(2, "Edid", system);
displays.emplace_back(3, "Internal"); displays.emplace_back(3, "Internal", system);
displays.emplace_back(4, "Null"); displays.emplace_back(4, "Null", system);
// Schedule the screen composition events // Schedule the screen composition events
composition_event = core_timing.RegisterEvent("ScreenComposition", [this](u64 userdata, composition_event = system.CoreTiming().RegisterEvent(
s64 cycles_late) { "ScreenComposition", [this](u64 userdata, s64 cycles_late) {
Compose(); Compose();
const auto ticks = Settings::values.force_30fps_mode ? frame_ticks_30fps : GetNextTicks(); const auto ticks =
this->core_timing.ScheduleEvent(std::max<s64>(0LL, ticks - cycles_late), composition_event); Settings::values.force_30fps_mode ? frame_ticks_30fps : GetNextTicks();
}); this->system.CoreTiming().ScheduleEvent(std::max<s64>(0LL, ticks - cycles_late),
composition_event);
});
core_timing.ScheduleEvent(frame_ticks, composition_event); system.CoreTiming().ScheduleEvent(frame_ticks, composition_event);
} }
NVFlinger::~NVFlinger() { NVFlinger::~NVFlinger() {
core_timing.UnscheduleEvent(composition_event, 0); system.CoreTiming().UnscheduleEvent(composition_event, 0);
} }
void NVFlinger::SetNVDrvInstance(std::shared_ptr<Nvidia::Module> instance) { void NVFlinger::SetNVDrvInstance(std::shared_ptr<Nvidia::Module> instance) {
@ -185,11 +187,9 @@ void NVFlinger::Compose() {
MicroProfileFlip(); MicroProfileFlip();
if (!buffer) { if (!buffer) {
auto& system_instance = Core::System::GetInstance();
// There was no queued buffer to draw, render previous frame // There was no queued buffer to draw, render previous frame
system_instance.GetPerfStats().EndGameFrame(); system.GetPerfStats().EndGameFrame();
system_instance.GPU().SwapBuffers({}); system.GPU().SwapBuffers({});
continue; continue;
} }

View File

@ -38,7 +38,7 @@ class BufferQueue;
class NVFlinger final { class NVFlinger final {
public: public:
explicit NVFlinger(Core::Timing::CoreTiming& core_timing); explicit NVFlinger(Core::System& system);
~NVFlinger(); ~NVFlinger();
/// Sets the NVDrv module instance to use to send buffers to the GPU. /// Sets the NVDrv module instance to use to send buffers to the GPU.
@ -105,8 +105,7 @@ private:
/// Event that handles screen composition. /// Event that handles screen composition.
Core::Timing::EventType* composition_event; Core::Timing::EventType* composition_event;
/// Core timing instance for registering/unregistering the composition event. Core::System& system;
Core::Timing::CoreTiming& core_timing;
}; };
} // namespace Service::NVFlinger } // namespace Service::NVFlinger

View File

@ -15,7 +15,7 @@ namespace Service::PlayReport {
class PlayReport final : public ServiceFramework<PlayReport> { class PlayReport final : public ServiceFramework<PlayReport> {
public: public:
explicit PlayReport(Core::System& system, const char* name) explicit PlayReport(const char* name, Core::System& system)
: ServiceFramework{name}, system(system) { : ServiceFramework{name}, system(system) {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
@ -128,12 +128,12 @@ private:
Core::System& system; Core::System& system;
}; };
void InstallInterfaces(Core::System& system) { void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system) {
std::make_shared<PlayReport>(system, "prepo:a")->InstallAsService(system.ServiceManager()); std::make_shared<PlayReport>("prepo:a", system)->InstallAsService(service_manager);
std::make_shared<PlayReport>(system, "prepo:a2")->InstallAsService(system.ServiceManager()); std::make_shared<PlayReport>("prepo:a2", system)->InstallAsService(service_manager);
std::make_shared<PlayReport>(system, "prepo:m")->InstallAsService(system.ServiceManager()); std::make_shared<PlayReport>("prepo:m", system)->InstallAsService(service_manager);
std::make_shared<PlayReport>(system, "prepo:s")->InstallAsService(system.ServiceManager()); std::make_shared<PlayReport>("prepo:s", system)->InstallAsService(service_manager);
std::make_shared<PlayReport>(system, "prepo:u")->InstallAsService(system.ServiceManager()); std::make_shared<PlayReport>("prepo:u", system)->InstallAsService(service_manager);
} }
} // namespace Service::PlayReport } // namespace Service::PlayReport

View File

@ -8,8 +8,12 @@ namespace Service::SM {
class ServiceManager; class ServiceManager;
} }
namespace Core {
class System;
}
namespace Service::PlayReport { namespace Service::PlayReport {
void InstallInterfaces(Core::System& system); void InstallInterfaces(SM::ServiceManager& service_manager, Core::System& system);
} // namespace Service::PlayReport } // namespace Service::PlayReport

View File

@ -198,50 +198,50 @@ ResultCode ServiceFrameworkBase::HandleSyncRequest(Kernel::HLERequestContext& co
void Init(std::shared_ptr<SM::ServiceManager>& sm, Core::System& system) { void Init(std::shared_ptr<SM::ServiceManager>& sm, Core::System& system) {
// NVFlinger needs to be accessed by several services like Vi and AppletOE so we instantiate it // NVFlinger needs to be accessed by several services like Vi and AppletOE so we instantiate it
// here and pass it into the respective InstallInterfaces functions. // here and pass it into the respective InstallInterfaces functions.
auto nv_flinger = std::make_shared<NVFlinger::NVFlinger>(system.CoreTiming()); auto nv_flinger = std::make_shared<NVFlinger::NVFlinger>(system);
system.GetFileSystemController().CreateFactories(*system.GetFilesystem(), false); system.GetFileSystemController().CreateFactories(*system.GetFilesystem(), false);
SM::ServiceManager::InstallInterfaces(sm); SM::ServiceManager::InstallInterfaces(sm);
Account::InstallInterfaces(system); Account::InstallInterfaces(system);
AM::InstallInterfaces(*sm, nv_flinger, system); AM::InstallInterfaces(*sm, nv_flinger, system);
AOC::InstallInterfaces(*sm); AOC::InstallInterfaces(*sm, system);
APM::InstallInterfaces(system); APM::InstallInterfaces(system);
Audio::InstallInterfaces(*sm, system); Audio::InstallInterfaces(*sm, system);
BCAT::InstallInterfaces(*sm); BCAT::InstallInterfaces(*sm);
BPC::InstallInterfaces(*sm); BPC::InstallInterfaces(*sm);
BtDrv::InstallInterfaces(*sm); BtDrv::InstallInterfaces(*sm, system);
BTM::InstallInterfaces(*sm); BTM::InstallInterfaces(*sm, system);
Capture::InstallInterfaces(*sm); Capture::InstallInterfaces(*sm);
ERPT::InstallInterfaces(*sm); ERPT::InstallInterfaces(*sm);
ES::InstallInterfaces(*sm); ES::InstallInterfaces(*sm);
EUPLD::InstallInterfaces(*sm); EUPLD::InstallInterfaces(*sm);
Fatal::InstallInterfaces(*sm); Fatal::InstallInterfaces(*sm, system);
FGM::InstallInterfaces(*sm); FGM::InstallInterfaces(*sm);
FileSystem::InstallInterfaces(system); FileSystem::InstallInterfaces(system);
Friend::InstallInterfaces(*sm); Friend::InstallInterfaces(*sm, system);
Glue::InstallInterfaces(system); Glue::InstallInterfaces(system);
GRC::InstallInterfaces(*sm); GRC::InstallInterfaces(*sm);
HID::InstallInterfaces(*sm); HID::InstallInterfaces(*sm, system);
LBL::InstallInterfaces(*sm); LBL::InstallInterfaces(*sm);
LDN::InstallInterfaces(*sm); LDN::InstallInterfaces(*sm);
LDR::InstallInterfaces(*sm); LDR::InstallInterfaces(*sm, system);
LM::InstallInterfaces(*sm); LM::InstallInterfaces(*sm);
Migration::InstallInterfaces(*sm); Migration::InstallInterfaces(*sm);
Mii::InstallInterfaces(*sm); Mii::InstallInterfaces(*sm);
MM::InstallInterfaces(*sm); MM::InstallInterfaces(*sm);
NCM::InstallInterfaces(*sm); NCM::InstallInterfaces(*sm);
NFC::InstallInterfaces(*sm); NFC::InstallInterfaces(*sm);
NFP::InstallInterfaces(*sm); NFP::InstallInterfaces(*sm, system);
NIFM::InstallInterfaces(*sm); NIFM::InstallInterfaces(*sm, system);
NIM::InstallInterfaces(*sm); NIM::InstallInterfaces(*sm, system);
NPNS::InstallInterfaces(*sm); NPNS::InstallInterfaces(*sm);
NS::InstallInterfaces(*sm, system.GetFileSystemController()); NS::InstallInterfaces(*sm, system);
Nvidia::InstallInterfaces(*sm, *nv_flinger, system); Nvidia::InstallInterfaces(*sm, *nv_flinger, system);
PCIe::InstallInterfaces(*sm); PCIe::InstallInterfaces(*sm);
PCTL::InstallInterfaces(*sm); PCTL::InstallInterfaces(*sm);
PCV::InstallInterfaces(*sm); PCV::InstallInterfaces(*sm);
PlayReport::InstallInterfaces(system); PlayReport::InstallInterfaces(*sm, system);
PM::InstallInterfaces(system); PM::InstallInterfaces(system);
PSC::InstallInterfaces(*sm); PSC::InstallInterfaces(*sm);
PSM::InstallInterfaces(*sm); PSM::InstallInterfaces(*sm);

View File

@ -7,8 +7,8 @@
namespace Service::Time { namespace Service::Time {
Time::Time(std::shared_ptr<Module> time, std::shared_ptr<SharedMemory> shared_memory, Time::Time(std::shared_ptr<Module> time, std::shared_ptr<SharedMemory> shared_memory,
const char* name) Core::System& system, const char* name)
: Module::Interface(std::move(time), std::move(shared_memory), name) { : Module::Interface(std::move(time), std::move(shared_memory), system, name) {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, &Time::GetStandardUserSystemClock, "GetStandardUserSystemClock"}, {0, &Time::GetStandardUserSystemClock, "GetStandardUserSystemClock"},

View File

@ -13,7 +13,7 @@ class SharedMemory;
class Time final : public Module::Interface { class Time final : public Module::Interface {
public: public:
explicit Time(std::shared_ptr<Module> time, std::shared_ptr<SharedMemory> shared_memory, explicit Time(std::shared_ptr<Module> time, std::shared_ptr<SharedMemory> shared_memory,
const char* name); Core::System& system, const char* name);
~Time() override; ~Time() override;
}; };

View File

@ -126,8 +126,8 @@ private:
class ISteadyClock final : public ServiceFramework<ISteadyClock> { class ISteadyClock final : public ServiceFramework<ISteadyClock> {
public: public:
ISteadyClock(std::shared_ptr<SharedMemory> shared_memory) ISteadyClock(std::shared_ptr<SharedMemory> shared_memory, Core::System& system)
: ServiceFramework("ISteadyClock"), shared_memory(shared_memory) { : ServiceFramework("ISteadyClock"), shared_memory(shared_memory), system(system) {
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, &ISteadyClock::GetCurrentTimePoint, "GetCurrentTimePoint"}, {0, &ISteadyClock::GetCurrentTimePoint, "GetCurrentTimePoint"},
}; };
@ -150,12 +150,13 @@ private:
} }
SteadyClockTimePoint GetCurrentTimePoint() const { SteadyClockTimePoint GetCurrentTimePoint() const {
const auto& core_timing = Core::System::GetInstance().CoreTiming(); const auto& core_timing = system.CoreTiming();
const auto ms = Core::Timing::CyclesToMs(core_timing.GetTicks()); const auto ms = Core::Timing::CyclesToMs(core_timing.GetTicks());
return {static_cast<u64_le>(ms.count() / 1000), {}}; return {static_cast<u64_le>(ms.count() / 1000), {}};
} }
std::shared_ptr<SharedMemory> shared_memory; std::shared_ptr<SharedMemory> shared_memory;
Core::System& system;
}; };
class ITimeZoneService final : public ServiceFramework<ITimeZoneService> { class ITimeZoneService final : public ServiceFramework<ITimeZoneService> {
@ -290,7 +291,7 @@ void Module::Interface::GetStandardSteadyClock(Kernel::HLERequestContext& ctx) {
IPC::ResponseBuilder rb{ctx, 2, 0, 1}; IPC::ResponseBuilder rb{ctx, 2, 0, 1};
rb.Push(RESULT_SUCCESS); rb.Push(RESULT_SUCCESS);
rb.PushIpcInterface<ISteadyClock>(shared_memory); rb.PushIpcInterface<ISteadyClock>(shared_memory, system);
} }
void Module::Interface::GetTimeZoneService(Kernel::HLERequestContext& ctx) { void Module::Interface::GetTimeZoneService(Kernel::HLERequestContext& ctx) {
@ -325,7 +326,7 @@ void Module::Interface::GetClockSnapshot(Kernel::HLERequestContext& ctx) {
return; return;
} }
const auto& core_timing = Core::System::GetInstance().CoreTiming(); const auto& core_timing = system.CoreTiming();
const auto ms = Core::Timing::CyclesToMs(core_timing.GetTicks()); const auto ms = Core::Timing::CyclesToMs(core_timing.GetTicks());
const SteadyClockTimePoint steady_clock_time_point{static_cast<u64_le>(ms.count() / 1000), {}}; const SteadyClockTimePoint steady_clock_time_point{static_cast<u64_le>(ms.count() / 1000), {}};
@ -407,8 +408,10 @@ void Module::Interface::SetStandardUserSystemClockAutomaticCorrectionEnabled(
} }
Module::Interface::Interface(std::shared_ptr<Module> time, Module::Interface::Interface(std::shared_ptr<Module> time,
std::shared_ptr<SharedMemory> shared_memory, const char* name) std::shared_ptr<SharedMemory> shared_memory, Core::System& system,
: ServiceFramework(name), time(std::move(time)), shared_memory(std::move(shared_memory)) {} const char* name)
: ServiceFramework(name), time(std::move(time)), shared_memory(std::move(shared_memory)),
system(system) {}
Module::Interface::~Interface() = default; Module::Interface::~Interface() = default;
@ -416,9 +419,11 @@ void InstallInterfaces(Core::System& system) {
auto time = std::make_shared<Module>(); auto time = std::make_shared<Module>();
auto shared_mem = std::make_shared<SharedMemory>(system); auto shared_mem = std::make_shared<SharedMemory>(system);
std::make_shared<Time>(time, shared_mem, "time:a")->InstallAsService(system.ServiceManager()); std::make_shared<Time>(time, shared_mem, system, "time:a")
std::make_shared<Time>(time, shared_mem, "time:s")->InstallAsService(system.ServiceManager()); ->InstallAsService(system.ServiceManager());
std::make_shared<Time>(std::move(time), shared_mem, "time:u") std::make_shared<Time>(time, shared_mem, system, "time:s")
->InstallAsService(system.ServiceManager());
std::make_shared<Time>(std::move(time), shared_mem, system, "time:u")
->InstallAsService(system.ServiceManager()); ->InstallAsService(system.ServiceManager());
} }

View File

@ -80,7 +80,8 @@ public:
class Interface : public ServiceFramework<Interface> { class Interface : public ServiceFramework<Interface> {
public: public:
explicit Interface(std::shared_ptr<Module> time, explicit Interface(std::shared_ptr<Module> time,
std::shared_ptr<SharedMemory> shared_memory, const char* name); std::shared_ptr<SharedMemory> shared_memory, Core::System& system,
const char* name);
~Interface() override; ~Interface() override;
void GetStandardUserSystemClock(Kernel::HLERequestContext& ctx); void GetStandardUserSystemClock(Kernel::HLERequestContext& ctx);
@ -97,6 +98,7 @@ public:
protected: protected:
std::shared_ptr<Module> time; std::shared_ptr<Module> time;
std::shared_ptr<SharedMemory> shared_memory; std::shared_ptr<SharedMemory> shared_memory;
Core::System& system;
}; };
}; };

View File

@ -15,8 +15,8 @@
namespace Service::VI { namespace Service::VI {
Display::Display(u64 id, std::string name) : id{id}, name{std::move(name)} { Display::Display(u64 id, std::string name, Core::System& system) : id{id}, name{std::move(name)} {
auto& kernel = Core::System::GetInstance().Kernel(); auto& kernel = system.Kernel();
vsync_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Manual, vsync_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Manual,
fmt::format("Display VSync Event {}", id)); fmt::format("Display VSync Event {}", id));
} }

View File

@ -26,7 +26,7 @@ public:
/// @param id The unique ID for this display. /// @param id The unique ID for this display.
/// @param name The name for this display. /// @param name The name for this display.
/// ///
Display(u64 id, std::string name); Display(u64 id, std::string name, Core::System& system);
~Display(); ~Display();
Display(const Display&) = delete; Display(const Display&) = delete;