diff options
| author | 2021-04-03 22:22:36 -0700 | |
|---|---|---|
| committer | 2021-05-05 16:40:50 -0700 | |
| commit | 7ccbdd4d8d3dea7294d2cac38779cceea9745d52 (patch) | |
| tree | 3106289a5c5a6e4bf50bc09a548c8408aa29fbad /src/core/hle/kernel/process.cpp | |
| parent | hle: kernel: Refactor IPC interfaces to not use std::shared_ptr. (diff) | |
| download | yuzu-7ccbdd4d8d3dea7294d2cac38779cceea9745d52.tar.gz yuzu-7ccbdd4d8d3dea7294d2cac38779cceea9745d52.tar.xz yuzu-7ccbdd4d8d3dea7294d2cac38779cceea9745d52.zip | |
hle: kernel: Migrate KProcess to KAutoObject.
Diffstat (limited to 'src/core/hle/kernel/process.cpp')
| -rw-r--r-- | src/core/hle/kernel/process.cpp | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp index 796dca5ef..fe4558648 100644 --- a/src/core/hle/kernel/process.cpp +++ b/src/core/hle/kernel/process.cpp | |||
| @@ -49,6 +49,8 @@ void SetupMainThread(Core::System& system, Process& owner_process, u32 priority, | |||
| 49 | // Register 1 must be a handle to the main thread | 49 | // Register 1 must be a handle to the main thread |
| 50 | Handle thread_handle{}; | 50 | Handle thread_handle{}; |
| 51 | owner_process.GetHandleTable().Add(&thread_handle, thread); | 51 | owner_process.GetHandleTable().Add(&thread_handle, thread); |
| 52 | |||
| 53 | thread->SetName("main"); | ||
| 52 | thread->GetContext32().cpu_registers[0] = 0; | 54 | thread->GetContext32().cpu_registers[0] = 0; |
| 53 | thread->GetContext64().cpu_registers[0] = 0; | 55 | thread->GetContext64().cpu_registers[0] = 0; |
| 54 | thread->GetContext32().cpu_registers[1] = thread_handle; | 56 | thread->GetContext32().cpu_registers[1] = thread_handle; |
| @@ -115,10 +117,10 @@ private: | |||
| 115 | std::bitset<num_slot_entries> is_slot_used; | 117 | std::bitset<num_slot_entries> is_slot_used; |
| 116 | }; | 118 | }; |
| 117 | 119 | ||
| 118 | std::shared_ptr<Process> Process::Create(Core::System& system, std::string name, ProcessType type) { | 120 | ResultCode Process::Initialize(Process* process, Core::System& system, std::string name, |
| 121 | ProcessType type) { | ||
| 119 | auto& kernel = system.Kernel(); | 122 | auto& kernel = system.Kernel(); |
| 120 | 123 | ||
| 121 | std::shared_ptr<Process> process = std::make_shared<Process>(system); | ||
| 122 | process->name = std::move(name); | 124 | process->name = std::move(name); |
| 123 | 125 | ||
| 124 | process->resource_limit = kernel.GetSystemResourceLimit(); | 126 | process->resource_limit = kernel.GetSystemResourceLimit(); |
| @@ -127,6 +129,7 @@ std::shared_ptr<Process> Process::Create(Core::System& system, std::string name, | |||
| 127 | process->process_id = type == ProcessType::KernelInternal ? kernel.CreateNewKernelProcessID() | 129 | process->process_id = type == ProcessType::KernelInternal ? kernel.CreateNewKernelProcessID() |
| 128 | : kernel.CreateNewUserProcessID(); | 130 | : kernel.CreateNewUserProcessID(); |
| 129 | process->capabilities.InitializeForMetadatalessProcess(); | 131 | process->capabilities.InitializeForMetadatalessProcess(); |
| 132 | process->is_initialized = true; | ||
| 130 | 133 | ||
| 131 | std::mt19937 rng(Settings::values.rng_seed.GetValue().value_or(std::time(nullptr))); | 134 | std::mt19937 rng(Settings::values.rng_seed.GetValue().value_or(std::time(nullptr))); |
| 132 | std::uniform_int_distribution<u64> distribution; | 135 | std::uniform_int_distribution<u64> distribution; |
| @@ -134,7 +137,8 @@ std::shared_ptr<Process> Process::Create(Core::System& system, std::string name, | |||
| 134 | [&] { return distribution(rng); }); | 137 | [&] { return distribution(rng); }); |
| 135 | 138 | ||
| 136 | kernel.AppendNewProcess(process); | 139 | kernel.AppendNewProcess(process); |
| 137 | return process; | 140 | |
| 141 | return RESULT_SUCCESS; | ||
| 138 | } | 142 | } |
| 139 | 143 | ||
| 140 | std::shared_ptr<KResourceLimit> Process::GetResourceLimit() const { | 144 | std::shared_ptr<KResourceLimit> Process::GetResourceLimit() const { |
| @@ -332,7 +336,7 @@ void Process::Run(s32 main_thread_priority, u64 stack_size) { | |||
| 332 | 336 | ||
| 333 | ChangeStatus(ProcessStatus::Running); | 337 | ChangeStatus(ProcessStatus::Running); |
| 334 | 338 | ||
| 335 | SetupMainThread(system, *this, main_thread_priority, main_thread_stack_top); | 339 | SetupMainThread(kernel.System(), *this, main_thread_priority, main_thread_stack_top); |
| 336 | } | 340 | } |
| 337 | 341 | ||
| 338 | void Process::PrepareForTermination() { | 342 | void Process::PrepareForTermination() { |
| @@ -354,7 +358,7 @@ void Process::PrepareForTermination() { | |||
| 354 | } | 358 | } |
| 355 | }; | 359 | }; |
| 356 | 360 | ||
| 357 | stop_threads(system.GlobalSchedulerContext().GetThreadList()); | 361 | stop_threads(kernel.System().GlobalSchedulerContext().GetThreadList()); |
| 358 | 362 | ||
| 359 | FreeTLSRegion(tls_region_address); | 363 | FreeTLSRegion(tls_region_address); |
| 360 | tls_region_address = 0; | 364 | tls_region_address = 0; |
| @@ -381,7 +385,7 @@ static auto FindTLSPageWithAvailableSlots(std::vector<TLSPage>& tls_pages) { | |||
| 381 | } | 385 | } |
| 382 | 386 | ||
| 383 | VAddr Process::CreateTLSRegion() { | 387 | VAddr Process::CreateTLSRegion() { |
| 384 | KScopedSchedulerLock lock(system.Kernel()); | 388 | KScopedSchedulerLock lock(kernel); |
| 385 | if (auto tls_page_iter{FindTLSPageWithAvailableSlots(tls_pages)}; | 389 | if (auto tls_page_iter{FindTLSPageWithAvailableSlots(tls_pages)}; |
| 386 | tls_page_iter != tls_pages.cend()) { | 390 | tls_page_iter != tls_pages.cend()) { |
| 387 | return *tls_page_iter->ReserveSlot(); | 391 | return *tls_page_iter->ReserveSlot(); |
| @@ -392,7 +396,7 @@ VAddr Process::CreateTLSRegion() { | |||
| 392 | 396 | ||
| 393 | const VAddr start{page_table->GetKernelMapRegionStart()}; | 397 | const VAddr start{page_table->GetKernelMapRegionStart()}; |
| 394 | const VAddr size{page_table->GetKernelMapRegionEnd() - start}; | 398 | const VAddr size{page_table->GetKernelMapRegionEnd() - start}; |
| 395 | const PAddr tls_map_addr{system.DeviceMemory().GetPhysicalAddr(tls_page_ptr)}; | 399 | const PAddr tls_map_addr{kernel.System().DeviceMemory().GetPhysicalAddr(tls_page_ptr)}; |
| 396 | const VAddr tls_page_addr{page_table | 400 | const VAddr tls_page_addr{page_table |
| 397 | ->AllocateAndMapMemory(1, PageSize, true, start, size / PageSize, | 401 | ->AllocateAndMapMemory(1, PageSize, true, start, size / PageSize, |
| 398 | KMemoryState::ThreadLocal, | 402 | KMemoryState::ThreadLocal, |
| @@ -412,7 +416,7 @@ VAddr Process::CreateTLSRegion() { | |||
| 412 | } | 416 | } |
| 413 | 417 | ||
| 414 | void Process::FreeTLSRegion(VAddr tls_address) { | 418 | void Process::FreeTLSRegion(VAddr tls_address) { |
| 415 | KScopedSchedulerLock lock(system.Kernel()); | 419 | KScopedSchedulerLock lock(kernel); |
| 416 | const VAddr aligned_address = Common::AlignDown(tls_address, Core::Memory::PAGE_SIZE); | 420 | const VAddr aligned_address = Common::AlignDown(tls_address, Core::Memory::PAGE_SIZE); |
| 417 | auto iter = | 421 | auto iter = |
| 418 | std::find_if(tls_pages.begin(), tls_pages.end(), [aligned_address](const auto& page) { | 422 | std::find_if(tls_pages.begin(), tls_pages.end(), [aligned_address](const auto& page) { |
| @@ -433,7 +437,8 @@ void Process::LoadModule(CodeSet code_set, VAddr base_addr) { | |||
| 433 | page_table->SetCodeMemoryPermission(segment.addr + base_addr, segment.size, permission); | 437 | page_table->SetCodeMemoryPermission(segment.addr + base_addr, segment.size, permission); |
| 434 | }; | 438 | }; |
| 435 | 439 | ||
| 436 | system.Memory().WriteBlock(*this, base_addr, code_set.memory.data(), code_set.memory.size()); | 440 | kernel.System().Memory().WriteBlock(*this, base_addr, code_set.memory.data(), |
| 441 | code_set.memory.size()); | ||
| 437 | 442 | ||
| 438 | ReprotectSegment(code_set.CodeSegment(), KMemoryPermission::ReadAndExecute); | 443 | ReprotectSegment(code_set.CodeSegment(), KMemoryPermission::ReadAndExecute); |
| 439 | ReprotectSegment(code_set.RODataSegment(), KMemoryPermission::Read); | 444 | ReprotectSegment(code_set.RODataSegment(), KMemoryPermission::Read); |
| @@ -445,10 +450,10 @@ bool Process::IsSignaled() const { | |||
| 445 | return is_signaled; | 450 | return is_signaled; |
| 446 | } | 451 | } |
| 447 | 452 | ||
| 448 | Process::Process(Core::System& system) | 453 | Process::Process(KernelCore& kernel) |
| 449 | : KSynchronizationObject{system.Kernel()}, page_table{std::make_unique<KPageTable>(system)}, | 454 | : KAutoObjectWithSlabHeapAndContainer{kernel}, |
| 450 | handle_table{system.Kernel()}, address_arbiter{system}, condition_var{system}, | 455 | page_table{std::make_unique<KPageTable>(kernel.System())}, handle_table{kernel}, |
| 451 | state_lock{system.Kernel()}, system{system} {} | 456 | address_arbiter{kernel.System()}, condition_var{kernel.System()}, state_lock{kernel} {} |
| 452 | 457 | ||
| 453 | Process::~Process() = default; | 458 | Process::~Process() = default; |
| 454 | 459 | ||