diff options
author | Liam <byteslice@airmail.cc> | 2022-10-15 03:24:25 +0200 |
---|---|---|
committer | Liam <byteslice@airmail.cc> | 2022-10-19 22:31:12 +0200 |
commit | 3efb8eb2dc8bf14eecb7e731a61712e0290d9f5d (patch) | |
tree | 712f72486357c7f4a0f98f646904542d06b0d878 /src/core/hle/kernel/k_session_request.cpp | |
parent | Merge pull request #9082 from Morph1984/future (diff) | |
download | yuzu-3efb8eb2dc8bf14eecb7e731a61712e0290d9f5d.tar yuzu-3efb8eb2dc8bf14eecb7e731a61712e0290d9f5d.tar.gz yuzu-3efb8eb2dc8bf14eecb7e731a61712e0290d9f5d.tar.bz2 yuzu-3efb8eb2dc8bf14eecb7e731a61712e0290d9f5d.tar.lz yuzu-3efb8eb2dc8bf14eecb7e731a61712e0290d9f5d.tar.xz yuzu-3efb8eb2dc8bf14eecb7e731a61712e0290d9f5d.tar.zst yuzu-3efb8eb2dc8bf14eecb7e731a61712e0290d9f5d.zip |
Diffstat (limited to 'src/core/hle/kernel/k_session_request.cpp')
-rw-r--r-- | src/core/hle/kernel/k_session_request.cpp | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/core/hle/kernel/k_session_request.cpp b/src/core/hle/kernel/k_session_request.cpp new file mode 100644 index 000000000..520da6aa7 --- /dev/null +++ b/src/core/hle/kernel/k_session_request.cpp @@ -0,0 +1,61 @@ +// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "core/hle/kernel/k_page_buffer.h" +#include "core/hle/kernel/k_session_request.h" + +namespace Kernel { + +Result KSessionRequest::SessionMappings::PushMap(VAddr client, VAddr server, size_t size, + KMemoryState state, size_t index) { + // At most 15 buffers of each type (4-bit descriptor counts). + ASSERT(index < ((1ul << 4) - 1) * 3); + + // Get the mapping. + Mapping* mapping; + if (index < NumStaticMappings) { + mapping = &m_static_mappings[index]; + } else { + // Allocate a page for the extra mappings. + if (m_mappings == nullptr) { + KPageBuffer* page_buffer = KPageBuffer::Allocate(kernel); + R_UNLESS(page_buffer != nullptr, ResultOutOfMemory); + + m_mappings = reinterpret_cast<Mapping*>(page_buffer); + } + + mapping = &m_mappings[index - NumStaticMappings]; + } + + // Set the mapping. + mapping->Set(client, server, size, state); + + return ResultSuccess; +} + +Result KSessionRequest::SessionMappings::PushSend(VAddr client, VAddr server, size_t size, + KMemoryState state) { + ASSERT(m_num_recv == 0); + ASSERT(m_num_exch == 0); + return this->PushMap(client, server, size, state, m_num_send++); +} + +Result KSessionRequest::SessionMappings::PushReceive(VAddr client, VAddr server, size_t size, + KMemoryState state) { + ASSERT(m_num_exch == 0); + return this->PushMap(client, server, size, state, m_num_send + m_num_recv++); +} + +Result KSessionRequest::SessionMappings::PushExchange(VAddr client, VAddr server, size_t size, + KMemoryState state) { + return this->PushMap(client, server, size, state, m_num_send + m_num_recv + m_num_exch++); +} + +void KSessionRequest::SessionMappings::Finalize() { + if (m_mappings) { + KPageBuffer::Free(kernel, reinterpret_cast<KPageBuffer*>(m_mappings)); + m_mappings = nullptr; + } +} + +} // namespace Kernel |