summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar bunnei2022-02-21 12:33:17 -0800
committerGravatar bunnei2022-02-21 12:41:31 -0800
commita74fddc98f5c02b2d0be90c6d87ec3779300ee11 (patch)
treeb801352807790e645bca502bdfb0b9ad1195fef6
parentcore: hle: kernel: KEvent: Pass in owner KProcess on event creation. (diff)
downloadyuzu-a74fddc98f5c02b2d0be90c6d87ec3779300ee11.tar.gz
yuzu-a74fddc98f5c02b2d0be90c6d87ec3779300ee11.tar.xz
yuzu-a74fddc98f5c02b2d0be90c6d87ec3779300ee11.zip
core: hle: kernel: KProcess: Pass in KResourceLimit on process creation.
- This allows us to have a resource limit per process, rather than use the global system resource limit.
Diffstat (limited to '')
-rw-r--r--src/core/core.cpp11
-rw-r--r--src/core/hle/kernel/k_process.cpp11
-rw-r--r--src/core/hle/kernel/k_process.h2
-rw-r--r--src/core/hle/service/kernel_helpers.cpp15
4 files changed, 30 insertions, 9 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp
index 3f9a7f44b..b0cfee3ee 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -28,7 +28,9 @@
28#include "core/file_sys/vfs_real.h" 28#include "core/file_sys/vfs_real.h"
29#include "core/hardware_interrupt_manager.h" 29#include "core/hardware_interrupt_manager.h"
30#include "core/hid/hid_core.h" 30#include "core/hid/hid_core.h"
31#include "core/hle/kernel/k_memory_manager.h"
31#include "core/hle/kernel/k_process.h" 32#include "core/hle/kernel/k_process.h"
33#include "core/hle/kernel/k_resource_limit.h"
32#include "core/hle/kernel/k_scheduler.h" 34#include "core/hle/kernel/k_scheduler.h"
33#include "core/hle/kernel/kernel.h" 35#include "core/hle/kernel/kernel.h"
34#include "core/hle/kernel/physical_core.h" 36#include "core/hle/kernel/physical_core.h"
@@ -252,9 +254,16 @@ struct System::Impl {
252 } 254 }
253 255
254 telemetry_session->AddInitialInfo(*app_loader, fs_controller, *content_provider); 256 telemetry_session->AddInitialInfo(*app_loader, fs_controller, *content_provider);
257
258 // Create a resource limit for the process.
259 const auto physical_memory_size =
260 kernel.MemoryManager().GetSize(Kernel::KMemoryManager::Pool::Application);
261 auto* resource_limit = Kernel::CreateResourceLimitForProcess(system, physical_memory_size);
262
263 // Create the process.
255 auto main_process = Kernel::KProcess::Create(system.Kernel()); 264 auto main_process = Kernel::KProcess::Create(system.Kernel());
256 ASSERT(Kernel::KProcess::Initialize(main_process, system, "main", 265 ASSERT(Kernel::KProcess::Initialize(main_process, system, "main",
257 Kernel::KProcess::ProcessType::Userland) 266 Kernel::KProcess::ProcessType::Userland, resource_limit)
258 .IsSuccess()); 267 .IsSuccess());
259 const auto [load_result, load_parameters] = app_loader->Load(*main_process, system); 268 const auto [load_result, load_parameters] = app_loader->Load(*main_process, system);
260 if (load_result != Loader::ResultStatus::Success) { 269 if (load_result != Loader::ResultStatus::Success) {
diff --git a/src/core/hle/kernel/k_process.cpp b/src/core/hle/kernel/k_process.cpp
index 85c506979..9233261cd 100644
--- a/src/core/hle/kernel/k_process.cpp
+++ b/src/core/hle/kernel/k_process.cpp
@@ -123,12 +123,11 @@ private:
123}; 123};
124 124
125ResultCode KProcess::Initialize(KProcess* process, Core::System& system, std::string process_name, 125ResultCode KProcess::Initialize(KProcess* process, Core::System& system, std::string process_name,
126 ProcessType type) { 126 ProcessType type, KResourceLimit* res_limit) {
127 auto& kernel = system.Kernel(); 127 auto& kernel = system.Kernel();
128 128
129 process->name = std::move(process_name); 129 process->name = std::move(process_name);
130 130 process->resource_limit = res_limit;
131 process->resource_limit = kernel.GetSystemResourceLimit();
132 process->status = ProcessStatus::Created; 131 process->status = ProcessStatus::Created;
133 process->program_id = 0; 132 process->program_id = 0;
134 process->process_id = type == ProcessType::KernelInternal ? kernel.CreateNewKernelProcessID() 133 process->process_id = type == ProcessType::KernelInternal ? kernel.CreateNewKernelProcessID()
@@ -143,9 +142,6 @@ ResultCode KProcess::Initialize(KProcess* process, Core::System& system, std::st
143 142
144 kernel.AppendNewProcess(process); 143 kernel.AppendNewProcess(process);
145 144
146 // Open a reference to the resource limit.
147 process->resource_limit->Open();
148
149 // Clear remaining fields. 145 // Clear remaining fields.
150 process->num_running_threads = 0; 146 process->num_running_threads = 0;
151 process->is_signaled = false; 147 process->is_signaled = false;
@@ -153,6 +149,9 @@ ResultCode KProcess::Initialize(KProcess* process, Core::System& system, std::st
153 process->is_suspended = false; 149 process->is_suspended = false;
154 process->schedule_count = 0; 150 process->schedule_count = 0;
155 151
152 // Open a reference to the resource limit.
153 process->resource_limit->Open();
154
156 return ResultSuccess; 155 return ResultSuccess;
157} 156}
158 157
diff --git a/src/core/hle/kernel/k_process.h b/src/core/hle/kernel/k_process.h
index 38b446350..cf1b67428 100644
--- a/src/core/hle/kernel/k_process.h
+++ b/src/core/hle/kernel/k_process.h
@@ -91,7 +91,7 @@ public:
91 static constexpr std::size_t RANDOM_ENTROPY_SIZE = 4; 91 static constexpr std::size_t RANDOM_ENTROPY_SIZE = 4;
92 92
93 static ResultCode Initialize(KProcess* process, Core::System& system, std::string process_name, 93 static ResultCode Initialize(KProcess* process, Core::System& system, std::string process_name,
94 ProcessType type); 94 ProcessType type, KResourceLimit* res_limit);
95 95
96 /// Gets a reference to the process' page table. 96 /// Gets a reference to the process' page table.
97 KPageTable& PageTable() { 97 KPageTable& PageTable() {
diff --git a/src/core/hle/service/kernel_helpers.cpp b/src/core/hle/service/kernel_helpers.cpp
index d0c7bc0ce..b8c2c6e51 100644
--- a/src/core/hle/service/kernel_helpers.cpp
+++ b/src/core/hle/service/kernel_helpers.cpp
@@ -3,7 +3,9 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "core/core.h" 5#include "core/core.h"
6#include "core/core_timing.h"
6#include "core/hle/kernel/k_event.h" 7#include "core/hle/kernel/k_event.h"
8#include "core/hle/kernel/k_memory_manager.h"
7#include "core/hle/kernel/k_process.h" 9#include "core/hle/kernel/k_process.h"
8#include "core/hle/kernel/k_readable_event.h" 10#include "core/hle/kernel/k_readable_event.h"
9#include "core/hle/kernel/k_resource_limit.h" 11#include "core/hle/kernel/k_resource_limit.h"
@@ -15,10 +17,21 @@ namespace Service::KernelHelpers {
15 17
16ServiceContext::ServiceContext(Core::System& system_, std::string name_) 18ServiceContext::ServiceContext(Core::System& system_, std::string name_)
17 : kernel(system_.Kernel()) { 19 : kernel(system_.Kernel()) {
20
21 // Create a resource limit for the process.
22 const auto physical_memory_size =
23 kernel.MemoryManager().GetSize(Kernel::KMemoryManager::Pool::System);
24 auto* resource_limit = Kernel::CreateResourceLimitForProcess(system_, physical_memory_size);
25
26 // Create the process.
18 process = Kernel::KProcess::Create(kernel); 27 process = Kernel::KProcess::Create(kernel);
19 ASSERT(Kernel::KProcess::Initialize(process, system_, std::move(name_), 28 ASSERT(Kernel::KProcess::Initialize(process, system_, std::move(name_),
20 Kernel::KProcess::ProcessType::Userland) 29 Kernel::KProcess::ProcessType::KernelInternal,
30 resource_limit)
21 .IsSuccess()); 31 .IsSuccess());
32
33 // Close reference to our resource limit, as the process opens one.
34 resource_limit->Close();
22} 35}
23 36
24ServiceContext::~ServiceContext() { 37ServiceContext::~ServiceContext() {