diff options
| author | 2022-02-21 12:33:17 -0800 | |
|---|---|---|
| committer | 2022-02-21 12:41:31 -0800 | |
| commit | a74fddc98f5c02b2d0be90c6d87ec3779300ee11 (patch) | |
| tree | b801352807790e645bca502bdfb0b9ad1195fef6 /src | |
| parent | core: hle: kernel: KEvent: Pass in owner KProcess on event creation. (diff) | |
| download | yuzu-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 'src')
| -rw-r--r-- | src/core/core.cpp | 11 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_process.cpp | 11 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_process.h | 2 | ||||
| -rw-r--r-- | src/core/hle/service/kernel_helpers.cpp | 15 |
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 | ||
| 125 | ResultCode KProcess::Initialize(KProcess* process, Core::System& system, std::string process_name, | 125 | ResultCode 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 | ||
| 16 | ServiceContext::ServiceContext(Core::System& system_, std::string name_) | 18 | ServiceContext::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 | ||
| 24 | ServiceContext::~ServiceContext() { | 37 | ServiceContext::~ServiceContext() { |