mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-30 10:42:47 +01:00
Merge pull request #2884 from ogniK5377/deglobal-sys-services
Remove usage of System::CurrentInterface() from most services
This commit is contained in:
commit
4ace69de9c
64 changed files with 290 additions and 211 deletions
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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"},
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"},
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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() {}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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() {}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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() {}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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() {}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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");
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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() {}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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() {}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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() {}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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> {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"},
|
||||||
};
|
};
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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"},
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue