5 changed files with 173 additions and 1 deletions
-
2src/core/CMakeLists.txt
-
3src/core/hle/kernel/k_class_token.cpp
-
6src/core/hle/kernel/k_class_token.h
-
26src/core/hle/kernel/k_system_resource.cpp
-
137src/core/hle/kernel/k_system_resource.h
@ -0,0 +1,26 @@ |
|||||
|
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
|
||||
|
#include "core/hle/kernel/k_system_resource.h"
|
||||
|
|
||||
|
namespace Kernel { |
||||
|
|
||||
|
Result KSecureSystemResource::Initialize([[maybe_unused]] size_t size, |
||||
|
[[maybe_unused]] KResourceLimit* resource_limit, |
||||
|
[[maybe_unused]] KMemoryManager::Pool pool) { |
||||
|
// Unimplemented
|
||||
|
UNREACHABLE(); |
||||
|
} |
||||
|
|
||||
|
void KSecureSystemResource::Finalize() { |
||||
|
// Unimplemented
|
||||
|
UNREACHABLE(); |
||||
|
} |
||||
|
|
||||
|
size_t KSecureSystemResource::CalculateRequiredSecureMemorySize( |
||||
|
[[maybe_unused]] size_t size, [[maybe_unused]] KMemoryManager::Pool pool) { |
||||
|
// Unimplemented
|
||||
|
UNREACHABLE(); |
||||
|
} |
||||
|
|
||||
|
} // namespace Kernel
|
||||
@ -0,0 +1,137 @@ |
|||||
|
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project |
||||
|
// SPDX-License-Identifier: GPL-2.0-or-later |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include "common/assert.h" |
||||
|
#include "common/common_types.h" |
||||
|
#include "core/hle/kernel/k_auto_object.h" |
||||
|
#include "core/hle/kernel/k_dynamic_resource_manager.h" |
||||
|
#include "core/hle/kernel/k_memory_manager.h" |
||||
|
#include "core/hle/kernel/k_page_table_manager.h" |
||||
|
#include "core/hle/kernel/k_resource_limit.h" |
||||
|
#include "core/hle/kernel/slab_helpers.h" |
||||
|
|
||||
|
namespace Kernel { |
||||
|
|
||||
|
// NOTE: Nintendo's implementation does not have the "is_secure_resource" field, and instead uses |
||||
|
// virtual IsSecureResource(). |
||||
|
|
||||
|
class KSystemResource : public KAutoObject { |
||||
|
KERNEL_AUTOOBJECT_TRAITS(KSystemResource, KAutoObject); |
||||
|
|
||||
|
public: |
||||
|
explicit KSystemResource(KernelCore& kernel_) : KAutoObject(kernel_) {} |
||||
|
|
||||
|
protected: |
||||
|
void SetSecureResource() { |
||||
|
m_is_secure_resource = true; |
||||
|
} |
||||
|
|
||||
|
public: |
||||
|
virtual void Destroy() override { |
||||
|
UNREACHABLE_MSG("KSystemResource::Destroy() was called"); |
||||
|
} |
||||
|
|
||||
|
bool IsSecureResource() const { |
||||
|
return m_is_secure_resource; |
||||
|
} |
||||
|
|
||||
|
void SetManagers(KMemoryBlockSlabManager& mb, KBlockInfoManager& bi, KPageTableManager& pt) { |
||||
|
ASSERT(m_p_memory_block_slab_manager == nullptr); |
||||
|
ASSERT(m_p_block_info_manager == nullptr); |
||||
|
ASSERT(m_p_page_table_manager == nullptr); |
||||
|
|
||||
|
m_p_memory_block_slab_manager = std::addressof(mb); |
||||
|
m_p_block_info_manager = std::addressof(bi); |
||||
|
m_p_page_table_manager = std::addressof(pt); |
||||
|
} |
||||
|
|
||||
|
const KMemoryBlockSlabManager& GetMemoryBlockSlabManager() const { |
||||
|
return *m_p_memory_block_slab_manager; |
||||
|
} |
||||
|
const KBlockInfoManager& GetBlockInfoManager() const { |
||||
|
return *m_p_block_info_manager; |
||||
|
} |
||||
|
const KPageTableManager& GetPageTableManager() const { |
||||
|
return *m_p_page_table_manager; |
||||
|
} |
||||
|
|
||||
|
KMemoryBlockSlabManager& GetMemoryBlockSlabManager() { |
||||
|
return *m_p_memory_block_slab_manager; |
||||
|
} |
||||
|
KBlockInfoManager& GetBlockInfoManager() { |
||||
|
return *m_p_block_info_manager; |
||||
|
} |
||||
|
KPageTableManager& GetPageTableManager() { |
||||
|
return *m_p_page_table_manager; |
||||
|
} |
||||
|
|
||||
|
KMemoryBlockSlabManager* GetMemoryBlockSlabManagerPointer() { |
||||
|
return m_p_memory_block_slab_manager; |
||||
|
} |
||||
|
KBlockInfoManager* GetBlockInfoManagerPointer() { |
||||
|
return m_p_block_info_manager; |
||||
|
} |
||||
|
KPageTableManager* GetPageTableManagerPointer() { |
||||
|
return m_p_page_table_manager; |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
KMemoryBlockSlabManager* m_p_memory_block_slab_manager{}; |
||||
|
KBlockInfoManager* m_p_block_info_manager{}; |
||||
|
KPageTableManager* m_p_page_table_manager{}; |
||||
|
bool m_is_secure_resource{false}; |
||||
|
}; |
||||
|
|
||||
|
class KSecureSystemResource final |
||||
|
: public KAutoObjectWithSlabHeap<KSecureSystemResource, KSystemResource> { |
||||
|
public: |
||||
|
explicit KSecureSystemResource(KernelCore& kernel_) |
||||
|
: KAutoObjectWithSlabHeap<KSecureSystemResource, KSystemResource>(kernel_) { |
||||
|
// Mark ourselves as being a secure resource. |
||||
|
this->SetSecureResource(); |
||||
|
} |
||||
|
|
||||
|
Result Initialize(size_t size, KResourceLimit* resource_limit, KMemoryManager::Pool pool); |
||||
|
void Finalize(); |
||||
|
|
||||
|
bool IsInitialized() const { |
||||
|
return m_is_initialized; |
||||
|
} |
||||
|
static void PostDestroy([[maybe_unused]] uintptr_t arg) {} |
||||
|
|
||||
|
size_t CalculateRequiredSecureMemorySize() const { |
||||
|
return CalculateRequiredSecureMemorySize(m_resource_size, m_resource_pool); |
||||
|
} |
||||
|
|
||||
|
size_t GetSize() const { |
||||
|
return m_resource_size; |
||||
|
} |
||||
|
size_t GetUsedSize() const { |
||||
|
return m_dynamic_page_manager.GetUsed() * PageSize; |
||||
|
} |
||||
|
|
||||
|
const KDynamicPageManager& GetDynamicPageManager() const { |
||||
|
return m_dynamic_page_manager; |
||||
|
} |
||||
|
|
||||
|
public: |
||||
|
static size_t CalculateRequiredSecureMemorySize(size_t size, KMemoryManager::Pool pool); |
||||
|
|
||||
|
private: |
||||
|
bool m_is_initialized{}; |
||||
|
KMemoryManager::Pool m_resource_pool{}; |
||||
|
KDynamicPageManager m_dynamic_page_manager; |
||||
|
KMemoryBlockSlabManager m_memory_block_slab_manager; |
||||
|
KBlockInfoManager m_block_info_manager; |
||||
|
KPageTableManager m_page_table_manager; |
||||
|
KMemoryBlockSlabHeap m_memory_block_heap; |
||||
|
KBlockInfoSlabHeap m_block_info_heap; |
||||
|
KPageTableSlabHeap m_page_table_heap; |
||||
|
KResourceLimit* m_resource_limit{}; |
||||
|
VAddr m_resource_address{}; |
||||
|
size_t m_resource_size{}; |
||||
|
}; |
||||
|
|
||||
|
} // namespace Kernel |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue