Merge pull request #12759 from liamwhite/mp-misc
core: miscellaneous fixes
This commit is contained in:
		@@ -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();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -112,6 +112,7 @@ SessionId Container::OpenSession(Kernel::KProcess* process) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void Container::CloseSession(SessionId session_id) {
 | 
					void Container::CloseSession(SessionId session_id) {
 | 
				
			||||||
    std::scoped_lock lk(impl->session_guard);
 | 
					    std::scoped_lock lk(impl->session_guard);
 | 
				
			||||||
 | 
					    impl->file.UnmapAllHandles(session_id);
 | 
				
			||||||
    auto& session = impl->sessions[session_id.id];
 | 
					    auto& session = impl->sessions[session_id.id];
 | 
				
			||||||
    auto& smmu = impl->host1x.MemoryManager();
 | 
					    auto& smmu = impl->host1x.MemoryManager();
 | 
				
			||||||
    if (session.has_preallocated_area) {
 | 
					    if (session.has_preallocated_area) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -326,4 +326,17 @@ std::optional<NvMap::FreeInfo> NvMap::FreeHandle(Handle::Id handle, bool interna
 | 
				
			|||||||
    return freeInfo;
 | 
					    return freeInfo;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void NvMap::UnmapAllHandles(NvCore::SessionId session_id) {
 | 
				
			||||||
 | 
					    auto handles_copy = [&] {
 | 
				
			||||||
 | 
					        std::scoped_lock lk{handles_lock};
 | 
				
			||||||
 | 
					        return handles;
 | 
				
			||||||
 | 
					    }();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (auto& [id, handle] : handles_copy) {
 | 
				
			||||||
 | 
					        if (handle->session_id.id == session_id.id) {
 | 
				
			||||||
 | 
					            FreeHandle(id, false);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace Service::Nvidia::NvCore
 | 
					} // namespace Service::Nvidia::NvCore
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -152,6 +152,8 @@ public:
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    std::optional<FreeInfo> FreeHandle(Handle::Id handle, bool internal_session);
 | 
					    std::optional<FreeInfo> FreeHandle(Handle::Id handle, bool internal_session);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void UnmapAllHandles(NvCore::SessionId session_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
    std::list<std::shared_ptr<Handle>> unmap_queue{};
 | 
					    std::list<std::shared_ptr<Handle>> unmap_queue{};
 | 
				
			||||||
    std::mutex unmap_queue_lock{}; //!< Protects access to `unmap_queue`
 | 
					    std::mutex unmap_queue_lock{}; //!< Protects access to `unmap_queue`
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user