diff --git a/CMakeLists.txt b/CMakeLists.txt index 91aeee75..d5f662b1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -61,7 +61,7 @@ set(SERVICE_SOURCE_FILES src/core/services/service_manager.cpp src/core/services src/core/services/ptm.cpp src/core/services/mic.cpp src/core/services/cecd.cpp src/core/services/ac.cpp src/core/services/am.cpp src/core/services/boss.cpp src/core/services/frd.cpp src/core/services/nim.cpp src/core/services/shared_font.cpp - src/core/services/y2r.cpp src/core/services/cam.cpp + src/core/services/y2r.cpp src/core/services/cam.cpp src/core/services/ldr_ro.cpp ) set(PICA_SOURCE_FILES src/core/PICA/gpu.cpp src/core/PICA/regs.cpp src/core/PICA/shader_unit.cpp src/core/PICA/shader_interpreter.cpp @@ -90,6 +90,7 @@ set(HEADER_FILES include/emulator.hpp include/helpers.hpp include/opengl.hpp inc include/services/am.hpp include/services/boss.hpp include/services/frd.hpp include/services/nim.hpp include/fs/archive_ext_save_data.hpp include/services/shared_font.hpp include/fs/archive_ncch.hpp include/renderer_gl/textures.hpp include/colour.hpp include/services/y2r.hpp include/services/cam.hpp + include/services/ldr_ro.hpp ) set(THIRD_PARTY_SOURCE_FILES third_party/imgui/imgui.cpp @@ -100,7 +101,6 @@ set(THIRD_PARTY_SOURCE_FILES third_party/imgui/imgui.cpp third_party/gl3w/gl3w.cpp ) -#add_library(Alber ${HEADER_FILES}) source_group("Header Files\\Core" FILES ${HEADER_FILES}) source_group("Source Files\\Core" FILES ${SOURCE_FILES}) source_group("Source Files\\Core\\Filesystem" FILES ${FS_SOURCE_FILES}) diff --git a/include/kernel/handles.hpp b/include/kernel/handles.hpp index f06b4ad5..21fb4e92 100644 --- a/include/kernel/handles.hpp +++ b/include/kernel/handles.hpp @@ -23,6 +23,7 @@ namespace KernelHandles { GPU, // GPU service DSP, // DSP service (Used for audio decoding and output) LCD, // LCD service (Used for configuring the displays) + LDR_RO, // Loader service. Used for loading CROs. MIC, // MIC service (Controls the microphone) NIM, // Updates, DLC, etc NDM, // ????? @@ -72,6 +73,7 @@ namespace KernelHandles { case DSP: return "DSP"; case GPU: return "GPU"; case LCD: return "LCD"; + case LDR_RO: return "LDR:RO"; case MIC: return "MIC"; case NDM: return "NDM"; case NIM: return "NIM"; diff --git a/include/logger.hpp b/include/logger.hpp index 7a70dd3e..b2376b35 100644 --- a/include/logger.hpp +++ b/include/logger.hpp @@ -41,6 +41,7 @@ namespace Log { static Logger hidLogger; static Logger gspGPULogger; static Logger gspLCDLogger; + static Logger ldrLogger; static Logger micLogger; static Logger nimLogger; static Logger ndmLogger; diff --git a/include/services/ldr_ro.hpp b/include/services/ldr_ro.hpp new file mode 100644 index 00000000..11b8e911 --- /dev/null +++ b/include/services/ldr_ro.hpp @@ -0,0 +1,20 @@ +#pragma once +#include "helpers.hpp" +#include "kernel_types.hpp" +#include "logger.hpp" +#include "memory.hpp" + +class LDRService { + Handle handle = KernelHandles::LDR_RO; + Memory& mem; + MAKE_LOG_FUNCTION(log, ldrLogger) + + // Service commands + void initialize(u32 messagePointer); + void loadCRR(u32 messagePointer); + +public: + LDRService(Memory& mem) : mem(mem) {} + void reset(); + void handleSyncRequest(u32 messagePointer); +}; \ No newline at end of file diff --git a/include/services/service_manager.hpp b/include/services/service_manager.hpp index e7c4adff..a174906b 100644 --- a/include/services/service_manager.hpp +++ b/include/services/service_manager.hpp @@ -17,6 +17,7 @@ #include "services/fs.hpp" #include "services/gsp_gpu.hpp" #include "services/gsp_lcd.hpp" +#include "services/ldr_ro.hpp" #include "services/mic.hpp" #include "services/nim.hpp" #include "services/ndm.hpp" @@ -48,6 +49,7 @@ class ServiceManager { FSService fs; GPUService gsp_gpu; LCDService gsp_lcd; + LDRService ldr; MICService mic; NIMService nim; NDMService ndm; diff --git a/src/core/services/ldr_ro.cpp b/src/core/services/ldr_ro.cpp new file mode 100644 index 00000000..9d5d19a8 --- /dev/null +++ b/src/core/services/ldr_ro.cpp @@ -0,0 +1,44 @@ +#include "services/ldr_ro.hpp" + +namespace LDRCommands { + enum : u32 { + Initialize = 0x000100C2, + LoadCRR = 0x00020082 + }; +} + +namespace Result { + enum : u32 { + Success = 0, + }; +} + +void LDRService::reset() {} + +void LDRService::handleSyncRequest(u32 messagePointer) { + const u32 command = mem.read32(messagePointer); + switch (command) { + case LDRCommands::Initialize: initialize(messagePointer); break; + case LDRCommands::LoadCRR: loadCRR(messagePointer); break; + default: Helpers::panic("LDR::RO service requested. Command: %08X\n", command); + } +} + +void LDRService::initialize(u32 messagePointer) { + const u32 crsPointer = mem.read32(messagePointer + 4); + const u32 size = mem.read32(messagePointer + 8); + const u32 mapVaddr = mem.read32(messagePointer + 12); + const Handle process = mem.read32(messagePointer + 20); + + log("LDR_RO::Initialize (buffer = %08X, size = %08X, vaddr = %08X, process = %X)\n", crsPointer, size, mapVaddr, process); + mem.write32(messagePointer + 4, Result::Success); +} + +void LDRService::loadCRR(u32 messagePointer) { + const u32 crrPointer = mem.read32(messagePointer + 4); + const u32 size = mem.read32(messagePointer + 8); + const Handle process = mem.read32(messagePointer + 20); + + log("LDR_RO::LoadCRR (buffer = %08X, size = %08X, process = %X)\n", crrPointer, size, process); + mem.write32(messagePointer + 4, Result::Success); +} \ No newline at end of file diff --git a/src/core/services/service_manager.cpp b/src/core/services/service_manager.cpp index 0bd7d55c..839ff82d 100644 --- a/src/core/services/service_manager.cpp +++ b/src/core/services/service_manager.cpp @@ -4,7 +4,7 @@ ServiceManager::ServiceManager(std::array& regs, Memory& mem, GPU& gpu, u32& currentPID, Kernel& kernel) : regs(regs), mem(mem), kernel(kernel), ac(mem), am(mem), boss(mem), apt(mem, kernel), cam(mem), cecd(mem), cfg(mem), - dsp(mem), hid(mem), frd(mem), fs(mem, kernel), gsp_gpu(mem, gpu, currentPID), gsp_lcd(mem), mic(mem), + dsp(mem), hid(mem), frd(mem), fs(mem, kernel), gsp_gpu(mem, gpu, currentPID), gsp_lcd(mem), ldr(mem), mic(mem), nim(mem), ndm(mem), ptm(mem), y2r(mem) {} static constexpr int MAX_NOTIFICATION_COUNT = 16; @@ -24,6 +24,7 @@ void ServiceManager::reset() { fs.reset(); gsp_gpu.reset(); gsp_lcd.reset(); + ldr.reset(); mic.reset(); nim.reset(); ndm.reset(); @@ -97,12 +98,12 @@ static std::map serviceMap = { { "fs:USER", KernelHandles::FS }, { "gsp::Gpu", KernelHandles::GPU }, { "gsp::Lcd", KernelHandles::LCD }, + { "ldr:ro", KernelHandles::LDR_RO }, { "mic:u", KernelHandles::MIC }, { "ndm:u", KernelHandles::NDM }, { "nim:aoc", KernelHandles::NIM }, { "ptm:u", KernelHandles::PTM }, { "y2r:u", KernelHandles::Y2R } - }; // https://www.3dbrew.org/wiki/SRV:GetServiceHandle @@ -167,6 +168,7 @@ void ServiceManager::sendCommandToService(u32 messagePointer, Handle handle) { case KernelHandles::FRD: frd.handleSyncRequest(messagePointer); break; case KernelHandles::FS: fs.handleSyncRequest(messagePointer); break; case KernelHandles::LCD: gsp_lcd.handleSyncRequest(messagePointer); break; + case KernelHandles::LDR_RO: ldr.handleSyncRequest(messagePointer); break; case KernelHandles::MIC: mic.handleSyncRequest(messagePointer); break; case KernelHandles::NIM: nim.handleSyncRequest(messagePointer); break; case KernelHandles::NDM: ndm.handleSyncRequest(messagePointer); break;