summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/process.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2021-04-03 22:22:36 -0700
committerGravatar bunnei2021-05-05 16:40:50 -0700
commit7ccbdd4d8d3dea7294d2cac38779cceea9745d52 (patch)
tree3106289a5c5a6e4bf50bc09a548c8408aa29fbad /src/core/hle/kernel/process.cpp
parenthle: kernel: Refactor IPC interfaces to not use std::shared_ptr. (diff)
downloadyuzu-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.cpp31
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
118std::shared_ptr<Process> Process::Create(Core::System& system, std::string name, ProcessType type) { 120ResultCode 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
140std::shared_ptr<KResourceLimit> Process::GetResourceLimit() const { 144std::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
338void Process::PrepareForTermination() { 342void 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
383VAddr Process::CreateTLSRegion() { 387VAddr 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
414void Process::FreeTLSRegion(VAddr tls_address) { 418void 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
448Process::Process(Core::System& system) 453Process::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
453Process::~Process() = default; 458Process::~Process() = default;
454 459