diff --git a/src/core/hle/service/ldr_ro/cro_helper.cpp b/src/core/hle/service/ldr_ro/cro_helper.cpp index 9e6635a69..19308d08d 100644 --- a/src/core/hle/service/ldr_ro/cro_helper.cpp +++ b/src/core/hle/service/ldr_ro/cro_helper.cpp @@ -548,7 +548,7 @@ ResultCode CROHelper::ApplyStaticAnonymousSymbolToCRS(VAddr crs_address) { static_relocation_table_offset + GetField(StaticRelocationNum) * sizeof(StaticRelocationEntry); - CROHelper crs(crs_address, process); + CROHelper crs(crs_address, process, memory); u32 offset_export_num = GetField(StaticAnonymousSymbolNum); LOG_INFO(Service_LDR, "CRO \"{}\" exports {} static anonymous symbols", ModuleName(), offset_export_num); @@ -758,8 +758,8 @@ ResultCode CROHelper::ApplyImportNamedSymbol(VAddr crs_address) { sizeof(ExternalRelocationEntry)); if (!relocation_entry.is_batch_resolved) { - ResultCode result = - ForEachAutoLinkCRO(process, crs_address, [&](CROHelper source) -> ResultVal { + ResultCode result = ForEachAutoLinkCRO( + process, memory, crs_address, [&](CROHelper source) -> ResultVal { std::string symbol_name = Memory::ReadCString(entry.name_offset, import_strings_size); u32 symbol_address = source.FindExportNamedSymbol(symbol_name); @@ -860,8 +860,8 @@ ResultCode CROHelper::ApplyModuleImport(VAddr crs_address) { GetEntry(i, entry); std::string want_cro_name = Memory::ReadCString(entry.name_offset, import_strings_size); - ResultCode result = - ForEachAutoLinkCRO(process, crs_address, [&](CROHelper source) -> ResultVal { + ResultCode result = ForEachAutoLinkCRO( + process, memory, crs_address, [&](CROHelper source) -> ResultVal { if (want_cro_name == source.ModuleName()) { LOG_INFO(Service_LDR, "CRO \"{}\" imports {} indexed symbols from \"{}\"", ModuleName(), entry.import_indexed_symbol_num, source.ModuleName()); @@ -1070,8 +1070,8 @@ ResultCode CROHelper::ApplyExitRelocations(VAddr crs_address) { sizeof(ExternalRelocationEntry)); if (Memory::ReadCString(entry.name_offset, import_strings_size) == "__aeabi_atexit") { - ResultCode result = - ForEachAutoLinkCRO(process, crs_address, [&](CROHelper source) -> ResultVal { + ResultCode result = ForEachAutoLinkCRO( + process, memory, crs_address, [&](CROHelper source) -> ResultVal { u32 symbol_address = source.FindExportNamedSymbol("nnroAeabiAtexit_"); if (symbol_address != 0) { @@ -1299,17 +1299,18 @@ ResultCode CROHelper::Link(VAddr crs_address, bool link_on_load_bug_fix) { } // Exports symbols to other modules - result = ForEachAutoLinkCRO(process, crs_address, [this](CROHelper target) -> ResultVal { - ResultCode result = ApplyExportNamedSymbol(target); - if (result.IsError()) - return result; + result = ForEachAutoLinkCRO(process, memory, crs_address, + [this](CROHelper target) -> ResultVal { + ResultCode result = ApplyExportNamedSymbol(target); + if (result.IsError()) + return result; - result = ApplyModuleExport(target); - if (result.IsError()) - return result; + result = ApplyModuleExport(target); + if (result.IsError()) + return result; - return MakeResult(true); - }); + return MakeResult(true); + }); if (result.IsError()) { LOG_ERROR(Service_LDR, "Error applying export {:08X}", result.raw); return result; @@ -1343,17 +1344,18 @@ ResultCode CROHelper::Unlink(VAddr crs_address) { // Resets all symbols in other modules imported from this module // Note: the RO service seems only searching in auto-link modules - result = ForEachAutoLinkCRO(process, crs_address, [this](CROHelper target) -> ResultVal { - ResultCode result = ResetExportNamedSymbol(target); - if (result.IsError()) - return result; + result = ForEachAutoLinkCRO(process, memory, crs_address, + [this](CROHelper target) -> ResultVal { + ResultCode result = ResetExportNamedSymbol(target); + if (result.IsError()) + return result; - result = ResetModuleExport(target); - if (result.IsError()) - return result; + result = ResetModuleExport(target); + if (result.IsError()) + return result; - return MakeResult(true); - }); + return MakeResult(true); + }); if (result.IsError()) { LOG_ERROR(Service_LDR, "Error resetting export {:08X}", result.raw); return result; @@ -1383,13 +1385,13 @@ void CROHelper::InitCRS() { } void CROHelper::Register(VAddr crs_address, bool auto_link) { - CROHelper crs(crs_address, process); - CROHelper head(auto_link ? crs.NextModule() : crs.PreviousModule(), process); + CROHelper crs(crs_address, process, memory); + CROHelper head(auto_link ? crs.NextModule() : crs.PreviousModule(), process, memory); if (head.module_address) { // there are already CROs registered // register as the new tail - CROHelper tail(head.PreviousModule(), process); + CROHelper tail(head.PreviousModule(), process, memory); // link with the old tail ASSERT(tail.NextModule() == 0); @@ -1415,9 +1417,10 @@ void CROHelper::Register(VAddr crs_address, bool auto_link) { } void CROHelper::Unregister(VAddr crs_address) { - CROHelper crs(crs_address, process); - CROHelper next_head(crs.NextModule(), process), previous_head(crs.PreviousModule(), process); - CROHelper next(NextModule(), process), previous(PreviousModule(), process); + CROHelper crs(crs_address, process, memory); + CROHelper next_head(crs.NextModule(), process, memory), + previous_head(crs.PreviousModule(), process, memory); + CROHelper next(NextModule(), process, memory), previous(PreviousModule(), process, memory); if (module_address == next_head.module_address || module_address == previous_head.module_address) { diff --git a/src/core/hle/service/ldr_ro/cro_helper.h b/src/core/hle/service/ldr_ro/cro_helper.h index f61483bd7..d3a6e3d9a 100644 --- a/src/core/hle/service/ldr_ro/cro_helper.h +++ b/src/core/hle/service/ldr_ro/cro_helper.h @@ -40,8 +40,8 @@ static constexpr u32 CRO_HASH_SIZE = 0x80; class CROHelper final { public: // TODO (wwylele): pass in the process handle for memory access - explicit CROHelper(VAddr cro_address, Kernel::Process& process) - : module_address(cro_address), process(process) {} + explicit CROHelper(VAddr cro_address, Kernel::Process& process, Memory::MemorySystem& memory) + : module_address(cro_address), process(process), memory(memory) {} std::string ModuleName() const { return Memory::ReadCString(GetField(ModuleNameOffset), GetField(ModuleNameSize)); @@ -150,6 +150,7 @@ public: private: const VAddr module_address; ///< the virtual address of this module Kernel::Process& process; ///< the owner process of this module + Memory::MemorySystem& memory; /** * Each item in this enum represents a u32 field in the header begin from address+0x80, @@ -478,11 +479,11 @@ private: * otherwise error code of the last iteration. */ template - static ResultCode ForEachAutoLinkCRO(Kernel::Process& process, VAddr crs_address, - FunctionObject func) { + static ResultCode ForEachAutoLinkCRO(Kernel::Process& process, Memory::MemorySystem& memory, + VAddr crs_address, FunctionObject func) { VAddr current = crs_address; while (current != 0) { - CROHelper cro(current, process); + CROHelper cro(current, process, memory); CASCADE_RESULT(bool next, func(cro)); if (!next) break; diff --git a/src/core/hle/service/ldr_ro/ldr_ro.cpp b/src/core/hle/service/ldr_ro/ldr_ro.cpp index 87195ad39..1b56c0629 100644 --- a/src/core/hle/service/ldr_ro/ldr_ro.cpp +++ b/src/core/hle/service/ldr_ro/ldr_ro.cpp @@ -115,7 +115,7 @@ void RO::Initialize(Kernel::HLERequestContext& ctx) { return; } - CROHelper crs(crs_address, *process); + CROHelper crs(crs_address, *process, system.Memory()); crs.InitCRS(); result = crs.Rebase(0, crs_size, 0, 0, 0, 0, true); @@ -249,7 +249,7 @@ void RO::LoadCRO(Kernel::HLERequestContext& ctx, bool link_on_load_bug_fix) { return; } - CROHelper cro(cro_address, *process); + CROHelper cro(cro_address, *process, system.Memory()); result = cro.VerifyHash(cro_size, crr_address); if (result.IsError()) { @@ -331,7 +331,7 @@ void RO::UnloadCRO(Kernel::HLERequestContext& ctx) { LOG_DEBUG(Service_LDR, "called, cro_address=0x{:08X}, zero={}, cro_buffer_ptr=0x{:08X}", cro_address, zero, cro_buffer_ptr); - CROHelper cro(cro_address, *process); + CROHelper cro(cro_address, *process, system.Memory()); IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); @@ -398,7 +398,7 @@ void RO::LinkCRO(Kernel::HLERequestContext& ctx) { LOG_DEBUG(Service_LDR, "called, cro_address=0x{:08X}", cro_address); - CROHelper cro(cro_address, *process); + CROHelper cro(cro_address, *process, system.Memory()); IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); @@ -438,7 +438,7 @@ void RO::UnlinkCRO(Kernel::HLERequestContext& ctx) { LOG_DEBUG(Service_LDR, "called, cro_address=0x{:08X}", cro_address); - CROHelper cro(cro_address, *process); + CROHelper cro(cro_address, *process, system.Memory()); IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); @@ -487,7 +487,7 @@ void RO::Shutdown(Kernel::HLERequestContext& ctx) { return; } - CROHelper crs(slot->loaded_crs, *process); + CROHelper crs(slot->loaded_crs, *process, system.Memory()); crs.Unrebase(true); ResultCode result = RESULT_SUCCESS; @@ -502,7 +502,7 @@ void RO::Shutdown(Kernel::HLERequestContext& ctx) { rb.Push(result); } -RO::RO() : ServiceFramework("ldr:ro", 2) { +RO::RO(Core::System& system) : ServiceFramework("ldr:ro", 2), system(system) { static const FunctionInfo functions[] = { {0x000100C2, &RO::Initialize, "Initialize"}, {0x00020082, &RO::LoadCRR, "LoadCRR"}, @@ -519,7 +519,7 @@ RO::RO() : ServiceFramework("ldr:ro", 2) { void InstallInterfaces(Core::System& system) { auto& service_manager = system.ServiceManager(); - std::make_shared()->InstallAsService(service_manager); + std::make_shared(system)->InstallAsService(service_manager); } } // namespace Service::LDR diff --git a/src/core/hle/service/ldr_ro/ldr_ro.h b/src/core/hle/service/ldr_ro/ldr_ro.h index 54776feb0..f90005d13 100644 --- a/src/core/hle/service/ldr_ro/ldr_ro.h +++ b/src/core/hle/service/ldr_ro/ldr_ro.h @@ -18,7 +18,7 @@ struct ClientSlot : public Kernel::SessionRequestHandler::SessionDataBase { class RO final : public ServiceFramework { public: - RO(); + explicit RO(Core::System& system); private: /** @@ -149,6 +149,8 @@ private: * 1 : Result of function, 0 on success, otherwise error code */ void Shutdown(Kernel::HLERequestContext& self); + + Core::System& system; }; void InstallInterfaces(Core::System& system);