k_system_resource.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include "common/assert.h"
  5. #include "common/common_types.h"
  6. #include "core/hle/kernel/k_auto_object.h"
  7. #include "core/hle/kernel/k_dynamic_resource_manager.h"
  8. #include "core/hle/kernel/k_memory_manager.h"
  9. #include "core/hle/kernel/k_page_table_manager.h"
  10. #include "core/hle/kernel/k_resource_limit.h"
  11. #include "core/hle/kernel/slab_helpers.h"
  12. namespace Kernel {
  13. // NOTE: Nintendo's implementation does not have the "is_secure_resource" field, and instead uses
  14. // virtual IsSecureResource().
  15. class KSystemResource : public KAutoObject {
  16. KERNEL_AUTOOBJECT_TRAITS(KSystemResource, KAutoObject);
  17. public:
  18. explicit KSystemResource(KernelCore& kernel_) : KAutoObject(kernel_) {}
  19. protected:
  20. void SetSecureResource() {
  21. m_is_secure_resource = true;
  22. }
  23. public:
  24. virtual void Destroy() override {
  25. UNREACHABLE_MSG("KSystemResource::Destroy() was called");
  26. }
  27. bool IsSecureResource() const {
  28. return m_is_secure_resource;
  29. }
  30. void SetManagers(KMemoryBlockSlabManager& mb, KBlockInfoManager& bi, KPageTableManager& pt) {
  31. ASSERT(m_p_memory_block_slab_manager == nullptr);
  32. ASSERT(m_p_block_info_manager == nullptr);
  33. ASSERT(m_p_page_table_manager == nullptr);
  34. m_p_memory_block_slab_manager = std::addressof(mb);
  35. m_p_block_info_manager = std::addressof(bi);
  36. m_p_page_table_manager = std::addressof(pt);
  37. }
  38. const KMemoryBlockSlabManager& GetMemoryBlockSlabManager() const {
  39. return *m_p_memory_block_slab_manager;
  40. }
  41. const KBlockInfoManager& GetBlockInfoManager() const {
  42. return *m_p_block_info_manager;
  43. }
  44. const KPageTableManager& GetPageTableManager() const {
  45. return *m_p_page_table_manager;
  46. }
  47. KMemoryBlockSlabManager& GetMemoryBlockSlabManager() {
  48. return *m_p_memory_block_slab_manager;
  49. }
  50. KBlockInfoManager& GetBlockInfoManager() {
  51. return *m_p_block_info_manager;
  52. }
  53. KPageTableManager& GetPageTableManager() {
  54. return *m_p_page_table_manager;
  55. }
  56. KMemoryBlockSlabManager* GetMemoryBlockSlabManagerPointer() {
  57. return m_p_memory_block_slab_manager;
  58. }
  59. KBlockInfoManager* GetBlockInfoManagerPointer() {
  60. return m_p_block_info_manager;
  61. }
  62. KPageTableManager* GetPageTableManagerPointer() {
  63. return m_p_page_table_manager;
  64. }
  65. private:
  66. KMemoryBlockSlabManager* m_p_memory_block_slab_manager{};
  67. KBlockInfoManager* m_p_block_info_manager{};
  68. KPageTableManager* m_p_page_table_manager{};
  69. bool m_is_secure_resource{false};
  70. };
  71. class KSecureSystemResource final
  72. : public KAutoObjectWithSlabHeap<KSecureSystemResource, KSystemResource> {
  73. public:
  74. explicit KSecureSystemResource(KernelCore& kernel_)
  75. : KAutoObjectWithSlabHeap<KSecureSystemResource, KSystemResource>(kernel_) {
  76. // Mark ourselves as being a secure resource.
  77. this->SetSecureResource();
  78. }
  79. Result Initialize(size_t size, KResourceLimit* resource_limit, KMemoryManager::Pool pool);
  80. void Finalize();
  81. bool IsInitialized() const {
  82. return m_is_initialized;
  83. }
  84. static void PostDestroy([[maybe_unused]] uintptr_t arg) {}
  85. size_t CalculateRequiredSecureMemorySize() const {
  86. return CalculateRequiredSecureMemorySize(m_resource_size, m_resource_pool);
  87. }
  88. size_t GetSize() const {
  89. return m_resource_size;
  90. }
  91. size_t GetUsedSize() const {
  92. return m_dynamic_page_manager.GetUsed() * PageSize;
  93. }
  94. const KDynamicPageManager& GetDynamicPageManager() const {
  95. return m_dynamic_page_manager;
  96. }
  97. public:
  98. static size_t CalculateRequiredSecureMemorySize(size_t size, KMemoryManager::Pool pool);
  99. private:
  100. bool m_is_initialized{};
  101. KMemoryManager::Pool m_resource_pool{};
  102. KDynamicPageManager m_dynamic_page_manager;
  103. KMemoryBlockSlabManager m_memory_block_slab_manager;
  104. KBlockInfoManager m_block_info_manager;
  105. KPageTableManager m_page_table_manager;
  106. KMemoryBlockSlabHeap m_memory_block_heap;
  107. KBlockInfoSlabHeap m_block_info_heap;
  108. KPageTableSlabHeap m_page_table_heap;
  109. KResourceLimit* m_resource_limit{};
  110. VAddr m_resource_address{};
  111. size_t m_resource_size{};
  112. };
  113. } // namespace Kernel