diff options
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/k_client_port.cpp | 3 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_handle_table.h | 8 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_process.cpp | 36 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_process.h | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_session.cpp | 3 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_thread.cpp | 3 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 21 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.h | 3 |
8 files changed, 30 insertions, 49 deletions
diff --git a/src/core/hle/kernel/k_client_port.cpp b/src/core/hle/kernel/k_client_port.cpp index 11b1b977e..9b20c4d75 100644 --- a/src/core/hle/kernel/k_client_port.cpp +++ b/src/core/hle/kernel/k_client_port.cpp | |||
| @@ -58,9 +58,8 @@ Result KClientPort::CreateSession(KClientSession** out) { | |||
| 58 | KSession* session{}; | 58 | KSession* session{}; |
| 59 | 59 | ||
| 60 | // Reserve a new session from the resource limit. | 60 | // Reserve a new session from the resource limit. |
| 61 | //! FIXME: we are reserving this from the wrong resource limit! | ||
| 62 | KScopedResourceReservation session_reservation( | 61 | KScopedResourceReservation session_reservation( |
| 63 | m_kernel.ApplicationProcess()->GetResourceLimit(), LimitableResource::SessionCountMax); | 62 | GetCurrentProcessPointer(m_kernel)->GetResourceLimit(), LimitableResource::SessionCountMax); |
| 64 | R_UNLESS(session_reservation.Succeeded(), ResultLimitReached); | 63 | R_UNLESS(session_reservation.Succeeded(), ResultLimitReached); |
| 65 | 64 | ||
| 66 | // Allocate a session normally. | 65 | // Allocate a session normally. |
diff --git a/src/core/hle/kernel/k_handle_table.h b/src/core/hle/kernel/k_handle_table.h index d7660630c..4e6dcd66b 100644 --- a/src/core/hle/kernel/k_handle_table.h +++ b/src/core/hle/kernel/k_handle_table.h | |||
| @@ -30,7 +30,7 @@ public: | |||
| 30 | public: | 30 | public: |
| 31 | explicit KHandleTable(KernelCore& kernel) : m_kernel(kernel) {} | 31 | explicit KHandleTable(KernelCore& kernel) : m_kernel(kernel) {} |
| 32 | 32 | ||
| 33 | Result Initialize(s32 size) { | 33 | Result Initialize(KProcess* owner, s32 size) { |
| 34 | // Check that the table size is valid. | 34 | // Check that the table size is valid. |
| 35 | R_UNLESS(size <= static_cast<s32>(MaxTableSize), ResultOutOfMemory); | 35 | R_UNLESS(size <= static_cast<s32>(MaxTableSize), ResultOutOfMemory); |
| 36 | 36 | ||
| @@ -44,6 +44,7 @@ public: | |||
| 44 | m_next_linear_id = MinLinearId; | 44 | m_next_linear_id = MinLinearId; |
| 45 | m_count = 0; | 45 | m_count = 0; |
| 46 | m_free_head_index = -1; | 46 | m_free_head_index = -1; |
| 47 | m_owner = owner; | ||
| 47 | 48 | ||
| 48 | // Free all entries. | 49 | // Free all entries. |
| 49 | for (s32 i = 0; i < static_cast<s32>(m_table_size); ++i) { | 50 | for (s32 i = 0; i < static_cast<s32>(m_table_size); ++i) { |
| @@ -90,8 +91,8 @@ public: | |||
| 90 | // Handle pseudo-handles. | 91 | // Handle pseudo-handles. |
| 91 | if constexpr (std::derived_from<KProcess, T>) { | 92 | if constexpr (std::derived_from<KProcess, T>) { |
| 92 | if (handle == Svc::PseudoHandle::CurrentProcess) { | 93 | if (handle == Svc::PseudoHandle::CurrentProcess) { |
| 93 | //! FIXME: this is the wrong process! | 94 | // TODO: this should be the current process |
| 94 | auto* const cur_process = m_kernel.ApplicationProcess(); | 95 | auto* const cur_process = m_owner; |
| 95 | ASSERT(cur_process != nullptr); | 96 | ASSERT(cur_process != nullptr); |
| 96 | return cur_process; | 97 | return cur_process; |
| 97 | } | 98 | } |
| @@ -301,6 +302,7 @@ private: | |||
| 301 | 302 | ||
| 302 | private: | 303 | private: |
| 303 | KernelCore& m_kernel; | 304 | KernelCore& m_kernel; |
| 305 | KProcess* m_owner{}; | ||
| 304 | std::array<EntryInfo, MaxTableSize> m_entry_infos{}; | 306 | std::array<EntryInfo, MaxTableSize> m_entry_infos{}; |
| 305 | std::array<KAutoObject*, MaxTableSize> m_objects{}; | 307 | std::array<KAutoObject*, MaxTableSize> m_objects{}; |
| 306 | mutable KSpinLock m_lock; | 308 | mutable KSpinLock m_lock; |
diff --git a/src/core/hle/kernel/k_process.cpp b/src/core/hle/kernel/k_process.cpp index 905d141ea..2bfb71b3a 100644 --- a/src/core/hle/kernel/k_process.cpp +++ b/src/core/hle/kernel/k_process.cpp | |||
| @@ -306,12 +306,16 @@ Result KProcess::Initialize(const Svc::CreateProcessParameter& params, const KPa | |||
| 306 | False(params.flags & Svc::CreateProcessFlag::DisableDeviceAddressSpaceMerge); | 306 | False(params.flags & Svc::CreateProcessFlag::DisableDeviceAddressSpaceMerge); |
| 307 | R_TRY(m_page_table.Initialize(as_type, enable_aslr, enable_das_merge, !enable_aslr, pool, | 307 | R_TRY(m_page_table.Initialize(as_type, enable_aslr, enable_das_merge, !enable_aslr, pool, |
| 308 | params.code_address, params.code_num_pages * PageSize, | 308 | params.code_address, params.code_num_pages * PageSize, |
| 309 | m_system_resource, res_limit, this->GetMemory(), 0)); | 309 | m_system_resource, res_limit, m_memory, 0)); |
| 310 | } | 310 | } |
| 311 | ON_RESULT_FAILURE_2 { | 311 | ON_RESULT_FAILURE_2 { |
| 312 | m_page_table.Finalize(); | 312 | m_page_table.Finalize(); |
| 313 | }; | 313 | }; |
| 314 | 314 | ||
| 315 | // Ensure our memory is initialized. | ||
| 316 | m_memory.SetCurrentPageTable(*this); | ||
| 317 | m_memory.SetGPUDirtyManagers(m_dirty_memory_managers); | ||
| 318 | |||
| 315 | // Ensure we can insert the code region. | 319 | // Ensure we can insert the code region. |
| 316 | R_UNLESS(m_page_table.CanContain(params.code_address, params.code_num_pages * PageSize, | 320 | R_UNLESS(m_page_table.CanContain(params.code_address, params.code_num_pages * PageSize, |
| 317 | KMemoryState::Code), | 321 | KMemoryState::Code), |
| @@ -399,12 +403,16 @@ Result KProcess::Initialize(const Svc::CreateProcessParameter& params, | |||
| 399 | False(params.flags & Svc::CreateProcessFlag::DisableDeviceAddressSpaceMerge); | 403 | False(params.flags & Svc::CreateProcessFlag::DisableDeviceAddressSpaceMerge); |
| 400 | R_TRY(m_page_table.Initialize(as_type, enable_aslr, enable_das_merge, !enable_aslr, pool, | 404 | R_TRY(m_page_table.Initialize(as_type, enable_aslr, enable_das_merge, !enable_aslr, pool, |
| 401 | params.code_address, code_size, m_system_resource, res_limit, | 405 | params.code_address, code_size, m_system_resource, res_limit, |
| 402 | this->GetMemory(), aslr_space_start)); | 406 | m_memory, aslr_space_start)); |
| 403 | } | 407 | } |
| 404 | ON_RESULT_FAILURE_2 { | 408 | ON_RESULT_FAILURE_2 { |
| 405 | m_page_table.Finalize(); | 409 | m_page_table.Finalize(); |
| 406 | }; | 410 | }; |
| 407 | 411 | ||
| 412 | // Ensure our memory is initialized. | ||
| 413 | m_memory.SetCurrentPageTable(*this); | ||
| 414 | m_memory.SetGPUDirtyManagers(m_dirty_memory_managers); | ||
| 415 | |||
| 408 | // Ensure we can insert the code region. | 416 | // Ensure we can insert the code region. |
| 409 | R_UNLESS(m_page_table.CanContain(params.code_address, code_size, KMemoryState::Code), | 417 | R_UNLESS(m_page_table.CanContain(params.code_address, code_size, KMemoryState::Code), |
| 410 | ResultInvalidMemoryRegion); | 418 | ResultInvalidMemoryRegion); |
| @@ -1094,8 +1102,7 @@ void KProcess::UnpinThread(KThread* thread) { | |||
| 1094 | 1102 | ||
| 1095 | Result KProcess::GetThreadList(s32* out_num_threads, KProcessAddress out_thread_ids, | 1103 | Result KProcess::GetThreadList(s32* out_num_threads, KProcessAddress out_thread_ids, |
| 1096 | s32 max_out_count) { | 1104 | s32 max_out_count) { |
| 1097 | // TODO: use current memory reference | 1105 | auto& memory = this->GetMemory(); |
| 1098 | auto& memory = m_kernel.System().ApplicationMemory(); | ||
| 1099 | 1106 | ||
| 1100 | // Lock the list. | 1107 | // Lock the list. |
| 1101 | KScopedLightLock lk(m_list_lock); | 1108 | KScopedLightLock lk(m_list_lock); |
| @@ -1128,15 +1135,15 @@ void KProcess::Switch(KProcess* cur_process, KProcess* next_process) {} | |||
| 1128 | KProcess::KProcess(KernelCore& kernel) | 1135 | KProcess::KProcess(KernelCore& kernel) |
| 1129 | : KAutoObjectWithSlabHeapAndContainer(kernel), m_page_table{kernel}, m_state_lock{kernel}, | 1136 | : KAutoObjectWithSlabHeapAndContainer(kernel), m_page_table{kernel}, m_state_lock{kernel}, |
| 1130 | m_list_lock{kernel}, m_cond_var{kernel.System()}, m_address_arbiter{kernel.System()}, | 1137 | m_list_lock{kernel}, m_cond_var{kernel.System()}, m_address_arbiter{kernel.System()}, |
| 1131 | m_handle_table{kernel}, m_dirty_memory_managers{}, m_exclusive_monitor{}, | 1138 | m_handle_table{kernel}, m_dirty_memory_managers{}, |
| 1132 | m_memory{kernel.System()} {} | 1139 | m_exclusive_monitor{}, m_memory{kernel.System()} {} |
| 1133 | KProcess::~KProcess() = default; | 1140 | KProcess::~KProcess() = default; |
| 1134 | 1141 | ||
| 1135 | Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std::size_t code_size, | 1142 | Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std::size_t code_size, |
| 1136 | KProcessAddress aslr_space_start, bool is_hbl) { | 1143 | KProcessAddress aslr_space_start, bool is_hbl) { |
| 1137 | // Create a resource limit for the process. | 1144 | // Create a resource limit for the process. |
| 1138 | const auto physical_memory_size = | 1145 | const auto pool = static_cast<KMemoryManager::Pool>(metadata.GetPoolPartition()); |
| 1139 | m_kernel.MemoryManager().GetSize(Kernel::KMemoryManager::Pool::Application); | 1146 | const auto physical_memory_size = m_kernel.MemoryManager().GetSize(pool); |
| 1140 | auto* res_limit = | 1147 | auto* res_limit = |
| 1141 | Kernel::CreateResourceLimitForProcess(m_kernel.System(), physical_memory_size); | 1148 | Kernel::CreateResourceLimitForProcess(m_kernel.System(), physical_memory_size); |
| 1142 | 1149 | ||
| @@ -1147,8 +1154,10 @@ Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std: | |||
| 1147 | Svc::CreateProcessFlag flag{}; | 1154 | Svc::CreateProcessFlag flag{}; |
| 1148 | u64 code_address{}; | 1155 | u64 code_address{}; |
| 1149 | 1156 | ||
| 1150 | // We are an application. | 1157 | // Determine if we are an application. |
| 1151 | flag |= Svc::CreateProcessFlag::IsApplication; | 1158 | if (pool == KMemoryManager::Pool::Application) { |
| 1159 | flag |= Svc::CreateProcessFlag::IsApplication; | ||
| 1160 | } | ||
| 1152 | 1161 | ||
| 1153 | // If we are 64-bit, create as such. | 1162 | // If we are 64-bit, create as such. |
| 1154 | if (metadata.Is64BitProgram()) { | 1163 | if (metadata.Is64BitProgram()) { |
| @@ -1197,8 +1206,8 @@ Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std: | |||
| 1197 | std::memcpy(params.name.data(), name.data(), sizeof(params.name)); | 1206 | std::memcpy(params.name.data(), name.data(), sizeof(params.name)); |
| 1198 | 1207 | ||
| 1199 | // Initialize for application process. | 1208 | // Initialize for application process. |
| 1200 | R_TRY(this->Initialize(params, metadata.GetKernelCapabilities(), res_limit, | 1209 | R_TRY(this->Initialize(params, metadata.GetKernelCapabilities(), res_limit, pool, |
| 1201 | KMemoryManager::Pool::Application, aslr_space_start)); | 1210 | aslr_space_start)); |
| 1202 | 1211 | ||
| 1203 | // Assign remaining properties. | 1212 | // Assign remaining properties. |
| 1204 | m_is_hbl = is_hbl; | 1213 | m_is_hbl = is_hbl; |
| @@ -1239,9 +1248,6 @@ void KProcess::InitializeInterfaces() { | |||
| 1239 | m_exclusive_monitor = | 1248 | m_exclusive_monitor = |
| 1240 | Core::MakeExclusiveMonitor(this->GetMemory(), Core::Hardware::NUM_CPU_CORES); | 1249 | Core::MakeExclusiveMonitor(this->GetMemory(), Core::Hardware::NUM_CPU_CORES); |
| 1241 | 1250 | ||
| 1242 | this->GetMemory().SetCurrentPageTable(*this); | ||
| 1243 | this->GetMemory().SetGPUDirtyManagers(m_dirty_memory_managers); | ||
| 1244 | |||
| 1245 | #ifdef HAS_NCE | 1251 | #ifdef HAS_NCE |
| 1246 | if (this->Is64Bit() && Settings::IsNceEnabled()) { | 1252 | if (this->Is64Bit() && Settings::IsNceEnabled()) { |
| 1247 | for (size_t i = 0; i < Core::Hardware::NUM_CPU_CORES; i++) { | 1253 | for (size_t i = 0; i < Core::Hardware::NUM_CPU_CORES; i++) { |
diff --git a/src/core/hle/kernel/k_process.h b/src/core/hle/kernel/k_process.h index 53c0e3316..b5c6867a1 100644 --- a/src/core/hle/kernel/k_process.h +++ b/src/core/hle/kernel/k_process.h | |||
| @@ -552,7 +552,7 @@ private: | |||
| 552 | 552 | ||
| 553 | Result InitializeHandleTable(s32 size) { | 553 | Result InitializeHandleTable(s32 size) { |
| 554 | // Try to initialize the handle table. | 554 | // Try to initialize the handle table. |
| 555 | R_TRY(m_handle_table.Initialize(size)); | 555 | R_TRY(m_handle_table.Initialize(this, size)); |
| 556 | 556 | ||
| 557 | // We succeeded, so note that we did. | 557 | // We succeeded, so note that we did. |
| 558 | m_is_handle_table_initialized = true; | 558 | m_is_handle_table_initialized = true; |
diff --git a/src/core/hle/kernel/k_session.cpp b/src/core/hle/kernel/k_session.cpp index 44d7a8f02..4a1f6027e 100644 --- a/src/core/hle/kernel/k_session.cpp +++ b/src/core/hle/kernel/k_session.cpp | |||
| @@ -33,8 +33,7 @@ void KSession::Initialize(KClientPort* client_port, uintptr_t name) { | |||
| 33 | m_name = name; | 33 | m_name = name; |
| 34 | 34 | ||
| 35 | // Set our owner process. | 35 | // Set our owner process. |
| 36 | //! FIXME: this is the wrong process! | 36 | m_process = GetCurrentProcessPointer(m_kernel); |
| 37 | m_process = m_kernel.ApplicationProcess(); | ||
| 38 | m_process->Open(); | 37 | m_process->Open(); |
| 39 | 38 | ||
| 40 | // Set our port. | 39 | // Set our port. |
diff --git a/src/core/hle/kernel/k_thread.cpp b/src/core/hle/kernel/k_thread.cpp index 7d9a6e9cf..24394d222 100644 --- a/src/core/hle/kernel/k_thread.cpp +++ b/src/core/hle/kernel/k_thread.cpp | |||
| @@ -1422,8 +1422,7 @@ s32 GetCurrentCoreId(KernelCore& kernel) { | |||
| 1422 | } | 1422 | } |
| 1423 | 1423 | ||
| 1424 | Core::Memory::Memory& GetCurrentMemory(KernelCore& kernel) { | 1424 | Core::Memory::Memory& GetCurrentMemory(KernelCore& kernel) { |
| 1425 | // TODO: per-process memory | 1425 | return GetCurrentProcess(kernel).GetMemory(); |
| 1426 | return kernel.System().ApplicationMemory(); | ||
| 1427 | } | 1426 | } |
| 1428 | 1427 | ||
| 1429 | KScopedDisableDispatch::~KScopedDisableDispatch() { | 1428 | KScopedDisableDispatch::~KScopedDisableDispatch() { |
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 2efca27c2..c14d2d2f3 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp | |||
| @@ -68,8 +68,6 @@ struct KernelCore::Impl { | |||
| 68 | 68 | ||
| 69 | global_object_list_container = std::make_unique<KAutoObjectWithListContainer>(kernel); | 69 | global_object_list_container = std::make_unique<KAutoObjectWithListContainer>(kernel); |
| 70 | global_scheduler_context = std::make_unique<Kernel::GlobalSchedulerContext>(kernel); | 70 | global_scheduler_context = std::make_unique<Kernel::GlobalSchedulerContext>(kernel); |
| 71 | global_handle_table = std::make_unique<Kernel::KHandleTable>(kernel); | ||
| 72 | global_handle_table->Initialize(KHandleTable::MaxTableSize); | ||
| 73 | 71 | ||
| 74 | is_phantom_mode_for_singlecore = false; | 72 | is_phantom_mode_for_singlecore = false; |
| 75 | 73 | ||
| @@ -121,9 +119,6 @@ struct KernelCore::Impl { | |||
| 121 | next_user_process_id = KProcess::ProcessIdMin; | 119 | next_user_process_id = KProcess::ProcessIdMin; |
| 122 | next_thread_id = 1; | 120 | next_thread_id = 1; |
| 123 | 121 | ||
| 124 | global_handle_table->Finalize(); | ||
| 125 | global_handle_table.reset(); | ||
| 126 | |||
| 127 | preemption_event = nullptr; | 122 | preemption_event = nullptr; |
| 128 | 123 | ||
| 129 | // Cleanup persistent kernel objects | 124 | // Cleanup persistent kernel objects |
| @@ -787,10 +782,6 @@ struct KernelCore::Impl { | |||
| 787 | 782 | ||
| 788 | std::shared_ptr<Core::Timing::EventType> preemption_event; | 783 | std::shared_ptr<Core::Timing::EventType> preemption_event; |
| 789 | 784 | ||
| 790 | // This is the kernel's handle table or supervisor handle table which | ||
| 791 | // stores all the objects in place. | ||
| 792 | std::unique_ptr<KHandleTable> global_handle_table; | ||
| 793 | |||
| 794 | std::unique_ptr<KAutoObjectWithListContainer> global_object_list_container; | 785 | std::unique_ptr<KAutoObjectWithListContainer> global_object_list_container; |
| 795 | 786 | ||
| 796 | std::unique_ptr<KObjectNameGlobalData> object_name_global_data; | 787 | std::unique_ptr<KObjectNameGlobalData> object_name_global_data; |
| @@ -877,10 +868,6 @@ KResourceLimit* KernelCore::GetSystemResourceLimit() { | |||
| 877 | return impl->system_resource_limit; | 868 | return impl->system_resource_limit; |
| 878 | } | 869 | } |
| 879 | 870 | ||
| 880 | KScopedAutoObject<KThread> KernelCore::RetrieveThreadFromGlobalHandleTable(Handle handle) const { | ||
| 881 | return impl->global_handle_table->GetObject<KThread>(handle); | ||
| 882 | } | ||
| 883 | |||
| 884 | void KernelCore::AppendNewProcess(KProcess* process) { | 871 | void KernelCore::AppendNewProcess(KProcess* process) { |
| 885 | impl->process_list.push_back(process); | 872 | impl->process_list.push_back(process); |
| 886 | } | 873 | } |
| @@ -1017,14 +1004,6 @@ u64 KernelCore::CreateNewUserProcessID() { | |||
| 1017 | return impl->next_user_process_id++; | 1004 | return impl->next_user_process_id++; |
| 1018 | } | 1005 | } |
| 1019 | 1006 | ||
| 1020 | KHandleTable& KernelCore::GlobalHandleTable() { | ||
| 1021 | return *impl->global_handle_table; | ||
| 1022 | } | ||
| 1023 | |||
| 1024 | const KHandleTable& KernelCore::GlobalHandleTable() const { | ||
| 1025 | return *impl->global_handle_table; | ||
| 1026 | } | ||
| 1027 | |||
| 1028 | void KernelCore::RegisterCoreThread(std::size_t core_id) { | 1007 | void KernelCore::RegisterCoreThread(std::size_t core_id) { |
| 1029 | impl->RegisterCoreThread(core_id); | 1008 | impl->RegisterCoreThread(core_id); |
| 1030 | } | 1009 | } |
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h index fefd7aaba..5d4102145 100644 --- a/src/core/hle/kernel/kernel.h +++ b/src/core/hle/kernel/kernel.h | |||
| @@ -116,9 +116,6 @@ public: | |||
| 116 | /// Retrieves a shared pointer to the system resource limit instance. | 116 | /// Retrieves a shared pointer to the system resource limit instance. |
| 117 | KResourceLimit* GetSystemResourceLimit(); | 117 | KResourceLimit* GetSystemResourceLimit(); |
| 118 | 118 | ||
| 119 | /// Retrieves a shared pointer to a Thread instance within the thread wakeup handle table. | ||
| 120 | KScopedAutoObject<KThread> RetrieveThreadFromGlobalHandleTable(Handle handle) const; | ||
| 121 | |||
| 122 | /// Adds the given shared pointer to an internal list of active processes. | 119 | /// Adds the given shared pointer to an internal list of active processes. |
| 123 | void AppendNewProcess(KProcess* process); | 120 | void AppendNewProcess(KProcess* process); |
| 124 | 121 | ||