diff options
Diffstat (limited to '')
-rw-r--r-- | src/core/hle/kernel/kernel.cpp | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 32bbf2d9b..8b55df82e 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp @@ -44,6 +44,7 @@ #include "core/hle/kernel/time_manager.h" #include "core/hle/lock.h" #include "core/hle/result.h" +#include "core/hle/service/sm/sm.h" #include "core/memory.h" MICROPROFILE_DEFINE(Kernel_SVC, "Kernel", "SVC", MP_RGB(70, 200, 70)); @@ -51,11 +52,11 @@ MICROPROFILE_DEFINE(Kernel_SVC, "Kernel", "SVC", MP_RGB(70, 200, 70)); namespace Kernel { struct KernelCore::Impl { - explicit Impl(Core::System& system, KernelCore& kernel) - : time_manager{system}, object_list_container{kernel}, system{system} {} + explicit Impl(Core::System& system_, KernelCore& kernel_) + : time_manager{system_}, object_list_container{kernel_}, system{system_} {} - void SetMulticore(bool is_multicore) { - this->is_multicore = is_multicore; + void SetMulticore(bool is_multi) { + is_multicore = is_multi; } void Initialize(KernelCore& kernel) { @@ -599,19 +600,19 @@ struct KernelCore::Impl { irs_shared_mem = KSharedMemory::Create(system.Kernel()); time_shared_mem = KSharedMemory::Create(system.Kernel()); - hid_shared_mem->Initialize(system.Kernel(), system.DeviceMemory(), nullptr, + hid_shared_mem->Initialize(system.DeviceMemory(), nullptr, {hid_phys_addr, hid_size / PageSize}, Svc::MemoryPermission::None, Svc::MemoryPermission::Read, hid_phys_addr, hid_size, "HID:SharedMemory"); - font_shared_mem->Initialize(system.Kernel(), system.DeviceMemory(), nullptr, + font_shared_mem->Initialize(system.DeviceMemory(), nullptr, {font_phys_addr, font_size / PageSize}, Svc::MemoryPermission::None, Svc::MemoryPermission::Read, font_phys_addr, font_size, "Font:SharedMemory"); - irs_shared_mem->Initialize(system.Kernel(), system.DeviceMemory(), nullptr, + irs_shared_mem->Initialize(system.DeviceMemory(), nullptr, {irs_phys_addr, irs_size / PageSize}, Svc::MemoryPermission::None, Svc::MemoryPermission::Read, irs_phys_addr, irs_size, "IRS:SharedMemory"); - time_shared_mem->Initialize(system.Kernel(), system.DeviceMemory(), nullptr, + time_shared_mem->Initialize(system.DeviceMemory(), nullptr, {time_phys_addr, time_size / PageSize}, Svc::MemoryPermission::None, Svc::MemoryPermission::Read, time_phys_addr, time_size, "Time:SharedMemory"); @@ -656,6 +657,7 @@ struct KernelCore::Impl { /// Map of named ports managed by the kernel, which can be retrieved using /// the ConnectToPort SVC. + std::unordered_map<std::string, ServiceInterfaceFactory> service_interface_factory; NamedPortTable named_ports; std::unique_ptr<Core::ExclusiveMonitor> exclusive_monitor; @@ -844,18 +846,17 @@ void KernelCore::PrepareReschedule(std::size_t id) { // TODO: Reimplement, this } -void KernelCore::AddNamedPort(std::string name, KClientPort* port) { - port->Open(); - impl->named_ports.emplace(std::move(name), port); +void KernelCore::RegisterNamedService(std::string name, ServiceInterfaceFactory&& factory) { + impl->service_interface_factory.emplace(std::move(name), factory); } -KernelCore::NamedPortTable::iterator KernelCore::FindNamedPort(const std::string& name) { - return impl->named_ports.find(name); -} - -KernelCore::NamedPortTable::const_iterator KernelCore::FindNamedPort( - const std::string& name) const { - return impl->named_ports.find(name); +KClientPort* KernelCore::CreateNamedServicePort(std::string name) { + auto search = impl->service_interface_factory.find(name); + if (search == impl->service_interface_factory.end()) { + UNIMPLEMENTED(); + return {}; + } + return &search->second(impl->system.ServiceManager(), impl->system); } bool KernelCore::IsValidNamedPort(NamedPortTable::const_iterator port) const { |