diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h index 0717eb225..9e29868ca 100644 --- a/src/core/hle/kernel/kernel.h +++ b/src/core/hle/kernel/kernel.h @@ -14,6 +14,7 @@ class AddressArbiter; class Event; class Mutex; class CodeSet; +class Process; enum class ResetType { OneShot, @@ -53,6 +54,8 @@ public: SharedPtr CreateMutex(bool initial_locked, std::string name = "Unknown"); SharedPtr CreateCodeSet(std::string name, u64 program_id); + + SharedPtr CreateProcess(SharedPtr code_set); }; } // namespace Kernel diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp index ac0908913..3e95cc6f7 100644 --- a/src/core/hle/kernel/process.cpp +++ b/src/core/hle/kernel/process.cpp @@ -34,8 +34,8 @@ CodeSet::~CodeSet() {} u32 Process::next_process_id; -SharedPtr Process::Create(SharedPtr code_set) { - SharedPtr process(new Process); +SharedPtr KernelSystem::CreateProcess(SharedPtr code_set) { + SharedPtr process(new Process(*this)); process->codeset = std::move(code_set); process->flags.raw = 0; @@ -304,7 +304,7 @@ ResultCode Process::LinearFree(VAddr target, u32 size) { return RESULT_SUCCESS; } -Kernel::Process::Process() {} +Kernel::Process::Process(KernelSystem& kernel) : kernel(kernel) {} Kernel::Process::~Process() {} void ClearProcessList() { diff --git a/src/core/hle/kernel/process.h b/src/core/hle/kernel/process.h index 3d6979598..edf4928ff 100644 --- a/src/core/hle/kernel/process.h +++ b/src/core/hle/kernel/process.h @@ -117,8 +117,6 @@ private: class Process final : public Object { public: - static SharedPtr Create(SharedPtr code_set); - std::string GetTypeName() const override { return "Process"; } @@ -201,8 +199,11 @@ public: ResultCode LinearFree(VAddr target, u32 size); private: - Process(); + explicit Process(Kernel::KernelSystem& kernel); ~Process() override; + + friend class KernelSystem; + KernelSystem& kernel; }; void ClearProcessList(); diff --git a/src/core/loader/3dsx.cpp b/src/core/loader/3dsx.cpp index 20adb1ac4..486270a59 100644 --- a/src/core/loader/3dsx.cpp +++ b/src/core/loader/3dsx.cpp @@ -267,7 +267,7 @@ ResultStatus AppLoader_THREEDSX::Load(Kernel::SharedPtr& proces return ResultStatus::Error; codeset->name = filename; - process = Kernel::Process::Create(std::move(codeset)); + process = Core::System::GetInstance().Kernel().CreateProcess(std::move(codeset)); process->svc_access_mask.set(); process->address_mappings = default_address_mappings; diff --git a/src/core/loader/elf.cpp b/src/core/loader/elf.cpp index 9064abff1..86abd7763 100644 --- a/src/core/loader/elf.cpp +++ b/src/core/loader/elf.cpp @@ -396,7 +396,7 @@ ResultStatus AppLoader_ELF::Load(Kernel::SharedPtr& process) { SharedPtr codeset = elf_reader.LoadInto(Memory::PROCESS_IMAGE_VADDR); codeset->name = filename; - process = Kernel::Process::Create(std::move(codeset)); + process = Core::System::GetInstance().Kernel().CreateProcess(std::move(codeset)); process->svc_access_mask.set(); process->address_mappings = default_address_mappings; diff --git a/src/core/loader/ncch.cpp b/src/core/loader/ncch.cpp index c609eb9bd..10260591a 100644 --- a/src/core/loader/ncch.cpp +++ b/src/core/loader/ncch.cpp @@ -104,7 +104,7 @@ ResultStatus AppLoader_NCCH::LoadExec(Kernel::SharedPtr& proces codeset->entrypoint = codeset->CodeSegment().addr; codeset->memory = std::make_shared>(std::move(code)); - process = Kernel::Process::Create(std::move(codeset)); + process = Core::System::GetInstance().Kernel().CreateProcess(std::move(codeset)); // Attach a resource limit to the process based on the resource limit category process->resource_limit = diff --git a/src/tests/core/arm/arm_test_common.cpp b/src/tests/core/arm/arm_test_common.cpp index fd6f43aff..4706c2512 100644 --- a/src/tests/core/arm/arm_test_common.cpp +++ b/src/tests/core/arm/arm_test_common.cpp @@ -19,7 +19,7 @@ TestEnvironment::TestEnvironment(bool mutable_memory_) CoreTiming::Init(); kernel = std::make_unique(0); - Kernel::g_current_process = Kernel::Process::Create(kernel->CreateCodeSet("", 0)); + Kernel::g_current_process = kernel->CreateProcess(kernel->CreateCodeSet("", 0)); page_table = &Kernel::g_current_process->vm_manager.page_table; page_table->pointers.fill(nullptr); diff --git a/src/tests/core/hle/kernel/hle_ipc.cpp b/src/tests/core/hle/kernel/hle_ipc.cpp index d9596c397..bb4c3b6ad 100644 --- a/src/tests/core/hle/kernel/hle_ipc.cpp +++ b/src/tests/core/hle/kernel/hle_ipc.cpp @@ -25,7 +25,7 @@ TEST_CASE("HLERequestContext::PopulateFromIncomingCommandBuffer", "[core][kernel auto session = std::get>(ServerSession::CreateSessionPair()); HLERequestContext context(std::move(session)); - auto process = Process::Create(kernel.CreateCodeSet("", 0)); + auto process = kernel.CreateProcess(kernel.CreateCodeSet("", 0)); HandleTable handle_table; SECTION("works with empty cmdbuf") { @@ -235,7 +235,7 @@ TEST_CASE("HLERequestContext::WriteToOutgoingCommandBuffer", "[core][kernel]") { auto session = std::get>(ServerSession::CreateSessionPair()); HLERequestContext context(std::move(session)); - auto process = Process::Create(kernel.CreateCodeSet("", 0)); + auto process = kernel.CreateProcess(kernel.CreateCodeSet("", 0)); HandleTable handle_table; auto* input = context.CommandBuffer(); u32_le output[IPC::COMMAND_BUFFER_LENGTH]; diff --git a/src/tests/core/memory/memory.cpp b/src/tests/core/memory/memory.cpp index 89dcd9c9a..d5f96e1f2 100644 --- a/src/tests/core/memory/memory.cpp +++ b/src/tests/core/memory/memory.cpp @@ -13,7 +13,7 @@ TEST_CASE("Memory::IsValidVirtualAddress", "[core][memory]") { CoreTiming::Init(); Kernel::KernelSystem kernel(0); SECTION("these regions should not be mapped on an empty process") { - auto process = Kernel::Process::Create(kernel.CreateCodeSet("", 0)); + auto process = kernel.CreateProcess(kernel.CreateCodeSet("", 0)); CHECK(Memory::IsValidVirtualAddress(*process, Memory::PROCESS_IMAGE_VADDR) == false); CHECK(Memory::IsValidVirtualAddress(*process, Memory::HEAP_VADDR) == false); CHECK(Memory::IsValidVirtualAddress(*process, Memory::LINEAR_HEAP_VADDR) == false); @@ -24,14 +24,14 @@ TEST_CASE("Memory::IsValidVirtualAddress", "[core][memory]") { } SECTION("CONFIG_MEMORY_VADDR and SHARED_PAGE_VADDR should be valid after mapping them") { - auto process = Kernel::Process::Create(kernel.CreateCodeSet("", 0)); + auto process = kernel.CreateProcess(kernel.CreateCodeSet("", 0)); Kernel::MapSharedPages(process->vm_manager); CHECK(Memory::IsValidVirtualAddress(*process, Memory::CONFIG_MEMORY_VADDR) == true); CHECK(Memory::IsValidVirtualAddress(*process, Memory::SHARED_PAGE_VADDR) == true); } SECTION("special regions should be valid after mapping them") { - auto process = Kernel::Process::Create(kernel.CreateCodeSet("", 0)); + auto process = kernel.CreateProcess(kernel.CreateCodeSet("", 0)); SECTION("VRAM") { Kernel::HandleSpecialMapping(process->vm_manager, {Memory::VRAM_VADDR, Memory::VRAM_SIZE, false, false}); @@ -46,7 +46,7 @@ TEST_CASE("Memory::IsValidVirtualAddress", "[core][memory]") { } SECTION("Unmapping a VAddr should make it invalid") { - auto process = Kernel::Process::Create(kernel.CreateCodeSet("", 0)); + auto process = kernel.CreateProcess(kernel.CreateCodeSet("", 0)); Kernel::MapSharedPages(process->vm_manager); process->vm_manager.UnmapRange(Memory::CONFIG_MEMORY_VADDR, Memory::CONFIG_MEMORY_SIZE); CHECK(Memory::IsValidVirtualAddress(*process, Memory::CONFIG_MEMORY_VADDR) == false);