kernel: target invalidate to given process
This commit is contained in:
		| @@ -69,9 +69,14 @@ public: | ||||
| }; | ||||
|  | ||||
| template <typename AddressType> | ||||
| void InvalidateInstructionCache(KernelCore& kernel, AddressType addr, u64 size) { | ||||
| void InvalidateInstructionCache(KernelCore& kernel, KPageTableBase* table, AddressType addr, | ||||
|                                 u64 size) { | ||||
|     // TODO: lock the process list | ||||
|     for (auto& process : kernel.GetProcessList()) { | ||||
|         if (std::addressof(process->GetPageTable().GetBasePageTable()) != table) { | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
|         for (size_t i = 0; i < Core::Hardware::NUM_CPU_CORES; i++) { | ||||
|             auto* interface = process->GetArmInterface(i); | ||||
|             if (interface) { | ||||
| @@ -1302,7 +1307,7 @@ Result KPageTableBase::UnmapCodeMemory(KProcessAddress dst_address, KProcessAddr | ||||
|     bool reprotected_pages = false; | ||||
|     SCOPE_EXIT({ | ||||
|         if (reprotected_pages && any_code_pages) { | ||||
|             InvalidateInstructionCache(m_kernel, dst_address, size); | ||||
|             InvalidateInstructionCache(m_kernel, this, dst_address, size); | ||||
|         } | ||||
|     }); | ||||
|  | ||||
| @@ -2036,7 +2041,7 @@ Result KPageTableBase::SetProcessMemoryPermission(KProcessAddress addr, size_t s | ||||
|         for (const auto& block : pg) { | ||||
|             StoreDataCache(GetHeapVirtualPointer(m_kernel, block.GetAddress()), block.GetSize()); | ||||
|         } | ||||
|         InvalidateInstructionCache(m_kernel, addr, size); | ||||
|         InvalidateInstructionCache(m_kernel, this, addr, size); | ||||
|     } | ||||
|  | ||||
|     R_SUCCEED(); | ||||
| @@ -3277,7 +3282,7 @@ Result KPageTableBase::WriteDebugMemory(KProcessAddress dst_address, KProcessAdd | ||||
|     R_TRY(PerformCopy()); | ||||
|  | ||||
|     // Invalidate the instruction cache, as this svc allows modifying executable pages. | ||||
|     InvalidateInstructionCache(m_kernel, dst_address, size); | ||||
|     InvalidateInstructionCache(m_kernel, this, dst_address, size); | ||||
|  | ||||
|     R_SUCCEED(); | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user