kernel: target invalidate to given process

master
Liam 2024-01-19 19:37:25 +07:00
parent 8649a80071
commit 96833cd809
1 changed files with 9 additions and 4 deletions

@ -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();
}