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