ldr_ro: replace usage of Core::CPU()
This commit is contained in:
		| @@ -72,11 +72,11 @@ ResultCode CROHelper::ApplyRelocation(VAddr target_address, RelocationType reloc | ||||
|     case RelocationType::AbsoluteAddress: | ||||
|     case RelocationType::AbsoluteAddress2: | ||||
|         memory.Write32(target_address, symbol_address + addend); | ||||
|         Core::CPU().InvalidateCacheRange(target_address, sizeof(u32)); | ||||
|         cpu.InvalidateCacheRange(target_address, sizeof(u32)); | ||||
|         break; | ||||
|     case RelocationType::RelativeAddress: | ||||
|         memory.Write32(target_address, symbol_address + addend - target_future_address); | ||||
|         Core::CPU().InvalidateCacheRange(target_address, sizeof(u32)); | ||||
|         cpu.InvalidateCacheRange(target_address, sizeof(u32)); | ||||
|         break; | ||||
|     case RelocationType::ThumbBranch: | ||||
|     case RelocationType::ArmBranch: | ||||
| @@ -99,7 +99,7 @@ ResultCode CROHelper::ClearRelocation(VAddr target_address, RelocationType reloc | ||||
|     case RelocationType::AbsoluteAddress2: | ||||
|     case RelocationType::RelativeAddress: | ||||
|         memory.Write32(target_address, 0); | ||||
|         Core::CPU().InvalidateCacheRange(target_address, sizeof(u32)); | ||||
|         cpu.InvalidateCacheRange(target_address, sizeof(u32)); | ||||
|         break; | ||||
|     case RelocationType::ThumbBranch: | ||||
|     case RelocationType::ArmBranch: | ||||
| @@ -548,7 +548,7 @@ ResultCode CROHelper::ApplyStaticAnonymousSymbolToCRS(VAddr crs_address) { | ||||
|         static_relocation_table_offset + | ||||
|         GetField(StaticRelocationNum) * sizeof(StaticRelocationEntry); | ||||
|  | ||||
|     CROHelper crs(crs_address, process, memory); | ||||
|     CROHelper crs(crs_address, process, memory, cpu); | ||||
|     u32 offset_export_num = GetField(StaticAnonymousSymbolNum); | ||||
|     LOG_INFO(Service_LDR, "CRO \"{}\" exports {} static anonymous symbols", ModuleName(), | ||||
|              offset_export_num); | ||||
| @@ -759,7 +759,7 @@ ResultCode CROHelper::ApplyImportNamedSymbol(VAddr crs_address) { | ||||
|  | ||||
|         if (!relocation_entry.is_batch_resolved) { | ||||
|             ResultCode result = ForEachAutoLinkCRO( | ||||
|                 process, memory, crs_address, [&](CROHelper source) -> ResultVal<bool> { | ||||
|                 process, memory, cpu, crs_address, [&](CROHelper source) -> ResultVal<bool> { | ||||
|                     std::string symbol_name = | ||||
|                         memory.ReadCString(entry.name_offset, import_strings_size); | ||||
|                     u32 symbol_address = source.FindExportNamedSymbol(symbol_name); | ||||
| @@ -861,7 +861,7 @@ ResultCode CROHelper::ApplyModuleImport(VAddr crs_address) { | ||||
|         std::string want_cro_name = memory.ReadCString(entry.name_offset, import_strings_size); | ||||
|  | ||||
|         ResultCode result = ForEachAutoLinkCRO( | ||||
|             process, memory, crs_address, [&](CROHelper source) -> ResultVal<bool> { | ||||
|             process, memory, cpu, crs_address, [&](CROHelper source) -> ResultVal<bool> { | ||||
|                 if (want_cro_name == source.ModuleName()) { | ||||
|                     LOG_INFO(Service_LDR, "CRO \"{}\" imports {} indexed symbols from \"{}\"", | ||||
|                              ModuleName(), entry.import_indexed_symbol_num, source.ModuleName()); | ||||
| @@ -1071,7 +1071,7 @@ ResultCode CROHelper::ApplyExitRelocations(VAddr crs_address) { | ||||
|  | ||||
|         if (memory.ReadCString(entry.name_offset, import_strings_size) == "__aeabi_atexit") { | ||||
|             ResultCode result = ForEachAutoLinkCRO( | ||||
|                 process, memory, crs_address, [&](CROHelper source) -> ResultVal<bool> { | ||||
|                 process, memory, cpu, crs_address, [&](CROHelper source) -> ResultVal<bool> { | ||||
|                     u32 symbol_address = source.FindExportNamedSymbol("nnroAeabiAtexit_"); | ||||
|  | ||||
|                     if (symbol_address != 0) { | ||||
| @@ -1301,7 +1301,7 @@ ResultCode CROHelper::Link(VAddr crs_address, bool link_on_load_bug_fix) { | ||||
|     } | ||||
|  | ||||
|     // Exports symbols to other modules | ||||
|     result = ForEachAutoLinkCRO(process, memory, crs_address, | ||||
|     result = ForEachAutoLinkCRO(process, memory, cpu, crs_address, | ||||
|                                 [this](CROHelper target) -> ResultVal<bool> { | ||||
|                                     ResultCode result = ApplyExportNamedSymbol(target); | ||||
|                                     if (result.IsError()) | ||||
| @@ -1346,7 +1346,7 @@ 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, memory, crs_address, | ||||
|     result = ForEachAutoLinkCRO(process, memory, cpu, crs_address, | ||||
|                                 [this](CROHelper target) -> ResultVal<bool> { | ||||
|                                     ResultCode result = ResetExportNamedSymbol(target); | ||||
|                                     if (result.IsError()) | ||||
| @@ -1387,13 +1387,13 @@ void CROHelper::InitCRS() { | ||||
| } | ||||
|  | ||||
| void CROHelper::Register(VAddr crs_address, bool auto_link) { | ||||
|     CROHelper crs(crs_address, process, memory); | ||||
|     CROHelper head(auto_link ? crs.NextModule() : crs.PreviousModule(), process, memory); | ||||
|     CROHelper crs(crs_address, process, memory, cpu); | ||||
|     CROHelper head(auto_link ? crs.NextModule() : crs.PreviousModule(), process, memory, cpu); | ||||
|  | ||||
|     if (head.module_address) { | ||||
|         // there are already CROs registered | ||||
|         // register as the new tail | ||||
|         CROHelper tail(head.PreviousModule(), process, memory); | ||||
|         CROHelper tail(head.PreviousModule(), process, memory, cpu); | ||||
|  | ||||
|         // link with the old tail | ||||
|         ASSERT(tail.NextModule() == 0); | ||||
| @@ -1419,11 +1419,11 @@ void CROHelper::Register(VAddr crs_address, bool auto_link) { | ||||
| } | ||||
|  | ||||
| void CROHelper::Unregister(VAddr crs_address) { | ||||
|     CROHelper crs(crs_address, process, memory); | ||||
|     CROHelper next_head(crs.NextModule(), process, memory); | ||||
|     CROHelper previous_head(crs.PreviousModule(), process, memory); | ||||
|     CROHelper next(NextModule(), process, memory); | ||||
|     CROHelper previous(PreviousModule(), process, memory); | ||||
|     CROHelper crs(crs_address, process, memory, cpu); | ||||
|     CROHelper next_head(crs.NextModule(), process, memory, cpu); | ||||
|     CROHelper previous_head(crs.PreviousModule(), process, memory, cpu); | ||||
|     CROHelper next(NextModule(), process, memory, cpu); | ||||
|     CROHelper previous(PreviousModule(), process, memory, cpu); | ||||
|  | ||||
|     if (module_address == next_head.module_address || | ||||
|         module_address == previous_head.module_address) { | ||||
|   | ||||
| @@ -15,6 +15,8 @@ namespace Kernel { | ||||
| class Process; | ||||
| } | ||||
|  | ||||
| class ARM_Interface; | ||||
|  | ||||
| namespace Service::LDR { | ||||
|  | ||||
| // GCC versions < 5.0 do not implement std::is_trivially_copyable. | ||||
| @@ -40,8 +42,9 @@ 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, Memory::MemorySystem& memory) | ||||
|         : module_address(cro_address), process(process), memory(memory) {} | ||||
|     explicit CROHelper(VAddr cro_address, Kernel::Process& process, Memory::MemorySystem& memory, | ||||
|                        ARM_Interface& cpu) | ||||
|         : module_address(cro_address), process(process), memory(memory), cpu(cpu) {} | ||||
|  | ||||
|     std::string ModuleName() const { | ||||
|         return memory.ReadCString(GetField(ModuleNameOffset), GetField(ModuleNameSize)); | ||||
| @@ -151,6 +154,7 @@ private: | ||||
|     const VAddr module_address; ///< the virtual address of this module | ||||
|     Kernel::Process& process;   ///< the owner process of this module | ||||
|     Memory::MemorySystem& memory; | ||||
|     ARM_Interface& cpu; | ||||
|  | ||||
|     /** | ||||
|      * Each item in this enum represents a u32 field in the header begin from address+0x80, | ||||
| @@ -480,10 +484,11 @@ private: | ||||
|      */ | ||||
|     template <typename FunctionObject> | ||||
|     static ResultCode ForEachAutoLinkCRO(Kernel::Process& process, Memory::MemorySystem& memory, | ||||
|                                          VAddr crs_address, FunctionObject func) { | ||||
|                                          ARM_Interface& cpu, VAddr crs_address, | ||||
|                                          FunctionObject func) { | ||||
|         VAddr current = crs_address; | ||||
|         while (current != 0) { | ||||
|             CROHelper cro(current, process, memory); | ||||
|             CROHelper cro(current, process, memory, cpu); | ||||
|             CASCADE_RESULT(bool next, func(cro)); | ||||
|             if (!next) | ||||
|                 break; | ||||
|   | ||||
| @@ -115,7 +115,7 @@ void RO::Initialize(Kernel::HLERequestContext& ctx) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     CROHelper crs(crs_address, *process, system.Memory()); | ||||
|     CROHelper crs(crs_address, *process, system.Memory(), system.CPU()); | ||||
|     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, system.Memory()); | ||||
|     CROHelper cro(cro_address, *process, system.Memory(), system.CPU()); | ||||
|  | ||||
|     result = cro.VerifyHash(cro_size, crr_address); | ||||
|     if (result.IsError()) { | ||||
| @@ -313,7 +313,7 @@ void RO::LoadCRO(Kernel::HLERequestContext& ctx, bool link_on_load_bug_fix) { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     Core::CPU().InvalidateCacheRange(cro_address, cro_size); | ||||
|     system.CPU().InvalidateCacheRange(cro_address, cro_size); | ||||
|  | ||||
|     LOG_INFO(Service_LDR, "CRO \"{}\" loaded at 0x{:08X}, fixed_end=0x{:08X}", cro.ModuleName(), | ||||
|              cro_address, cro_address + fix_size); | ||||
| @@ -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, system.Memory()); | ||||
|     CROHelper cro(cro_address, *process, system.Memory(), system.CPU()); | ||||
|  | ||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||
|  | ||||
| @@ -386,7 +386,7 @@ void RO::UnloadCRO(Kernel::HLERequestContext& ctx) { | ||||
|         LOG_ERROR(Service_LDR, "Error unmapping CRO {:08X}", result.raw); | ||||
|     } | ||||
|  | ||||
|     Core::CPU().InvalidateCacheRange(cro_address, fixed_size); | ||||
|     system.CPU().InvalidateCacheRange(cro_address, fixed_size); | ||||
|  | ||||
|     rb.Push(result); | ||||
| } | ||||
| @@ -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, system.Memory()); | ||||
|     CROHelper cro(cro_address, *process, system.Memory(), system.CPU()); | ||||
|  | ||||
|     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, system.Memory()); | ||||
|     CROHelper cro(cro_address, *process, system.Memory(), system.CPU()); | ||||
|  | ||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||
|  | ||||
| @@ -487,7 +487,7 @@ void RO::Shutdown(Kernel::HLERequestContext& ctx) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     CROHelper crs(slot->loaded_crs, *process, system.Memory()); | ||||
|     CROHelper crs(slot->loaded_crs, *process, system.Memory(), system.CPU()); | ||||
|     crs.Unrebase(true); | ||||
|  | ||||
|     ResultCode result = RESULT_SUCCESS; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Weiyi Wang
					Weiyi Wang