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