summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/CMakeLists.txt2
-rw-r--r--src/core/hle/kernel/k_class_token.cpp3
-rw-r--r--src/core/hle/kernel/k_class_token.h6
-rw-r--r--src/core/hle/kernel/k_system_resource.cpp26
-rw-r--r--src/core/hle/kernel/k_system_resource.h137
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
123static_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
11class KAutoObject; 11class KAutoObject;
12 12
13class KSystemResource;
14
13class KClassTokenGenerator { 15class KClassTokenGenerator {
14public: 16public:
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
6namespace Kernel {
7
8Result 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
15void KSecureSystemResource::Finalize() {
16 // Unimplemented
17 UNREACHABLE();
18}
19
20size_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
15namespace Kernel {
16
17// NOTE: Nintendo's implementation does not have the "is_secure_resource" field, and instead uses
18// virtual IsSecureResource().
19
20class KSystemResource : public KAutoObject {
21 KERNEL_AUTOOBJECT_TRAITS(KSystemResource, KAutoObject);
22
23public:
24 explicit KSystemResource(KernelCore& kernel_) : KAutoObject(kernel_) {}
25
26protected:
27 void SetSecureResource() {
28 m_is_secure_resource = true;
29 }
30
31public:
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
80private:
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
87class KSecureSystemResource final
88 : public KAutoObjectWithSlabHeap<KSecureSystemResource, KSystemResource> {
89public:
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
119public:
120 static size_t CalculateRequiredSecureMemorySize(size_t size, KMemoryManager::Pool pool);
121
122private:
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