diff --git a/stratosphere/ro/source/ro_main.cpp b/stratosphere/ro/source/ro_main.cpp index 4c7264ff0..cff2733f4 100644 --- a/stratosphere/ro/source/ro_main.cpp +++ b/stratosphere/ro/source/ro_main.cpp @@ -24,6 +24,7 @@ #include #include "ro_debug_monitor.hpp" +#include "ro_service.hpp" extern "C" { extern u32 __start__; @@ -103,13 +104,24 @@ void __appExit(void) { smExit(); } +/* Helpers to create RO objects. */ +static const auto MakeRoServiceForSelf = []() { return std::make_shared(RoServiceType_ForSelf); }; +static const auto MakeRoServiceForOthers = []() { return std::make_shared(RoServiceType_ForSelf); }; + int main(int argc, char **argv) { /* Static server manager. */ static auto s_server_manager = WaitableManager(1); - /* TODO: Create services. */ + /* Create services. */ s_server_manager.AddWaitable(new ServiceServer("ro:dmnt", 1)); + { + + s_server_manager.AddWaitable(new ServiceServer("ldr:ro", 32)); + if (GetRuntimeFirmwareVersion() >= FirmwareVersion_700) { + s_server_manager.AddWaitable(new ServiceServer("ro:1", 2)); + } + } /* Loop forever, servicing our services. */ s_server_manager.Process(); diff --git a/stratosphere/ro/source/ro_service.cpp b/stratosphere/ro/source/ro_service.cpp new file mode 100644 index 000000000..0ecbf1551 --- /dev/null +++ b/stratosphere/ro/source/ro_service.cpp @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2018-2019 Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include + +#include "ro_service.hpp" + +RelocatableObjectsService::~RelocatableObjectsService() { + /* TODO */ +} + +Result RelocatableObjectsService::LoadNro(Out load_address, PidDescriptor pid_desc, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size) { + /* TODO */ + return ResultKernelConnectionClosed; +} + +Result RelocatableObjectsService::UnloadNro(PidDescriptor pid_desc, u64 nro_address) { + /* TODO */ + return ResultKernelConnectionClosed; +} + +Result RelocatableObjectsService::LoadNrr(PidDescriptor pid_desc, u64 nrr_address, u64 nrr_size) { + /* TODO */ + return ResultKernelConnectionClosed; +} + +Result RelocatableObjectsService::UnloadNrr(PidDescriptor pid_desc, u64 nrr_address) { + /* TODO */ + return ResultKernelConnectionClosed; +} + +Result RelocatableObjectsService::Initialize(PidDescriptor pid_desc, CopiedHandle process_h) { + /* TODO */ + return ResultKernelConnectionClosed; +} + +Result RelocatableObjectsService::LoadNrrEx(PidDescriptor pid_desc, u64 nrr_address, u64 nrr_size, CopiedHandle process_h) { + /* TODO */ + return ResultKernelConnectionClosed; +} \ No newline at end of file diff --git a/stratosphere/ro/source/ro_service.hpp b/stratosphere/ro/source/ro_service.hpp new file mode 100644 index 000000000..8066c86e8 --- /dev/null +++ b/stratosphere/ro/source/ro_service.hpp @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018-2019 Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once +#include + +#include + +enum RoServiceCmd { + Ro_Cmd_LoadNro = 0, + Ro_Cmd_UnloadNro = 1, + Ro_Cmd_LoadNrr = 2, + Ro_Cmd_UnloadNrr = 3, + Ro_Cmd_Initialize = 4, + Ro_Cmd_LoadNrrEx = 10, +}; + +enum RoServiceType : u32 { + RoServiceType_ForSelf = 0, + RoServiceType_ForOthers = 1, +}; + +class RelocatableObjectsService final : public IServiceObject { + Handle process_handle = 0; + u64 process_id = U64_MAX; + bool has_initialized = false; + RoServiceType type; + public: + explicit RelocatableObjectsService(RoServiceType t) : type(t) { + /* ... */ + } + virtual ~RelocatableObjectsService() override; + + private: + /* Actual commands. */ + Result LoadNro(Out load_address, PidDescriptor pid_desc, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size); + Result UnloadNro(PidDescriptor pid_desc, u64 nro_address); + Result LoadNrr(PidDescriptor pid_desc, u64 nrr_address, u64 nrr_size); + Result UnloadNrr(PidDescriptor pid_desc, u64 nrr_address); + Result Initialize(PidDescriptor pid_desc, CopiedHandle process_h); + Result LoadNrrEx(PidDescriptor pid_desc, u64 nrr_address, u64 nrr_size, CopiedHandle process_h); + public: + DEFINE_SERVICE_DISPATCH_TABLE { + MakeServiceCommandMeta(), + MakeServiceCommandMeta(), + MakeServiceCommandMeta(), + MakeServiceCommandMeta(), + MakeServiceCommandMeta(), + MakeServiceCommandMeta(), + }; +};