2
1
Fork 0
mirror of https://github.com/yuzu-emu/yuzu.git synced 2024-07-04 23:31:19 +01:00

kernel: target invalidate to given process

This commit is contained in:
Liam 2024-01-19 19:37:25 -05:00
parent 8649a80071
commit 96833cd809

View file

@ -69,9 +69,14 @@ public:
}; };
template <typename AddressType> 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 // TODO: lock the process list
for (auto& process : kernel.GetProcessList()) { 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++) { for (size_t i = 0; i < Core::Hardware::NUM_CPU_CORES; i++) {
auto* interface = process->GetArmInterface(i); auto* interface = process->GetArmInterface(i);
if (interface) { if (interface) {
@ -1302,7 +1307,7 @@ Result KPageTableBase::UnmapCodeMemory(KProcessAddress dst_address, KProcessAddr
bool reprotected_pages = false; bool reprotected_pages = false;
SCOPE_EXIT({ SCOPE_EXIT({
if (reprotected_pages && any_code_pages) { 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) { for (const auto& block : pg) {
StoreDataCache(GetHeapVirtualPointer(m_kernel, block.GetAddress()), block.GetSize()); StoreDataCache(GetHeapVirtualPointer(m_kernel, block.GetAddress()), block.GetSize());
} }
InvalidateInstructionCache(m_kernel, addr, size); InvalidateInstructionCache(m_kernel, this, addr, size);
} }
R_SUCCEED(); R_SUCCEED();
@ -3277,7 +3282,7 @@ Result KPageTableBase::WriteDebugMemory(KProcessAddress dst_address, KProcessAdd
R_TRY(PerformCopy()); R_TRY(PerformCopy());
// Invalidate the instruction cache, as this svc allows modifying executable pages. // 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(); R_SUCCEED();
} }