diff options
| -rw-r--r-- | src/core/core.cpp | 3 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 14 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.h | 5 | ||||
| -rw-r--r-- | src/core/hle/kernel/process.cpp | 6 | ||||
| -rw-r--r-- | src/core/hle/kernel/process.h | 8 | ||||
| -rw-r--r-- | src/tests/core/arm/arm_test_common.cpp | 3 |
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 | ||
| 229 | u64 KernelCore::CreateNewProcessID() { | 231 | u64 KernelCore::CreateNewKernelProcessID() { |
| 230 | return impl->next_process_id++; | 232 | return impl->next_kernel_process_id++; |
| 233 | } | ||
| 234 | |||
| 235 | u64 KernelCore::CreateNewUserProcessID() { | ||
| 236 | return impl->next_user_process_id++; | ||
| 231 | } | 237 | } |
| 232 | 238 | ||
| 233 | Core::Timing::EventType* KernelCore::ThreadWakeupCallbackEventType() const { | 239 | Core::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 | ||
| 51 | SharedPtr<Process> Process::Create(Core::System& system, std::string name) { | 51 | SharedPtr<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 { | |||
| 16 | TestEnvironment::TestEnvironment(bool mutable_memory_) | 16 | TestEnvironment::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); |