resource_limit.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. // Copyright 2015 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <cstring>
  5. #include "common/assert.h"
  6. #include "common/logging/log.h"
  7. #include "core/hle/kernel/resource_limit.h"
  8. namespace Kernel {
  9. static SharedPtr<ResourceLimit> resource_limits[4];
  10. ResourceLimit::ResourceLimit() {}
  11. ResourceLimit::~ResourceLimit() {}
  12. SharedPtr<ResourceLimit> ResourceLimit::Create(std::string name) {
  13. SharedPtr<ResourceLimit> resource_limit(new ResourceLimit);
  14. resource_limit->name = std::move(name);
  15. return resource_limit;
  16. }
  17. SharedPtr<ResourceLimit> ResourceLimit::GetForCategory(ResourceLimitCategory category) {
  18. switch (category) {
  19. case ResourceLimitCategory::APPLICATION:
  20. case ResourceLimitCategory::SYS_APPLET:
  21. case ResourceLimitCategory::LIB_APPLET:
  22. case ResourceLimitCategory::OTHER:
  23. return resource_limits[static_cast<u8>(category)];
  24. default:
  25. NGLOG_CRITICAL(Kernel, "Unknown resource limit category");
  26. UNREACHABLE();
  27. }
  28. }
  29. s32 ResourceLimit::GetCurrentResourceValue(ResourceType resource) const {
  30. switch (resource) {
  31. case ResourceType::Commit:
  32. return current_commit;
  33. case ResourceType::Thread:
  34. return current_threads;
  35. case ResourceType::Event:
  36. return current_events;
  37. case ResourceType::Mutex:
  38. return current_mutexes;
  39. case ResourceType::Semaphore:
  40. return current_semaphores;
  41. case ResourceType::Timer:
  42. return current_timers;
  43. case ResourceType::SharedMemory:
  44. return current_shared_mems;
  45. case ResourceType::AddressArbiter:
  46. return current_address_arbiters;
  47. case ResourceType::CPUTime:
  48. return current_cpu_time;
  49. default:
  50. NGLOG_ERROR(Kernel, "Unknown resource type={:08X}", static_cast<u32>(resource));
  51. UNIMPLEMENTED();
  52. return 0;
  53. }
  54. }
  55. u32 ResourceLimit::GetMaxResourceValue(ResourceType resource) const {
  56. switch (resource) {
  57. case ResourceType::Priority:
  58. return max_priority;
  59. case ResourceType::Commit:
  60. return max_commit;
  61. case ResourceType::Thread:
  62. return max_threads;
  63. case ResourceType::Event:
  64. return max_events;
  65. case ResourceType::Mutex:
  66. return max_mutexes;
  67. case ResourceType::Semaphore:
  68. return max_semaphores;
  69. case ResourceType::Timer:
  70. return max_timers;
  71. case ResourceType::SharedMemory:
  72. return max_shared_mems;
  73. case ResourceType::AddressArbiter:
  74. return max_address_arbiters;
  75. case ResourceType::CPUTime:
  76. return max_cpu_time;
  77. default:
  78. NGLOG_ERROR(Kernel, "Unknown resource type={:08X}", static_cast<u32>(resource));
  79. UNIMPLEMENTED();
  80. return 0;
  81. }
  82. }
  83. void ResourceLimitsInit() {
  84. // Create the four resource limits that the system uses
  85. // Create the APPLICATION resource limit
  86. SharedPtr<ResourceLimit> resource_limit = ResourceLimit::Create("Applications");
  87. resource_limit->max_priority = 0x18;
  88. resource_limit->max_commit = 0x4000000;
  89. resource_limit->max_threads = 0x20;
  90. resource_limit->max_events = 0x20;
  91. resource_limit->max_mutexes = 0x20;
  92. resource_limit->max_semaphores = 0x8;
  93. resource_limit->max_timers = 0x8;
  94. resource_limit->max_shared_mems = 0x10;
  95. resource_limit->max_address_arbiters = 0x2;
  96. resource_limit->max_cpu_time = 0x1E;
  97. resource_limits[static_cast<u8>(ResourceLimitCategory::APPLICATION)] = resource_limit;
  98. // Create the SYS_APPLET resource limit
  99. resource_limit = ResourceLimit::Create("System Applets");
  100. resource_limit->max_priority = 0x4;
  101. resource_limit->max_commit = 0x5E00000;
  102. resource_limit->max_threads = 0x1D;
  103. resource_limit->max_events = 0xB;
  104. resource_limit->max_mutexes = 0x8;
  105. resource_limit->max_semaphores = 0x4;
  106. resource_limit->max_timers = 0x4;
  107. resource_limit->max_shared_mems = 0x8;
  108. resource_limit->max_address_arbiters = 0x3;
  109. resource_limit->max_cpu_time = 0x2710;
  110. resource_limits[static_cast<u8>(ResourceLimitCategory::SYS_APPLET)] = resource_limit;
  111. // Create the LIB_APPLET resource limit
  112. resource_limit = ResourceLimit::Create("Library Applets");
  113. resource_limit->max_priority = 0x4;
  114. resource_limit->max_commit = 0x600000;
  115. resource_limit->max_threads = 0xE;
  116. resource_limit->max_events = 0x8;
  117. resource_limit->max_mutexes = 0x8;
  118. resource_limit->max_semaphores = 0x4;
  119. resource_limit->max_timers = 0x4;
  120. resource_limit->max_shared_mems = 0x8;
  121. resource_limit->max_address_arbiters = 0x1;
  122. resource_limit->max_cpu_time = 0x2710;
  123. resource_limits[static_cast<u8>(ResourceLimitCategory::LIB_APPLET)] = resource_limit;
  124. // Create the OTHER resource limit
  125. resource_limit = ResourceLimit::Create("Others");
  126. resource_limit->max_priority = 0x4;
  127. resource_limit->max_commit = 0x2180000;
  128. resource_limit->max_threads = 0xE1;
  129. resource_limit->max_events = 0x108;
  130. resource_limit->max_mutexes = 0x25;
  131. resource_limit->max_semaphores = 0x43;
  132. resource_limit->max_timers = 0x2C;
  133. resource_limit->max_shared_mems = 0x1F;
  134. resource_limit->max_address_arbiters = 0x2D;
  135. resource_limit->max_cpu_time = 0x3E8;
  136. resource_limits[static_cast<u8>(ResourceLimitCategory::OTHER)] = resource_limit;
  137. }
  138. void ResourceLimitsShutdown() {}
  139. } // namespace Kernel