diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_class_token.cpp | 3 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_class_token.h | 6 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_system_resource.cpp | 26 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_system_resource.h | 137 |
5 files changed, 173 insertions, 1 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index f0d5b0887..f6e082c36 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt | |||
| @@ -258,6 +258,8 @@ add_library(core STATIC | |||
| 258 | hle/kernel/k_synchronization_object.cpp | 258 | hle/kernel/k_synchronization_object.cpp |
| 259 | hle/kernel/k_synchronization_object.h | 259 | hle/kernel/k_synchronization_object.h |
| 260 | hle/kernel/k_system_control.h | 260 | hle/kernel/k_system_control.h |
| 261 | hle/kernel/k_system_resource.cpp | ||
| 262 | hle/kernel/k_system_resource.h | ||
| 261 | hle/kernel/k_thread.cpp | 263 | hle/kernel/k_thread.cpp |
| 262 | hle/kernel/k_thread.h | 264 | hle/kernel/k_thread.h |
| 263 | hle/kernel/k_thread_local_page.cpp | 265 | hle/kernel/k_thread_local_page.cpp |
diff --git a/src/core/hle/kernel/k_class_token.cpp b/src/core/hle/kernel/k_class_token.cpp index 10265c23c..6eb44d6a6 100644 --- a/src/core/hle/kernel/k_class_token.cpp +++ b/src/core/hle/kernel/k_class_token.cpp | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include "core/hle/kernel/k_session.h" | 16 | #include "core/hle/kernel/k_session.h" |
| 17 | #include "core/hle/kernel/k_shared_memory.h" | 17 | #include "core/hle/kernel/k_shared_memory.h" |
| 18 | #include "core/hle/kernel/k_synchronization_object.h" | 18 | #include "core/hle/kernel/k_synchronization_object.h" |
| 19 | #include "core/hle/kernel/k_system_resource.h" | ||
| 19 | #include "core/hle/kernel/k_thread.h" | 20 | #include "core/hle/kernel/k_thread.h" |
| 20 | #include "core/hle/kernel/k_transfer_memory.h" | 21 | #include "core/hle/kernel/k_transfer_memory.h" |
| 21 | 22 | ||
| @@ -119,4 +120,6 @@ static_assert(std::is_final_v<KTransferMemory> && std::is_base_of_v<KAutoObject, | |||
| 119 | // static_assert(std::is_final_v<KCodeMemory> && | 120 | // static_assert(std::is_final_v<KCodeMemory> && |
| 120 | // std::is_base_of_v<KAutoObject, KCodeMemory>); | 121 | // std::is_base_of_v<KAutoObject, KCodeMemory>); |
| 121 | 122 | ||
| 123 | static_assert(std::is_base_of<KAutoObject, KSystemResource>::value); | ||
| 124 | |||
| 122 | } // namespace Kernel | 125 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/k_class_token.h b/src/core/hle/kernel/k_class_token.h index ab20e00ff..e75b1c035 100644 --- a/src/core/hle/kernel/k_class_token.h +++ b/src/core/hle/kernel/k_class_token.h | |||
| @@ -10,6 +10,8 @@ namespace Kernel { | |||
| 10 | 10 | ||
| 11 | class KAutoObject; | 11 | class KAutoObject; |
| 12 | 12 | ||
| 13 | class KSystemResource; | ||
| 14 | |||
| 13 | class KClassTokenGenerator { | 15 | class KClassTokenGenerator { |
| 14 | public: | 16 | public: |
| 15 | using TokenBaseType = u16; | 17 | using TokenBaseType = u16; |
| @@ -58,7 +60,7 @@ private: | |||
| 58 | if constexpr (std::is_same<T, KAutoObject>::value) { | 60 | if constexpr (std::is_same<T, KAutoObject>::value) { |
| 59 | static_assert(T::ObjectType == ObjectType::KAutoObject); | 61 | static_assert(T::ObjectType == ObjectType::KAutoObject); |
| 60 | return 0; | 62 | return 0; |
| 61 | } else if constexpr (!std::is_final<T>::value) { | 63 | } else if constexpr (!std::is_final<T>::value && !std::same_as<T, KSystemResource>) { |
| 62 | static_assert(ObjectType::BaseClassesStart <= T::ObjectType && | 64 | static_assert(ObjectType::BaseClassesStart <= T::ObjectType && |
| 63 | T::ObjectType < ObjectType::BaseClassesEnd); | 65 | T::ObjectType < ObjectType::BaseClassesEnd); |
| 64 | constexpr auto ClassIndex = static_cast<TokenBaseType>(T::ObjectType) - | 66 | constexpr auto ClassIndex = static_cast<TokenBaseType>(T::ObjectType) - |
| @@ -108,6 +110,8 @@ public: | |||
| 108 | KSessionRequest, | 110 | KSessionRequest, |
| 109 | KCodeMemory, | 111 | KCodeMemory, |
| 110 | 112 | ||
| 113 | KSystemResource, | ||
| 114 | |||
| 111 | // NOTE: True order for these has not been determined yet. | 115 | // NOTE: True order for these has not been determined yet. |
| 112 | KAlpha, | 116 | KAlpha, |
| 113 | KBeta, | 117 | KBeta, |
diff --git a/src/core/hle/kernel/k_system_resource.cpp b/src/core/hle/kernel/k_system_resource.cpp new file mode 100644 index 000000000..4cc377a6c --- /dev/null +++ b/src/core/hle/kernel/k_system_resource.cpp | |||
| @@ -0,0 +1,26 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #include "core/hle/kernel/k_system_resource.h" | ||
| 5 | |||
| 6 | namespace Kernel { | ||
| 7 | |||
| 8 | Result KSecureSystemResource::Initialize([[maybe_unused]] size_t size, | ||
| 9 | [[maybe_unused]] KResourceLimit* resource_limit, | ||
| 10 | [[maybe_unused]] KMemoryManager::Pool pool) { | ||
| 11 | // Unimplemented | ||
| 12 | UNREACHABLE(); | ||
| 13 | } | ||
| 14 | |||
| 15 | void KSecureSystemResource::Finalize() { | ||
| 16 | // Unimplemented | ||
| 17 | UNREACHABLE(); | ||
| 18 | } | ||
| 19 | |||
| 20 | size_t KSecureSystemResource::CalculateRequiredSecureMemorySize( | ||
| 21 | [[maybe_unused]] size_t size, [[maybe_unused]] KMemoryManager::Pool pool) { | ||
| 22 | // Unimplemented | ||
| 23 | UNREACHABLE(); | ||
| 24 | } | ||
| 25 | |||
| 26 | } // namespace Kernel | ||
diff --git a/src/core/hle/kernel/k_system_resource.h b/src/core/hle/kernel/k_system_resource.h new file mode 100644 index 000000000..9a991f725 --- /dev/null +++ b/src/core/hle/kernel/k_system_resource.h | |||
| @@ -0,0 +1,137 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #pragma once | ||
| 5 | |||
| 6 | #include "common/assert.h" | ||
| 7 | #include "common/common_types.h" | ||
| 8 | #include "core/hle/kernel/k_auto_object.h" | ||
| 9 | #include "core/hle/kernel/k_dynamic_resource_manager.h" | ||
| 10 | #include "core/hle/kernel/k_memory_manager.h" | ||
| 11 | #include "core/hle/kernel/k_page_table_manager.h" | ||
| 12 | #include "core/hle/kernel/k_resource_limit.h" | ||
| 13 | #include "core/hle/kernel/slab_helpers.h" | ||
| 14 | |||
| 15 | namespace Kernel { | ||
| 16 | |||
| 17 | // NOTE: Nintendo's implementation does not have the "is_secure_resource" field, and instead uses | ||
| 18 | // virtual IsSecureResource(). | ||
| 19 | |||
| 20 | class KSystemResource : public KAutoObject { | ||
| 21 | KERNEL_AUTOOBJECT_TRAITS(KSystemResource, KAutoObject); | ||
| 22 | |||
| 23 | public: | ||
| 24 | explicit KSystemResource(KernelCore& kernel_) : KAutoObject(kernel_) {} | ||
| 25 | |||
| 26 | protected: | ||
| 27 | void SetSecureResource() { | ||
| 28 | m_is_secure_resource = true; | ||
| 29 | } | ||
| 30 | |||
| 31 | public: | ||
| 32 | virtual void Destroy() override { | ||
| 33 | UNREACHABLE_MSG("KSystemResource::Destroy() was called"); | ||
| 34 | } | ||
| 35 | |||
| 36 | bool IsSecureResource() const { | ||
| 37 | return m_is_secure_resource; | ||
| 38 | } | ||
| 39 | |||
| 40 | void SetManagers(KMemoryBlockSlabManager& mb, KBlockInfoManager& bi, KPageTableManager& pt) { | ||
| 41 | ASSERT(m_p_memory_block_slab_manager == nullptr); | ||
| 42 | ASSERT(m_p_block_info_manager == nullptr); | ||
| 43 | ASSERT(m_p_page_table_manager == nullptr); | ||
| 44 | |||
| 45 | m_p_memory_block_slab_manager = std::addressof(mb); | ||
| 46 | m_p_block_info_manager = std::addressof(bi); | ||
| 47 | m_p_page_table_manager = std::addressof(pt); | ||
| 48 | } | ||
| 49 | |||
| 50 | const KMemoryBlockSlabManager& GetMemoryBlockSlabManager() const { | ||
| 51 | return *m_p_memory_block_slab_manager; | ||
| 52 | } | ||
| 53 | const KBlockInfoManager& GetBlockInfoManager() const { | ||
| 54 | return *m_p_block_info_manager; | ||
| 55 | } | ||
| 56 | const KPageTableManager& GetPageTableManager() const { | ||
| 57 | return *m_p_page_table_manager; | ||
| 58 | } | ||
| 59 | |||
| 60 | KMemoryBlockSlabManager& GetMemoryBlockSlabManager() { | ||
| 61 | return *m_p_memory_block_slab_manager; | ||
| 62 | } | ||
| 63 | KBlockInfoManager& GetBlockInfoManager() { | ||
| 64 | return *m_p_block_info_manager; | ||
| 65 | } | ||
| 66 | KPageTableManager& GetPageTableManager() { | ||
| 67 | return *m_p_page_table_manager; | ||
| 68 | } | ||
| 69 | |||
| 70 | KMemoryBlockSlabManager* GetMemoryBlockSlabManagerPointer() { | ||
| 71 | return m_p_memory_block_slab_manager; | ||
| 72 | } | ||
| 73 | KBlockInfoManager* GetBlockInfoManagerPointer() { | ||
| 74 | return m_p_block_info_manager; | ||
| 75 | } | ||
| 76 | KPageTableManager* GetPageTableManagerPointer() { | ||
| 77 | return m_p_page_table_manager; | ||
| 78 | } | ||
| 79 | |||
| 80 | private: | ||
| 81 | KMemoryBlockSlabManager* m_p_memory_block_slab_manager{}; | ||
| 82 | KBlockInfoManager* m_p_block_info_manager{}; | ||
| 83 | KPageTableManager* m_p_page_table_manager{}; | ||
| 84 | bool m_is_secure_resource{false}; | ||
| 85 | }; | ||
| 86 | |||
| 87 | class KSecureSystemResource final | ||
| 88 | : public KAutoObjectWithSlabHeap<KSecureSystemResource, KSystemResource> { | ||
| 89 | public: | ||
| 90 | explicit KSecureSystemResource(KernelCore& kernel_) | ||
| 91 | : KAutoObjectWithSlabHeap<KSecureSystemResource, KSystemResource>(kernel_) { | ||
| 92 | // Mark ourselves as being a secure resource. | ||
| 93 | this->SetSecureResource(); | ||
| 94 | } | ||
| 95 | |||
| 96 | Result Initialize(size_t size, KResourceLimit* resource_limit, KMemoryManager::Pool pool); | ||
| 97 | void Finalize(); | ||
| 98 | |||
| 99 | bool IsInitialized() const { | ||
| 100 | return m_is_initialized; | ||
| 101 | } | ||
| 102 | static void PostDestroy([[maybe_unused]] uintptr_t arg) {} | ||
| 103 | |||
| 104 | size_t CalculateRequiredSecureMemorySize() const { | ||
| 105 | return CalculateRequiredSecureMemorySize(m_resource_size, m_resource_pool); | ||
| 106 | } | ||
| 107 | |||
| 108 | size_t GetSize() const { | ||
| 109 | return m_resource_size; | ||
| 110 | } | ||
| 111 | size_t GetUsedSize() const { | ||
| 112 | return m_dynamic_page_manager.GetUsed() * PageSize; | ||
| 113 | } | ||
| 114 | |||
| 115 | const KDynamicPageManager& GetDynamicPageManager() const { | ||
| 116 | return m_dynamic_page_manager; | ||
| 117 | } | ||
| 118 | |||
| 119 | public: | ||
| 120 | static size_t CalculateRequiredSecureMemorySize(size_t size, KMemoryManager::Pool pool); | ||
| 121 | |||
| 122 | private: | ||
| 123 | bool m_is_initialized{}; | ||
| 124 | KMemoryManager::Pool m_resource_pool{}; | ||
| 125 | KDynamicPageManager m_dynamic_page_manager; | ||
| 126 | KMemoryBlockSlabManager m_memory_block_slab_manager; | ||
| 127 | KBlockInfoManager m_block_info_manager; | ||
| 128 | KPageTableManager m_page_table_manager; | ||
| 129 | KMemoryBlockSlabHeap m_memory_block_heap; | ||
| 130 | KBlockInfoSlabHeap m_block_info_heap; | ||
| 131 | KPageTableSlabHeap m_page_table_heap; | ||
| 132 | KResourceLimit* m_resource_limit{}; | ||
| 133 | VAddr m_resource_address{}; | ||
| 134 | size_t m_resource_size{}; | ||
| 135 | }; | ||
| 136 | |||
| 137 | } // namespace Kernel | ||