summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Zach Hilman2019-06-10 00:28:33 -0400
committerGravatar Zach Hilman2019-06-10 00:28:33 -0400
commitfc0bf91a969cddeb2f84c3e7c3a862fe98f1d438 (patch)
treed0773fbb4563392af144e5caf70a2c4c7664d58c /src
parentMerge pull request #2571 from lioncash/ref (diff)
downloadyuzu-fc0bf91a969cddeb2f84c3e7c3a862fe98f1d438.tar.gz
yuzu-fc0bf91a969cddeb2f84c3e7c3a862fe98f1d438.tar.xz
yuzu-fc0bf91a969cddeb2f84c3e7c3a862fe98f1d438.zip
kernel: Differentiate kernel and user processes when picking ID
This allows kernel internal type processes to be assigned IDs in the KIP range while userland processes are assigned in the user range.
Diffstat (limited to 'src')
-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 ff0721079..d808c0417 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -150,7 +150,8 @@ struct System::Impl {
150 } 150 }
151 151
152 telemetry_session->AddInitialInfo(*app_loader); 152 telemetry_session->AddInitialInfo(*app_loader);
153 auto main_process = Kernel::Process::Create(system, "main"); 153 auto main_process =
154 Kernel::Process::Create(system, "main", Kernel::Process::ProcessType::Userland);
154 const auto [load_result, load_parameters] = app_loader->Load(*main_process); 155 const auto [load_result, load_parameters] = app_loader->Load(*main_process);
155 if (load_result != Loader::ResultStatus::Success) { 156 if (load_result != Loader::ResultStatus::Success) {
156 LOG_CRITICAL(Core, "Failed to load ROM (Error {})!", static_cast<int>(load_result)); 157 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);