core: Make ProgramRegistry part of the system instance

This commit is contained in:
FearlessTobi 2024-02-25 19:49:46 +01:00
parent ade3a79bde
commit 0cac10aa19
8 changed files with 40 additions and 33 deletions

View File

@ -22,6 +22,7 @@
#include "core/device_memory.h" #include "core/device_memory.h"
#include "core/file_sys/bis_factory.h" #include "core/file_sys/bis_factory.h"
#include "core/file_sys/fs_filesystem.h" #include "core/file_sys/fs_filesystem.h"
#include "core/file_sys/fssrv/fssrv_program_registry_impl.h"
#include "core/file_sys/patch_manager.h" #include "core/file_sys/patch_manager.h"
#include "core/file_sys/registered_cache.h" #include "core/file_sys/registered_cache.h"
#include "core/file_sys/romfs_factory.h" #include "core/file_sys/romfs_factory.h"
@ -137,8 +138,9 @@ FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs,
struct System::Impl { struct System::Impl {
explicit Impl(System& system) explicit Impl(System& system)
: kernel{system}, fs_controller{system}, hid_core{}, room_network{}, cpu_manager{system}, : kernel{system}, fs_controller{system}, program_registry{system}, hid_core{},
reporter{system}, applet_manager{system}, frontend_applets{system}, profile_manager{} {} room_network{}, cpu_manager{system}, reporter{system}, applet_manager{system},
frontend_applets{system}, profile_manager{} {}
void Initialize(System& system) { void Initialize(System& system) {
device_memory = std::make_unique<Core::DeviceMemory>(); device_memory = std::make_unique<Core::DeviceMemory>();
@ -470,6 +472,7 @@ struct System::Impl {
services.reset(); services.reset();
service_manager.reset(); service_manager.reset();
fs_controller.Reset(); fs_controller.Reset();
program_registry.Reset();
cheat_engine.reset(); cheat_engine.reset();
telemetry_session.reset(); telemetry_session.reset();
core_timing.ClearPendingEvents(); core_timing.ClearPendingEvents();
@ -556,6 +559,7 @@ struct System::Impl {
/// ContentProviderUnion instance /// ContentProviderUnion instance
std::unique_ptr<FileSys::ContentProviderUnion> content_provider; std::unique_ptr<FileSys::ContentProviderUnion> content_provider;
Service::FileSystem::FileSystemController fs_controller; Service::FileSystem::FileSystemController fs_controller;
FileSys::FsSrv::ProgramRegistryImpl program_registry;
/// AppLoader used to load the current executing application /// AppLoader used to load the current executing application
std::unique_ptr<Loader::AppLoader> app_loader; std::unique_ptr<Loader::AppLoader> app_loader;
std::unique_ptr<Tegra::GPU> gpu_core; std::unique_ptr<Tegra::GPU> gpu_core;
@ -939,6 +943,14 @@ void System::ClearContentProvider(FileSys::ContentProviderUnionSlot slot) {
impl->content_provider->ClearSlot(slot); impl->content_provider->ClearSlot(slot);
} }
FileSys::FsSrv::ProgramRegistryImpl& System::GetProgramRegistry() {
return impl->program_registry;
}
const FileSys::FsSrv::ProgramRegistryImpl& System::GetProgramRegistry() const {
return impl->program_registry;
}
const Reporter& System::GetReporter() const { const Reporter& System::GetReporter() const {
return impl->reporter; return impl->reporter;
} }

View File

@ -24,6 +24,10 @@ class ContentProvider;
class ContentProviderUnion; class ContentProviderUnion;
enum class ContentProviderUnionSlot; enum class ContentProviderUnionSlot;
class VfsFilesystem; class VfsFilesystem;
namespace FsSrv {
class ProgramRegistryImpl;
}
} // namespace FileSys } // namespace FileSys
namespace Kernel { namespace Kernel {
@ -373,6 +377,9 @@ public:
void ClearContentProvider(FileSys::ContentProviderUnionSlot slot); void ClearContentProvider(FileSys::ContentProviderUnionSlot slot);
[[nodiscard]] FileSys::FsSrv::ProgramRegistryImpl& GetProgramRegistry();
[[nodiscard]] const FileSys::FsSrv::ProgramRegistryImpl& GetProgramRegistry() const;
[[nodiscard]] const Reporter& GetReporter() const; [[nodiscard]] const Reporter& GetReporter() const;
[[nodiscard]] Service::Glue::ARPManager& GetARPManager(); [[nodiscard]] Service::Glue::ARPManager& GetARPManager();

View File

@ -9,35 +9,21 @@
namespace FileSys::FsSrv { namespace FileSys::FsSrv {
namespace {
constinit ProgramRegistryServiceImpl* g_impl = nullptr;
}
// TODO: Move this to a common types file // TODO: Move this to a common types file
constexpr u64 InvalidProcessIdProgramRegistry = 0xffffffffffffffffULL; constexpr u64 InvalidProcessIdProgramRegistry = 0xffffffffffffffffULL;
ProgramRegistryImpl::ProgramRegistryImpl(Core::System& system_) ProgramRegistryImpl::ProgramRegistryImpl(Core::System& system_)
: m_process_id(InvalidProcessIdProgramRegistry), system{system_} {} : m_process_id(InvalidProcessIdProgramRegistry), system{system_},
service_impl{std::make_unique<ProgramRegistryServiceImpl>(
system, ProgramRegistryServiceImpl::Configuration{})} {}
ProgramRegistryImpl::~ProgramRegistryImpl() {} ProgramRegistryImpl::~ProgramRegistryImpl() {}
void ProgramRegistryImpl::Initialize(ProgramRegistryServiceImpl* service) {
// Check pre-conditions
ASSERT(service != nullptr);
ASSERT(g_impl == nullptr);
// Set the global service
g_impl = service;
}
Result ProgramRegistryImpl::RegisterProgram(u64 process_id, u64 program_id, u8 storage_id, Result ProgramRegistryImpl::RegisterProgram(u64 process_id, u64 program_id, u8 storage_id,
const InBuffer<BufferAttr_HipcMapAlias> data, const InBuffer<BufferAttr_HipcMapAlias> data,
s64 data_size, s64 data_size,
const InBuffer<BufferAttr_HipcMapAlias> desc, const InBuffer<BufferAttr_HipcMapAlias> desc,
s64 desc_size) { s64 desc_size) {
// Check pre-conditions
ASSERT(g_impl != nullptr);
// Check that we're allowed to register // Check that we're allowed to register
R_UNLESS(FsSrv::Impl::IsInitialProgram(system, m_process_id), ResultPermissionDenied); R_UNLESS(FsSrv::Impl::IsInitialProgram(system, m_process_id), ResultPermissionDenied);
@ -46,19 +32,16 @@ Result ProgramRegistryImpl::RegisterProgram(u64 process_id, u64 program_id, u8 s
R_UNLESS(desc.size() >= static_cast<size_t>(desc_size), ResultInvalidSize); R_UNLESS(desc.size() >= static_cast<size_t>(desc_size), ResultInvalidSize);
// Register the program // Register the program
R_RETURN(g_impl->RegisterProgramInfo(process_id, program_id, storage_id, data.data(), data_size, R_RETURN(service_impl->RegisterProgramInfo(process_id, program_id, storage_id, data.data(),
desc.data(), desc_size)); data_size, desc.data(), desc_size));
} }
Result ProgramRegistryImpl::UnregisterProgram(u64 process_id) { Result ProgramRegistryImpl::UnregisterProgram(u64 process_id) {
// Check pre-conditions
ASSERT(g_impl != nullptr);
// Check that we're allowed to register // Check that we're allowed to register
R_UNLESS(FsSrv::Impl::IsInitialProgram(system, m_process_id), ResultPermissionDenied); R_UNLESS(FsSrv::Impl::IsInitialProgram(system, m_process_id), ResultPermissionDenied);
// Unregister the program // Unregister the program
R_RETURN(g_impl->UnregisterProgramInfo(process_id)); R_RETURN(service_impl->UnregisterProgramInfo(process_id));
} }
Result ProgramRegistryImpl::SetCurrentProcess(const Service::ClientProcessId& client_pid) { Result ProgramRegistryImpl::SetCurrentProcess(const Service::ClientProcessId& client_pid) {
@ -74,4 +57,9 @@ Result ProgramRegistryImpl::SetEnabledProgramVerification(bool enabled) {
R_THROW(ResultNotImplemented); R_THROW(ResultNotImplemented);
} }
void ProgramRegistryImpl::Reset() {
service_impl = std::make_unique<ProgramRegistryServiceImpl>(
system, ProgramRegistryServiceImpl::Configuration{});
}
} // namespace FileSys::FsSrv } // namespace FileSys::FsSrv

View File

@ -29,8 +29,6 @@ public:
ProgramRegistryImpl(Core::System& system_); ProgramRegistryImpl(Core::System& system_);
~ProgramRegistryImpl(); ~ProgramRegistryImpl();
static void Initialize(ProgramRegistryServiceImpl* service);
Result RegisterProgram(u64 process_id, u64 program_id, u8 storage_id, Result RegisterProgram(u64 process_id, u64 program_id, u8 storage_id,
const InBuffer<BufferAttr_HipcMapAlias> data, s64 data_size, const InBuffer<BufferAttr_HipcMapAlias> data, s64 data_size,
const InBuffer<BufferAttr_HipcMapAlias> desc, s64 desc_size); const InBuffer<BufferAttr_HipcMapAlias> desc, s64 desc_size);
@ -38,9 +36,13 @@ public:
Result SetCurrentProcess(const Service::ClientProcessId& client_pid); Result SetCurrentProcess(const Service::ClientProcessId& client_pid);
Result SetEnabledProgramVerification(bool enabled); Result SetEnabledProgramVerification(bool enabled);
void Reset();
private: private:
u64 m_process_id; u64 m_process_id;
Core::System& system; Core::System& system;
std::unique_ptr<ProgramRegistryServiceImpl> service_impl;
}; };
} // namespace FileSys::FsSrv } // namespace FileSys::FsSrv

View File

@ -3,9 +3,7 @@
#include "core/core.h" #include "core/core.h"
#include "core/file_sys/fssrv/fssrv_program_registry_service.h" #include "core/file_sys/fssrv/fssrv_program_registry_service.h"
#include "core/file_sys/fssrv/impl/fssrv_program_index_map_info_manager.h"
#include "core/file_sys/fssrv/impl/fssrv_program_info.h" #include "core/file_sys/fssrv/impl/fssrv_program_info.h"
#include "core/file_sys/fssrv/impl/fssrv_program_registry_manager.h"
namespace FileSys::FsSrv { namespace FileSys::FsSrv {

View File

@ -5,6 +5,8 @@
#include <optional> #include <optional>
#include "core/file_sys/fs_program_index_map_info.h" #include "core/file_sys/fs_program_index_map_info.h"
#include "core/file_sys/fssrv/impl/fssrv_program_index_map_info_manager.h"
#include "core/file_sys/fssrv/impl/fssrv_program_registry_manager.h"
#include "core/hle/result.h" #include "core/hle/result.h"
namespace Core { namespace Core {
@ -15,8 +17,6 @@ namespace FileSys::FsSrv {
namespace Impl { namespace Impl {
class ProgramInfo; class ProgramInfo;
class ProgramRegistryManager;
class ProgramIndexMapInfoManager;
} // namespace Impl } // namespace Impl
class ProgramRegistryServiceImpl { class ProgramRegistryServiceImpl {

View File

@ -7,7 +7,7 @@
namespace Service::FileSystem { namespace Service::FileSystem {
IProgramRegistry::IProgramRegistry(Core::System& system_) IProgramRegistry::IProgramRegistry(Core::System& system_)
: ServiceFramework{system_, "fsp:pr"}, registry{system_} { : ServiceFramework{system_, "fsp:pr"}, registry{system_.GetProgramRegistry()} {
// clang-format off // clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, C<&IProgramRegistry::RegisterProgram>, "RegisterProgram"}, {0, C<&IProgramRegistry::RegisterProgram>, "RegisterProgram"},

View File

@ -30,7 +30,7 @@ public:
Result SetEnabledProgramVerification(bool enabled); Result SetEnabledProgramVerification(bool enabled);
private: private:
FileSys::FsSrv::ProgramRegistryImpl registry; FileSys::FsSrv::ProgramRegistryImpl& registry;
}; };
} // namespace Service::FileSystem } // namespace Service::FileSystem