From 3f86be88f0107d2b29010bf0a9a2e962aa50a6b9 Mon Sep 17 00:00:00 2001 From: Weiyi Wang Date: Sat, 2 Feb 2019 15:55:45 -0500 Subject: [PATCH] HLE/IPC: pass in kernel & memory reference from parent to avoid global state reference --- src/core/hle/kernel/hle_ipc.cpp | 29 ++++++++++++-------------- src/core/hle/kernel/hle_ipc.h | 12 +++++++++-- src/core/hle/kernel/server_session.cpp | 2 +- src/tests/core/hle/kernel/hle_ipc.cpp | 4 ++-- 4 files changed, 26 insertions(+), 21 deletions(-) diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp index 746da245e..618a9d210 100644 --- a/src/core/hle/kernel/hle_ipc.cpp +++ b/src/core/hle/kernel/hle_ipc.cpp @@ -48,7 +48,7 @@ SharedPtr HLERequestContext::SleepClientThread(SharedPtr thread, // the translation might need to read from it in order to retrieve the StaticBuffer // target addresses. std::array cmd_buff; - Memory::MemorySystem& memory = Core::System::GetInstance().Memory(); + Memory::MemorySystem& memory = context.kernel.memory; memory.ReadBlock(*process, thread->GetCommandBufferAddress(), cmd_buff.data(), cmd_buff.size() * sizeof(u32)); context.WriteToOutgoingCommandBuffer(cmd_buff.data(), *process); @@ -57,8 +57,7 @@ SharedPtr HLERequestContext::SleepClientThread(SharedPtr thread, cmd_buff.size() * sizeof(u32)); }; - auto event = Core::System::GetInstance().Kernel().CreateEvent(Kernel::ResetType::OneShot, - "HLE Pause Event: " + reason); + auto event = kernel.CreateEvent(Kernel::ResetType::OneShot, "HLE Pause Event: " + reason); thread->status = ThreadStatus::WaitHleEvent; thread->wait_objects = {event}; event->AddWaitingThread(thread); @@ -69,8 +68,8 @@ SharedPtr HLERequestContext::SleepClientThread(SharedPtr thread, return event; } -HLERequestContext::HLERequestContext(SharedPtr session) - : session(std::move(session)) { +HLERequestContext::HLERequestContext(KernelSystem& kernel, SharedPtr session) + : kernel(kernel), session(std::move(session)) { cmd_buf[0] = 0; } @@ -143,8 +142,7 @@ ResultCode HLERequestContext::PopulateFromIncomingCommandBuffer(const u32_le* sr // Copy the input buffer into our own vector and store it. std::vector data(buffer_info.size); - Core::System::GetInstance().Memory().ReadBlock(src_process, source_address, data.data(), - data.size()); + kernel.memory.ReadBlock(src_process, source_address, data.data(), data.size()); AddStaticBuffer(buffer_info.buffer_id, std::move(data)); cmd_buf[i++] = source_address; @@ -152,7 +150,8 @@ ResultCode HLERequestContext::PopulateFromIncomingCommandBuffer(const u32_le* sr } case IPC::DescriptorType::MappedBuffer: { u32 next_id = static_cast(request_mapped_buffers.size()); - request_mapped_buffers.emplace_back(src_process, descriptor, src_cmdbuf[i], next_id); + request_mapped_buffers.emplace_back(kernel.memory, src_process, descriptor, + src_cmdbuf[i], next_id); cmd_buf[i++] = next_id; break; } @@ -211,8 +210,7 @@ ResultCode HLERequestContext::WriteToOutgoingCommandBuffer(u32_le* dst_cmdbuf, ASSERT_MSG(target_descriptor.size >= data.size(), "Static buffer data is too big"); - Core::System::GetInstance().Memory().WriteBlock(dst_process, target_address, - data.data(), data.size()); + kernel.memory.WriteBlock(dst_process, target_address, data.data(), data.size()); dst_cmdbuf[i++] = target_address; break; @@ -235,8 +233,9 @@ MappedBuffer& HLERequestContext::GetMappedBuffer(u32 id_from_cmdbuf) { return request_mapped_buffers[id_from_cmdbuf]; } -MappedBuffer::MappedBuffer(const Process& process, u32 descriptor, VAddr address, u32 id) - : id(id), address(address), process(&process) { +MappedBuffer::MappedBuffer(Memory::MemorySystem& memory, const Process& process, u32 descriptor, + VAddr address, u32 id) + : memory(&memory), id(id), address(address), process(&process) { IPC::MappedBufferDescInfo desc{descriptor}; size = desc.size; perms = desc.perms; @@ -245,15 +244,13 @@ MappedBuffer::MappedBuffer(const Process& process, u32 descriptor, VAddr address void MappedBuffer::Read(void* dest_buffer, std::size_t offset, std::size_t size) { ASSERT(perms & IPC::R); ASSERT(offset + size <= this->size); - Core::System::GetInstance().Memory().ReadBlock(*process, address + static_cast(offset), - dest_buffer, size); + memory->ReadBlock(*process, address + static_cast(offset), dest_buffer, size); } void MappedBuffer::Write(const void* src_buffer, std::size_t offset, std::size_t size) { ASSERT(perms & IPC::W); ASSERT(offset + size <= this->size); - Core::System::GetInstance().Memory().WriteBlock(*process, address + static_cast(offset), - src_buffer, size); + memory->WriteBlock(*process, address + static_cast(offset), src_buffer, size); } } // namespace Kernel diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h index 55753dce2..78c459a9e 100644 --- a/src/core/hle/kernel/hle_ipc.h +++ b/src/core/hle/kernel/hle_ipc.h @@ -21,6 +21,10 @@ namespace Service { class ServiceFrameworkBase; } +namespace Memory { +class MemorySystem; +} + namespace Kernel { class HandleTable; @@ -28,6 +32,7 @@ class Process; class Thread; class Event; class HLERequestContext; +class KernelSystem; /** * Interface implemented by HLE Session handlers. @@ -93,7 +98,8 @@ protected: class MappedBuffer { public: - MappedBuffer(const Process& process, u32 descriptor, VAddr address, u32 id); + MappedBuffer(Memory::MemorySystem& memory, const Process& process, u32 descriptor, + VAddr address, u32 id); // interface for service void Read(void* dest_buffer, std::size_t offset, std::size_t size); @@ -113,6 +119,7 @@ public: private: friend class HLERequestContext; + Memory::MemorySystem* memory; u32 id; VAddr address; const Process* process; @@ -151,7 +158,7 @@ private: */ class HLERequestContext { public: - HLERequestContext(SharedPtr session); + HLERequestContext(KernelSystem& kernel, SharedPtr session); ~HLERequestContext(); /// Returns a pointer to the IPC command buffer for this request. @@ -228,6 +235,7 @@ public: ResultCode WriteToOutgoingCommandBuffer(u32_le* dst_cmdbuf, Process& dst_process) const; private: + KernelSystem& kernel; std::array cmd_buf; SharedPtr session; // TODO(yuriks): Check common usage of this and optimize size accordingly diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp index 27923ac5d..dd940b724 100644 --- a/src/core/hle/kernel/server_session.cpp +++ b/src/core/hle/kernel/server_session.cpp @@ -71,7 +71,7 @@ ResultCode ServerSession::HandleSyncRequest(SharedPtr thread) { kernel.memory.ReadBlock(*current_process, thread->GetCommandBufferAddress(), cmd_buf.data(), cmd_buf.size() * sizeof(u32)); - Kernel::HLERequestContext context(this); + Kernel::HLERequestContext context(kernel, this); context.PopulateFromIncomingCommandBuffer(cmd_buf.data(), *current_process); hle_handler->HandleSyncRequest(context); diff --git a/src/tests/core/hle/kernel/hle_ipc.cpp b/src/tests/core/hle/kernel/hle_ipc.cpp index c22c66837..04937d9ea 100644 --- a/src/tests/core/hle/kernel/hle_ipc.cpp +++ b/src/tests/core/hle/kernel/hle_ipc.cpp @@ -26,7 +26,7 @@ TEST_CASE("HLERequestContext::PopulateFromIncomingCommandBuffer", "[core][kernel auto memory = std::make_unique(); Kernel::KernelSystem kernel(*memory, 0); auto session = std::get>(kernel.CreateSessionPair()); - HLERequestContext context(std::move(session)); + HLERequestContext context(kernel, std::move(session)); auto process = kernel.CreateProcess(kernel.CreateCodeSet("", 0)); @@ -239,7 +239,7 @@ TEST_CASE("HLERequestContext::WriteToOutgoingCommandBuffer", "[core][kernel]") { auto memory = std::make_unique(); Kernel::KernelSystem kernel(*memory, 0); auto session = std::get>(kernel.CreateSessionPair()); - HLERequestContext context(std::move(session)); + HLERequestContext context(kernel, std::move(session)); auto process = kernel.CreateProcess(kernel.CreateCodeSet("", 0)); auto* input = context.CommandBuffer();