From d452caa976519def82592a7f2699a27d6da99126 Mon Sep 17 00:00:00 2001 From: Nomi Date: Thu, 7 Sep 2023 20:17:55 +0200 Subject: [PATCH] Add kernel member, stub UnloadCRO --- include/services/ldr_ro.hpp | 6 +++++- src/core/services/ldr_ro.cpp | 18 ++++++++++++++++++ src/core/services/service_manager.cpp | 2 +- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/include/services/ldr_ro.hpp b/include/services/ldr_ro.hpp index 6dde61e4..828edc33 100644 --- a/include/services/ldr_ro.hpp +++ b/include/services/ldr_ro.hpp @@ -5,9 +5,12 @@ #include "memory.hpp" #include "result/result.hpp" +class Kernel; + class LDRService { Handle handle = KernelHandles::LDR_RO; Memory& mem; + Kernel& kernel; MAKE_LOG_FUNCTION(log, ldrLogger) u32 loadedCRS; @@ -16,9 +19,10 @@ class LDRService { void initialize(u32 messagePointer); void loadCRR(u32 messagePointer); void loadCRONew(u32 messagePointer); + void unloadCRO(u32 messagePointer); public: - LDRService(Memory& mem) : mem(mem) {} + LDRService(Memory& mem, Kernel& kernel) : mem(mem), kernel(kernel) {} void reset(); void handleSyncRequest(u32 messagePointer); }; \ No newline at end of file diff --git a/src/core/services/ldr_ro.cpp b/src/core/services/ldr_ro.cpp index c9816978..136fd174 100644 --- a/src/core/services/ldr_ro.cpp +++ b/src/core/services/ldr_ro.cpp @@ -1,5 +1,6 @@ #include "services/ldr_ro.hpp" #include "ipc.hpp" +#include "kernel.hpp" #include #include @@ -8,6 +9,7 @@ namespace LDRCommands { enum : u32 { Initialize = 0x000100C2, LoadCRR = 0x00020082, + UnloadCRO = 0x000500C2, LoadCRONew = 0x000902C2, }; } @@ -654,6 +656,7 @@ void LDRService::handleSyncRequest(u32 messagePointer) { switch (command) { case LDRCommands::Initialize: initialize(messagePointer); break; case LDRCommands::LoadCRR: loadCRR(messagePointer); break; + case LDRCommands::UnloadCRO: unloadCRO(messagePointer); break; case LDRCommands::LoadCRONew: loadCRONew(messagePointer); break; default: Helpers::panic("LDR::RO service requested. Command: %08X\n", command); } @@ -701,6 +704,8 @@ void LDRService::initialize(u32 messagePointer) { Helpers::panic("Failed to rebase CRS"); } + //kernel.clearInstructionCache(); + loadedCRS = crsPointer; mem.write32(messagePointer, IPC::responseHeader(0x1, 1, 0)); @@ -769,7 +774,20 @@ void LDRService::loadCRONew(u32 messagePointer) { // TODO: add fixing + //kernel.clearInstructionCache(); + mem.write32(messagePointer, IPC::responseHeader(0x9, 2, 0)); mem.write32(messagePointer + 4, Result::Success); mem.write32(messagePointer + 8, size); +} + +void LDRService::unloadCRO(u32 messagePointer) { + const u32 mapVaddr = mem.read32(messagePointer + 4); + const u32 croPointer = mem.read32(messagePointer + 12); + const Handle process = mem.read32(messagePointer + 20); + + Helpers::warn("LDR_RO::UnloadCRO (vaddr = %08X, buffer = %08X, process = %X)\n", mapVaddr, croPointer, process); + + mem.write32(messagePointer, IPC::responseHeader(0x5, 2, 0)); + 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 9a4027a4..896003dd 100644 --- a/src/core/services/service_manager.cpp +++ b/src/core/services/service_manager.cpp @@ -8,7 +8,7 @@ ServiceManager::ServiceManager(std::span regs, Memory& mem, GPU& gpu, u32& currentPID, Kernel& kernel, const EmulatorConfig& config) : regs(regs), mem(mem), kernel(kernel), ac(mem), am(mem), boss(mem), act(mem), apt(mem, kernel), cam(mem, kernel), cecd(mem, kernel), cfg(mem), dlp_srvr(mem), dsp(mem, kernel), hid(mem, kernel), http(mem), ir_user(mem, kernel), frd(mem), fs(mem, kernel, config), - gsp_gpu(mem, gpu, kernel, currentPID), gsp_lcd(mem), ldr(mem), mcu_hwc(mem, config), mic(mem, kernel), nfc(mem, kernel), nim(mem), ndm(mem), + gsp_gpu(mem, gpu, kernel, currentPID), gsp_lcd(mem), ldr(mem, kernel), mcu_hwc(mem, config), mic(mem, kernel), nfc(mem, kernel), nim(mem), ndm(mem), news_u(mem), ptm(mem, config), soc(mem), ssl(mem), y2r(mem, kernel) {} static constexpr int MAX_NOTIFICATION_COUNT = 16;