diff --git a/stratosphere/loader/source/ldr_ro_service.cpp b/stratosphere/loader/source/ldr_ro_service.cpp new file mode 100644 index 000000000..f5f7f5984 --- /dev/null +++ b/stratosphere/loader/source/ldr_ro_service.cpp @@ -0,0 +1,57 @@ +#include +#include +#include + +#include "ldr_ro_service.hpp" +#include "ldr_registration.hpp" + +Result RelocatableObjectsService::dispatch(IpcParsedCommand &r, IpcCommand &out_c, u64 cmd_id, u8 *pointer_buffer, size_t pointer_buffer_size) { + Result rc = 0xF601; + + switch ((RoServiceCmd)cmd_id) { + case Ro_Cmd_LoadNro: + rc = WrapIpcCommandImpl<&RelocatableObjectsService::load_nro>(this, r, out_c, pointer_buffer, pointer_buffer_size); + break; + case Ro_Cmd_UnloadNro: + rc = WrapIpcCommandImpl<&RelocatableObjectsService::unload_nro>(this, r, out_c, pointer_buffer, pointer_buffer_size); + break; + case Ro_Cmd_LoadNrr: + rc = WrapIpcCommandImpl<&RelocatableObjectsService::load_nrr>(this, r, out_c, pointer_buffer, pointer_buffer_size); + break; + case Ro_Cmd_UnloadNrr: + rc = WrapIpcCommandImpl<&RelocatableObjectsService::unload_nrr>(this, r, out_c, pointer_buffer, pointer_buffer_size); + break; + case Ro_Cmd_Initialize: + rc = WrapIpcCommandImpl<&RelocatableObjectsService::initialize>(this, r, out_c, pointer_buffer, pointer_buffer_size); + break; + default: + break; + } + return rc; +} + + +std::tuple load_nro(PidDescriptor pid, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size) { + /* TODO */ + return std::make_tuple(0xF601, 0); +} + +std::tuple unload_nro(PidDescriptor pid, u64 nro_address) { + /* TODO */ + return std::make_tuple(0xF601); +} + +std::tuple load_nrr(PidDescriptor pid, u64 nrr_address, u64 nrr_size) { + /* TODO */ + return std::make_tuple(0xF601); +} + +std::tuple unload_nrr(PidDescriptor pid, u64 nrr_address) { + /* TODO */ + return std::make_tuple(0xF601); +} + +std::tuple initialize(PidDescriptor pid, CopiedHandle process_h) { + /* TODO */ + return std::make_tuple(0xF601); +} diff --git a/stratosphere/loader/source/ldr_ro_service.hpp b/stratosphere/loader/source/ldr_ro_service.hpp new file mode 100644 index 000000000..29d057ba0 --- /dev/null +++ b/stratosphere/loader/source/ldr_ro_service.hpp @@ -0,0 +1,34 @@ +#pragma once +#include + +#include +#include "ldr_registration.hpp" + +enum RoServiceCmd { + Ro_Cmd_LoadNro = 0, + Ro_Cmd_UnloadNro = 1, + Ro_Cmd_LoadNrr = 2, + Ro_Cmd_UnloadNrr = 3, + Ro_Cmd_Initialize = 4, +}; + +class RelocatableObjectsService : IServiceObject { + Handle process_handle; + u64 process_id; + bool has_initialized; + public: + RelocatableObjectsService() : process_handle(0), process_id(U64_MAX), has_initialized(false) { } + virtual Result dispatch(IpcParsedCommand &r, IpcCommand &out_c, u64 cmd_id, u8 *pointer_buffer, size_t pointer_buffer_size); + virtual Result handle_deferred() { + /* This service will never defer. */ + return 0; + } + + private: + /* Actual commands. */ + std::tuple load_nro(PidDescriptor pid, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size); + std::tuple unload_nro(PidDescriptor pid, u64 nro_address); + std::tuple load_nrr(PidDescriptor pid, u64 nrr_address, u64 nrr_size); + std::tuple unload_nrr(PidDescriptor pid, u64 nrr_address); + std::tuple initialize(PidDescriptor pid, CopiedHandle process_h); +}; \ No newline at end of file