From 2e8e57c20e067ed0d83b2a0bf76c3f5dfac424f3 Mon Sep 17 00:00:00 2001 From: bunnei Date: Fri, 11 Mar 2022 00:18:35 -0800 Subject: [PATCH] core: hle: kernel: k_page_buffer: Add KPageBuffer primitive. --- src/core/CMakeLists.txt | 1 + src/core/hle/kernel/k_page_buffer.h | 40 +++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 src/core/hle/kernel/k_page_buffer.h diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 5db6a1b3a7..43be5e6529 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -207,6 +207,7 @@ add_library(core STATIC hle/kernel/k_memory_region.h hle/kernel/k_memory_region_type.h hle/kernel/k_page_bitmap.h + hle/kernel/k_page_buffer.h hle/kernel/k_page_heap.cpp hle/kernel/k_page_heap.h hle/kernel/k_page_linked_list.h diff --git a/src/core/hle/kernel/k_page_buffer.h b/src/core/hle/kernel/k_page_buffer.h new file mode 100644 index 0000000000..c8e04a8896 --- /dev/null +++ b/src/core/hle/kernel/k_page_buffer.h @@ -0,0 +1,40 @@ +// Copyright 2022 yuzu Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include + +#include "common/alignment.h" +#include "common/assert.h" +#include "common/common_types.h" +#include "core/core.h" +#include "core/device_memory.h" +#include "core/hle/kernel/memory_types.h" + +namespace Kernel { + +class KPageBuffer final : public KSlabAllocated { +private: + alignas(PageSize) std::array m_buffer; + +public: + KPageBuffer() { + std::memset(&m_buffer, 0, m_buffer.size()); + } + + PAddr GetPhysicalAddress(Core::System& system) const { + return system.DeviceMemory().GetPhysicalAddr(this); + } + + static KPageBuffer* FromPhysicalAddress(Core::System& system, PAddr phys_addr) { + ASSERT(Common::IsAligned(phys_addr, PageSize)); + return reinterpret_cast(system.DeviceMemory().GetPointer(phys_addr)); + } +}; + +static_assert(sizeof(KPageBuffer) == PageSize); +static_assert(alignof(KPageBuffer) == PageSize); + +} // namespace Kernel