summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/core.cpp3
-rw-r--r--src/core/hle/kernel/kernel.cpp14
-rw-r--r--src/core/hle/kernel/kernel.h5
-rw-r--r--src/core/hle/kernel/process.cpp6
-rw-r--r--src/core/hle/kernel/process.h8
-rw-r--r--src/tests/core/arm/arm_test_common.cpp3
6 files changed, 29 insertions, 10 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp
index b72a1fd6a..c00dfd33c 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -151,7 +151,8 @@ struct System::Impl {
151 } 151 }
152 152
153 telemetry_session->AddInitialInfo(*app_loader); 153 telemetry_session->AddInitialInfo(*app_loader);
154 auto main_process = Kernel::Process::Create(system, "main"); 154 auto main_process =
155 Kernel::Process::Create(system, "main", Kernel::Process::ProcessType::Userland);
155 const auto [load_result, load_parameters] = app_loader->Load(*main_process); 156 const auto [load_result, load_parameters] = app_loader->Load(*main_process);
156 if (load_result != Loader::ResultStatus::Success) { 157 if (load_result != Loader::ResultStatus::Success) {
157 LOG_CRITICAL(Core, "Failed to load ROM (Error {})!", static_cast<int>(load_result)); 158 LOG_CRITICAL(Core, "Failed to load ROM (Error {})!", static_cast<int>(load_result));
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index 757e5f21f..799e5e0d8 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -99,7 +99,8 @@ struct KernelCore::Impl {
99 99
100 void Shutdown() { 100 void Shutdown() {
101 next_object_id = 0; 101 next_object_id = 0;
102 next_process_id = Process::ProcessIDMin; 102 next_kernel_process_id = Process::InitialKIPIDMin;
103 next_user_process_id = Process::ProcessIDMin;
103 next_thread_id = 1; 104 next_thread_id = 1;
104 105
105 process_list.clear(); 106 process_list.clear();
@@ -132,7 +133,8 @@ struct KernelCore::Impl {
132 } 133 }
133 134
134 std::atomic<u32> next_object_id{0}; 135 std::atomic<u32> next_object_id{0};
135 std::atomic<u64> next_process_id{Process::ProcessIDMin}; 136 std::atomic<u64> next_kernel_process_id{Process::InitialKIPIDMin};
137 std::atomic<u64> next_user_process_id{Process::ProcessIDMin};
136 std::atomic<u64> next_thread_id{1}; 138 std::atomic<u64> next_thread_id{1};
137 139
138 // Lists all processes that exist in the current session. 140 // Lists all processes that exist in the current session.
@@ -226,8 +228,12 @@ u64 KernelCore::CreateNewThreadID() {
226 return impl->next_thread_id++; 228 return impl->next_thread_id++;
227} 229}
228 230
229u64 KernelCore::CreateNewProcessID() { 231u64 KernelCore::CreateNewKernelProcessID() {
230 return impl->next_process_id++; 232 return impl->next_kernel_process_id++;
233}
234
235u64 KernelCore::CreateNewUserProcessID() {
236 return impl->next_user_process_id++;
231} 237}
232 238
233Core::Timing::EventType* KernelCore::ThreadWakeupCallbackEventType() const { 239Core::Timing::EventType* KernelCore::ThreadWakeupCallbackEventType() const {
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h
index 6b8738599..0cc44ee76 100644
--- a/src/core/hle/kernel/kernel.h
+++ b/src/core/hle/kernel/kernel.h
@@ -96,7 +96,10 @@ private:
96 u32 CreateNewObjectID(); 96 u32 CreateNewObjectID();
97 97
98 /// Creates a new process ID, incrementing the internal process ID counter; 98 /// Creates a new process ID, incrementing the internal process ID counter;
99 u64 CreateNewProcessID(); 99 u64 CreateNewKernelProcessID();
100
101 /// Creates a new process ID, incrementing the internal process ID counter;
102 u64 CreateNewUserProcessID();
100 103
101 /// Creates a new thread ID, incrementing the internal thread ID counter. 104 /// Creates a new thread ID, incrementing the internal thread ID counter.
102 u64 CreateNewThreadID(); 105 u64 CreateNewThreadID();
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp
index 2b81a8d4f..7cfc513a1 100644
--- a/src/core/hle/kernel/process.cpp
+++ b/src/core/hle/kernel/process.cpp
@@ -48,7 +48,8 @@ void SetupMainThread(Process& owner_process, KernelCore& kernel, u32 priority) {
48} 48}
49} // Anonymous namespace 49} // Anonymous namespace
50 50
51SharedPtr<Process> Process::Create(Core::System& system, std::string name) { 51SharedPtr<Process> Process::Create(Core::System& system, std::string name,
52 Process::ProcessType type) {
52 auto& kernel = system.Kernel(); 53 auto& kernel = system.Kernel();
53 54
54 SharedPtr<Process> process(new Process(system)); 55 SharedPtr<Process> process(new Process(system));
@@ -56,7 +57,8 @@ SharedPtr<Process> Process::Create(Core::System& system, std::string name) {
56 process->resource_limit = kernel.GetSystemResourceLimit(); 57 process->resource_limit = kernel.GetSystemResourceLimit();
57 process->status = ProcessStatus::Created; 58 process->status = ProcessStatus::Created;
58 process->program_id = 0; 59 process->program_id = 0;
59 process->process_id = kernel.CreateNewProcessID(); 60 process->process_id = type == ProcessType::KernelInternal ? kernel.CreateNewKernelProcessID()
61 : kernel.CreateNewUserProcessID();
60 process->capabilities.InitializeForMetadatalessProcess(); 62 process->capabilities.InitializeForMetadatalessProcess();
61 63
62 std::mt19937 rng(Settings::values.rng_seed.value_or(0)); 64 std::mt19937 rng(Settings::values.rng_seed.value_or(0));
diff --git a/src/core/hle/kernel/process.h b/src/core/hle/kernel/process.h
index 29e016983..248fd3840 100644
--- a/src/core/hle/kernel/process.h
+++ b/src/core/hle/kernel/process.h
@@ -73,9 +73,15 @@ public:
73 ProcessIDMax = 0xFFFFFFFFFFFFFFFF, 73 ProcessIDMax = 0xFFFFFFFFFFFFFFFF,
74 }; 74 };
75 75
76 // Used to determine how process IDs are assigned.
77 enum class ProcessType {
78 KernelInternal,
79 Userland,
80 };
81
76 static constexpr std::size_t RANDOM_ENTROPY_SIZE = 4; 82 static constexpr std::size_t RANDOM_ENTROPY_SIZE = 4;
77 83
78 static SharedPtr<Process> Create(Core::System& system, std::string name); 84 static SharedPtr<Process> Create(Core::System& system, std::string name, ProcessType type);
79 85
80 std::string GetTypeName() const override { 86 std::string GetTypeName() const override {
81 return "Process"; 87 return "Process";
diff --git a/src/tests/core/arm/arm_test_common.cpp b/src/tests/core/arm/arm_test_common.cpp
index 58af41f6e..ac7ae3e52 100644
--- a/src/tests/core/arm/arm_test_common.cpp
+++ b/src/tests/core/arm/arm_test_common.cpp
@@ -16,7 +16,8 @@ namespace ArmTests {
16TestEnvironment::TestEnvironment(bool mutable_memory_) 16TestEnvironment::TestEnvironment(bool mutable_memory_)
17 : mutable_memory(mutable_memory_), 17 : mutable_memory(mutable_memory_),
18 test_memory(std::make_shared<TestMemory>(this)), kernel{Core::System::GetInstance()} { 18 test_memory(std::make_shared<TestMemory>(this)), kernel{Core::System::GetInstance()} {
19 auto process = Kernel::Process::Create(Core::System::GetInstance(), ""); 19 auto process = Kernel::Process::Create(Core::System::GetInstance(), "",
20 Kernel::Process::ProcessType::Userland);
20 page_table = &process->VMManager().page_table; 21 page_table = &process->VMManager().page_table;
21 22
22 std::fill(page_table->pointers.begin(), page_table->pointers.end(), nullptr); 23 std::fill(page_table->pointers.begin(), page_table->pointers.end(), nullptr);