diff --git a/include/services/ldr_ro.hpp b/include/services/ldr_ro.hpp index 7acfce69..8e530e1e 100644 --- a/include/services/ldr_ro.hpp +++ b/include/services/ldr_ro.hpp @@ -13,6 +13,7 @@ class LDRService { // Service commands void initialize(u32 messagePointer); void loadCRR(u32 messagePointer); + void loadCRONew(u32 messagePointer); public: LDRService(Memory& mem) : mem(mem) {} diff --git a/src/core/services/ldr_ro.cpp b/src/core/services/ldr_ro.cpp index 4ea73b4e..9a937671 100644 --- a/src/core/services/ldr_ro.cpp +++ b/src/core/services/ldr_ro.cpp @@ -4,7 +4,8 @@ namespace LDRCommands { enum : u32 { Initialize = 0x000100C2, - LoadCRR = 0x00020082 + LoadCRR = 0x00020082, + LoadCRONew = 0x000902C2, }; } @@ -15,6 +16,7 @@ void LDRService::handleSyncRequest(u32 messagePointer) { switch (command) { case LDRCommands::Initialize: initialize(messagePointer); break; case LDRCommands::LoadCRR: loadCRR(messagePointer); break; + case LDRCommands::LoadCRONew: loadCRONew(messagePointer); break; default: Helpers::panic("LDR::RO service requested. Command: %08X\n", command); } } @@ -38,4 +40,22 @@ void LDRService::loadCRR(u32 messagePointer) { log("LDR_RO::LoadCRR (buffer = %08X, size = %08X, process = %X)\n", crrPointer, size, process); mem.write32(messagePointer, IPC::responseHeader(0x2, 1, 0)); mem.write32(messagePointer + 4, Result::Success); +} + +void LDRService::loadCRONew(u32 messagePointer) { + const u32 croPointer = mem.read32(messagePointer + 4); + const u32 mapVaddr = mem.read32(messagePointer + 8); + const u32 size = mem.read32(messagePointer + 12); + const u32 dataVaddr = mem.read32(messagePointer + 16); + const u32 dataSize = mem.read32(messagePointer + 24); + const u32 bssVaddr = mem.read32(messagePointer + 28); + const u32 bssSize = mem.read32(messagePointer + 32); + const bool autoLink = mem.read32(messagePointer + 36) != 0; + const u32 fixLevel = mem.read32(messagePointer + 40); + const Handle process = mem.read32(messagePointer + 52); + + log("LDR_RO::LoadCRONew (buffer = %08X, vaddr = %08X, size = %08X, .data vaddr = %08X, .data size = %08X, .bss vaddr = %08X, .bss size = %08X, auto link = %d, fix level = %X, process = %X)\n", croPointer, mapVaddr, size, dataVaddr, dataSize, bssVaddr, bssSize, autoLink, fixLevel, process); + mem.write32(messagePointer, IPC::responseHeader(0x9, 2, 0)); + mem.write32(messagePointer + 4, Result::Success); + mem.write32(messagePointer + 8, size); } \ No newline at end of file