diff options
| author | 2023-03-27 12:16:40 -0400 | |
|---|---|---|
| committer | 2023-03-27 12:16:40 -0400 | |
| commit | 0661f5ccd1704935dc9c49521a79cc26832db3b0 (patch) | |
| tree | e0923dd40e8dd0f6ec92a2de7722f911bd26c514 /src/core/hle/kernel | |
| parent | Merge pull request #9995 from german77/plain (diff) | |
| parent | memory: rename global memory references to application memory (diff) | |
| download | yuzu-0661f5ccd1704935dc9c49521a79cc26832db3b0.tar.gz yuzu-0661f5ccd1704935dc9c49521a79cc26832db3b0.tar.xz yuzu-0661f5ccd1704935dc9c49521a79cc26832db3b0.zip | |
Merge pull request #9984 from liamwhite/global-memory
memory: rename global memory references to application memory
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/k_address_arbiter.cpp | 10 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_condition_variable.cpp | 18 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_page_table.cpp | 54 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_page_table.h | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_process.cpp | 22 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_process.h | 15 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_server_session.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_thread.cpp | 11 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_thread.h | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc/svc_cache.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc/svc_debug_string.cpp | 3 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc/svc_exception.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc/svc_ipc.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc/svc_port.cpp | 6 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc/svc_process.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc/svc_query_memory.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc/svc_synchronization.cpp | 3 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc/svc_thread.cpp | 4 |
19 files changed, 100 insertions, 76 deletions
diff --git a/src/core/hle/kernel/k_address_arbiter.cpp b/src/core/hle/kernel/k_address_arbiter.cpp index 274928dcf..08c254028 100644 --- a/src/core/hle/kernel/k_address_arbiter.cpp +++ b/src/core/hle/kernel/k_address_arbiter.cpp | |||
| @@ -21,8 +21,8 @@ KAddressArbiter::~KAddressArbiter() = default; | |||
| 21 | 21 | ||
| 22 | namespace { | 22 | namespace { |
| 23 | 23 | ||
| 24 | bool ReadFromUser(Core::System& system, s32* out, KProcessAddress address) { | 24 | bool ReadFromUser(KernelCore& kernel, s32* out, KProcessAddress address) { |
| 25 | *out = system.Memory().Read32(GetInteger(address)); | 25 | *out = GetCurrentMemory(kernel).Read32(GetInteger(address)); |
| 26 | return true; | 26 | return true; |
| 27 | } | 27 | } |
| 28 | 28 | ||
| @@ -209,7 +209,7 @@ Result KAddressArbiter::SignalAndModifyByWaitingCountIfEqual(uint64_t addr, s32 | |||
| 209 | if (value != new_value) { | 209 | if (value != new_value) { |
| 210 | succeeded = UpdateIfEqual(m_system, std::addressof(user_value), addr, value, new_value); | 210 | succeeded = UpdateIfEqual(m_system, std::addressof(user_value), addr, value, new_value); |
| 211 | } else { | 211 | } else { |
| 212 | succeeded = ReadFromUser(m_system, std::addressof(user_value), addr); | 212 | succeeded = ReadFromUser(m_kernel, std::addressof(user_value), addr); |
| 213 | } | 213 | } |
| 214 | 214 | ||
| 215 | R_UNLESS(succeeded, ResultInvalidCurrentMemory); | 215 | R_UNLESS(succeeded, ResultInvalidCurrentMemory); |
| @@ -252,7 +252,7 @@ Result KAddressArbiter::WaitIfLessThan(uint64_t addr, s32 value, bool decrement, | |||
| 252 | if (decrement) { | 252 | if (decrement) { |
| 253 | succeeded = DecrementIfLessThan(m_system, std::addressof(user_value), addr, value); | 253 | succeeded = DecrementIfLessThan(m_system, std::addressof(user_value), addr, value); |
| 254 | } else { | 254 | } else { |
| 255 | succeeded = ReadFromUser(m_system, std::addressof(user_value), addr); | 255 | succeeded = ReadFromUser(m_kernel, std::addressof(user_value), addr); |
| 256 | } | 256 | } |
| 257 | 257 | ||
| 258 | if (!succeeded) { | 258 | if (!succeeded) { |
| @@ -303,7 +303,7 @@ Result KAddressArbiter::WaitIfEqual(uint64_t addr, s32 value, s64 timeout) { | |||
| 303 | 303 | ||
| 304 | // Read the value from userspace. | 304 | // Read the value from userspace. |
| 305 | s32 user_value{}; | 305 | s32 user_value{}; |
| 306 | if (!ReadFromUser(m_system, std::addressof(user_value), addr)) { | 306 | if (!ReadFromUser(m_kernel, std::addressof(user_value), addr)) { |
| 307 | slp.CancelSleep(); | 307 | slp.CancelSleep(); |
| 308 | R_THROW(ResultInvalidCurrentMemory); | 308 | R_THROW(ResultInvalidCurrentMemory); |
| 309 | } | 309 | } |
diff --git a/src/core/hle/kernel/k_condition_variable.cpp b/src/core/hle/kernel/k_condition_variable.cpp index c6634313f..73017cf99 100644 --- a/src/core/hle/kernel/k_condition_variable.cpp +++ b/src/core/hle/kernel/k_condition_variable.cpp | |||
| @@ -18,13 +18,13 @@ namespace Kernel { | |||
| 18 | 18 | ||
| 19 | namespace { | 19 | namespace { |
| 20 | 20 | ||
| 21 | bool ReadFromUser(Core::System& system, u32* out, KProcessAddress address) { | 21 | bool ReadFromUser(KernelCore& kernel, u32* out, KProcessAddress address) { |
| 22 | *out = system.Memory().Read32(GetInteger(address)); | 22 | *out = GetCurrentMemory(kernel).Read32(GetInteger(address)); |
| 23 | return true; | 23 | return true; |
| 24 | } | 24 | } |
| 25 | 25 | ||
| 26 | bool WriteToUser(Core::System& system, KProcessAddress address, const u32* p) { | 26 | bool WriteToUser(KernelCore& kernel, KProcessAddress address, const u32* p) { |
| 27 | system.Memory().Write32(GetInteger(address), *p); | 27 | GetCurrentMemory(kernel).Write32(GetInteger(address), *p); |
| 28 | return true; | 28 | return true; |
| 29 | } | 29 | } |
| 30 | 30 | ||
| @@ -128,7 +128,7 @@ Result KConditionVariable::SignalToAddress(KProcessAddress addr) { | |||
| 128 | 128 | ||
| 129 | // Write the value to userspace. | 129 | // Write the value to userspace. |
| 130 | Result result{ResultSuccess}; | 130 | Result result{ResultSuccess}; |
| 131 | if (WriteToUser(m_system, addr, std::addressof(next_value))) [[likely]] { | 131 | if (WriteToUser(m_kernel, addr, std::addressof(next_value))) [[likely]] { |
| 132 | result = ResultSuccess; | 132 | result = ResultSuccess; |
| 133 | } else { | 133 | } else { |
| 134 | result = ResultInvalidCurrentMemory; | 134 | result = ResultInvalidCurrentMemory; |
| @@ -157,7 +157,7 @@ Result KConditionVariable::WaitForAddress(Handle handle, KProcessAddress addr, u | |||
| 157 | 157 | ||
| 158 | // Read the tag from userspace. | 158 | // Read the tag from userspace. |
| 159 | u32 test_tag{}; | 159 | u32 test_tag{}; |
| 160 | R_UNLESS(ReadFromUser(m_system, std::addressof(test_tag), addr), | 160 | R_UNLESS(ReadFromUser(m_kernel, std::addressof(test_tag), addr), |
| 161 | ResultInvalidCurrentMemory); | 161 | ResultInvalidCurrentMemory); |
| 162 | 162 | ||
| 163 | // If the tag isn't the handle (with wait mask), we're done. | 163 | // If the tag isn't the handle (with wait mask), we're done. |
| @@ -257,7 +257,7 @@ void KConditionVariable::Signal(u64 cv_key, s32 count) { | |||
| 257 | // If we have no waiters, clear the has waiter flag. | 257 | // If we have no waiters, clear the has waiter flag. |
| 258 | if (it == m_tree.end() || it->GetConditionVariableKey() != cv_key) { | 258 | if (it == m_tree.end() || it->GetConditionVariableKey() != cv_key) { |
| 259 | const u32 has_waiter_flag{}; | 259 | const u32 has_waiter_flag{}; |
| 260 | WriteToUser(m_system, cv_key, std::addressof(has_waiter_flag)); | 260 | WriteToUser(m_kernel, cv_key, std::addressof(has_waiter_flag)); |
| 261 | } | 261 | } |
| 262 | } | 262 | } |
| 263 | } | 263 | } |
| @@ -301,12 +301,12 @@ Result KConditionVariable::Wait(KProcessAddress addr, u64 key, u32 value, s64 ti | |||
| 301 | // Write to the cv key. | 301 | // Write to the cv key. |
| 302 | { | 302 | { |
| 303 | const u32 has_waiter_flag = 1; | 303 | const u32 has_waiter_flag = 1; |
| 304 | WriteToUser(m_system, key, std::addressof(has_waiter_flag)); | 304 | WriteToUser(m_kernel, key, std::addressof(has_waiter_flag)); |
| 305 | std::atomic_thread_fence(std::memory_order_seq_cst); | 305 | std::atomic_thread_fence(std::memory_order_seq_cst); |
| 306 | } | 306 | } |
| 307 | 307 | ||
| 308 | // Write the value to userspace. | 308 | // Write the value to userspace. |
| 309 | if (!WriteToUser(m_system, addr, std::addressof(next_value))) { | 309 | if (!WriteToUser(m_kernel, addr, std::addressof(next_value))) { |
| 310 | slp.CancelSleep(); | 310 | slp.CancelSleep(); |
| 311 | R_THROW(ResultInvalidCurrentMemory); | 311 | R_THROW(ResultInvalidCurrentMemory); |
| 312 | } | 312 | } |
diff --git a/src/core/hle/kernel/k_page_table.cpp b/src/core/hle/kernel/k_page_table.cpp index cb39387ea..02b5cada4 100644 --- a/src/core/hle/kernel/k_page_table.cpp +++ b/src/core/hle/kernel/k_page_table.cpp | |||
| @@ -108,7 +108,8 @@ Result KPageTable::InitializeForProcess(FileSys::ProgramAddressSpaceType as_type | |||
| 108 | bool enable_das_merge, bool from_back, | 108 | bool enable_das_merge, bool from_back, |
| 109 | KMemoryManager::Pool pool, KProcessAddress code_addr, | 109 | KMemoryManager::Pool pool, KProcessAddress code_addr, |
| 110 | size_t code_size, KSystemResource* system_resource, | 110 | size_t code_size, KSystemResource* system_resource, |
| 111 | KResourceLimit* resource_limit) { | 111 | KResourceLimit* resource_limit, |
| 112 | Core::Memory::Memory& memory) { | ||
| 112 | 113 | ||
| 113 | const auto GetSpaceStart = [this](KAddressSpaceInfo::Type type) { | 114 | const auto GetSpaceStart = [this](KAddressSpaceInfo::Type type) { |
| 114 | return KAddressSpaceInfo::GetAddressSpaceStart(m_address_space_width, type); | 115 | return KAddressSpaceInfo::GetAddressSpaceStart(m_address_space_width, type); |
| @@ -117,6 +118,9 @@ Result KPageTable::InitializeForProcess(FileSys::ProgramAddressSpaceType as_type | |||
| 117 | return KAddressSpaceInfo::GetAddressSpaceSize(m_address_space_width, type); | 118 | return KAddressSpaceInfo::GetAddressSpaceSize(m_address_space_width, type); |
| 118 | }; | 119 | }; |
| 119 | 120 | ||
| 121 | // Set the tracking memory | ||
| 122 | m_memory = std::addressof(memory); | ||
| 123 | |||
| 120 | // Set our width and heap/alias sizes | 124 | // Set our width and heap/alias sizes |
| 121 | m_address_space_width = GetAddressSpaceWidthFromType(as_type); | 125 | m_address_space_width = GetAddressSpaceWidthFromType(as_type); |
| 122 | const KProcessAddress start = 0; | 126 | const KProcessAddress start = 0; |
| @@ -334,10 +338,10 @@ Result KPageTable::InitializeForProcess(FileSys::ProgramAddressSpaceType as_type | |||
| 334 | 338 | ||
| 335 | void KPageTable::Finalize() { | 339 | void KPageTable::Finalize() { |
| 336 | // Finalize memory blocks. | 340 | // Finalize memory blocks. |
| 337 | m_memory_block_manager.Finalize( | 341 | m_memory_block_manager.Finalize(m_memory_block_slab_manager, |
| 338 | m_memory_block_slab_manager, [&](KProcessAddress addr, u64 size) { | 342 | [&](KProcessAddress addr, u64 size) { |
| 339 | m_system.Memory().UnmapRegion(*m_page_table_impl, addr, size); | 343 | m_memory->UnmapRegion(*m_page_table_impl, addr, size); |
| 340 | }); | 344 | }); |
| 341 | 345 | ||
| 342 | // Release any insecure mapped memory. | 346 | // Release any insecure mapped memory. |
| 343 | if (m_mapped_insecure_memory) { | 347 | if (m_mapped_insecure_memory) { |
| @@ -1010,23 +1014,22 @@ Result KPageTable::SetupForIpcServer(KProcessAddress* out_addr, size_t size, | |||
| 1010 | clear_size = 0; | 1014 | clear_size = 0; |
| 1011 | } | 1015 | } |
| 1012 | 1016 | ||
| 1013 | std::memset(m_system.Memory().GetPointer<void>(GetInteger(start_partial_virt)), | 1017 | std::memset(m_memory->GetPointer<void>(GetInteger(start_partial_virt)), fill_val, |
| 1014 | fill_val, partial_offset); | 1018 | partial_offset); |
| 1015 | std::memcpy( | 1019 | std::memcpy( |
| 1016 | m_system.Memory().GetPointer<void>(GetInteger(start_partial_virt) + partial_offset), | 1020 | m_memory->GetPointer<void>(GetInteger(start_partial_virt) + partial_offset), |
| 1017 | m_system.Memory().GetPointer<void>( | 1021 | m_memory->GetPointer<void>(GetInteger(GetHeapVirtualAddress( |
| 1018 | GetInteger( | 1022 | m_system.Kernel().MemoryLayout(), cur_block_addr)) + |
| 1019 | GetHeapVirtualAddress(m_system.Kernel().MemoryLayout(), cur_block_addr)) + | 1023 | partial_offset), |
| 1020 | partial_offset), | ||
| 1021 | copy_size); | 1024 | copy_size); |
| 1022 | if (clear_size > 0) { | 1025 | if (clear_size > 0) { |
| 1023 | std::memset(m_system.Memory().GetPointer<void>(GetInteger(start_partial_virt) + | 1026 | std::memset(m_memory->GetPointer<void>(GetInteger(start_partial_virt) + |
| 1024 | partial_offset + copy_size), | 1027 | partial_offset + copy_size), |
| 1025 | fill_val, clear_size); | 1028 | fill_val, clear_size); |
| 1026 | } | 1029 | } |
| 1027 | } else { | 1030 | } else { |
| 1028 | std::memset(m_system.Memory().GetPointer<void>(GetInteger(start_partial_virt)), | 1031 | std::memset(m_memory->GetPointer<void>(GetInteger(start_partial_virt)), fill_val, |
| 1029 | fill_val, PageSize); | 1032 | PageSize); |
| 1030 | } | 1033 | } |
| 1031 | 1034 | ||
| 1032 | // Map the page. | 1035 | // Map the page. |
| @@ -1099,15 +1102,14 @@ Result KPageTable::SetupForIpcServer(KProcessAddress* out_addr, size_t size, | |||
| 1099 | GetHeapVirtualAddress(m_system.Kernel().MemoryLayout(), end_partial_page); | 1102 | GetHeapVirtualAddress(m_system.Kernel().MemoryLayout(), end_partial_page); |
| 1100 | if (send) { | 1103 | if (send) { |
| 1101 | const size_t copy_size = src_end - mapping_src_end; | 1104 | const size_t copy_size = src_end - mapping_src_end; |
| 1102 | std::memcpy(m_system.Memory().GetPointer<void>(GetInteger(end_partial_virt)), | 1105 | std::memcpy(m_memory->GetPointer<void>(GetInteger(end_partial_virt)), |
| 1103 | m_system.Memory().GetPointer<void>(GetInteger(GetHeapVirtualAddress( | 1106 | m_memory->GetPointer<void>(GetInteger(GetHeapVirtualAddress( |
| 1104 | m_system.Kernel().MemoryLayout(), cur_block_addr))), | 1107 | m_system.Kernel().MemoryLayout(), cur_block_addr))), |
| 1105 | copy_size); | 1108 | copy_size); |
| 1106 | std::memset( | 1109 | std::memset(m_memory->GetPointer<void>(GetInteger(end_partial_virt) + copy_size), |
| 1107 | m_system.Memory().GetPointer<void>(GetInteger(end_partial_virt) + copy_size), | 1110 | fill_val, PageSize - copy_size); |
| 1108 | fill_val, PageSize - copy_size); | ||
| 1109 | } else { | 1111 | } else { |
| 1110 | std::memset(m_system.Memory().GetPointer<void>(GetInteger(end_partial_virt)), fill_val, | 1112 | std::memset(m_memory->GetPointer<void>(GetInteger(end_partial_virt)), fill_val, |
| 1111 | PageSize); | 1113 | PageSize); |
| 1112 | } | 1114 | } |
| 1113 | 1115 | ||
| @@ -2800,7 +2802,7 @@ Result KPageTable::SetHeapSize(u64* out, size_t size) { | |||
| 2800 | 2802 | ||
| 2801 | // Clear all the newly allocated pages. | 2803 | // Clear all the newly allocated pages. |
| 2802 | for (size_t cur_page = 0; cur_page < num_pages; ++cur_page) { | 2804 | for (size_t cur_page = 0; cur_page < num_pages; ++cur_page) { |
| 2803 | std::memset(m_system.Memory().GetPointer(m_current_heap_end + (cur_page * PageSize)), 0, | 2805 | std::memset(m_memory->GetPointer(m_current_heap_end + (cur_page * PageSize)), 0, |
| 2804 | PageSize); | 2806 | PageSize); |
| 2805 | } | 2807 | } |
| 2806 | 2808 | ||
| @@ -3006,7 +3008,7 @@ Result KPageTable::Operate(KProcessAddress addr, size_t num_pages, const KPageGr | |||
| 3006 | const size_t size{node.GetNumPages() * PageSize}; | 3008 | const size_t size{node.GetNumPages() * PageSize}; |
| 3007 | 3009 | ||
| 3008 | // Map the pages. | 3010 | // Map the pages. |
| 3009 | m_system.Memory().MapMemoryRegion(*m_page_table_impl, addr, size, node.GetAddress()); | 3011 | m_memory->MapMemoryRegion(*m_page_table_impl, addr, size, node.GetAddress()); |
| 3010 | 3012 | ||
| 3011 | addr += size; | 3013 | addr += size; |
| 3012 | } | 3014 | } |
| @@ -3039,14 +3041,14 @@ Result KPageTable::Operate(KProcessAddress addr, size_t num_pages, KMemoryPermis | |||
| 3039 | SCOPE_EXIT({ pages_to_close.CloseAndReset(); }); | 3041 | SCOPE_EXIT({ pages_to_close.CloseAndReset(); }); |
| 3040 | 3042 | ||
| 3041 | this->AddRegionToPages(addr, num_pages, pages_to_close); | 3043 | this->AddRegionToPages(addr, num_pages, pages_to_close); |
| 3042 | m_system.Memory().UnmapRegion(*m_page_table_impl, addr, num_pages * PageSize); | 3044 | m_memory->UnmapRegion(*m_page_table_impl, addr, num_pages * PageSize); |
| 3043 | break; | 3045 | break; |
| 3044 | } | 3046 | } |
| 3045 | case OperationType::MapFirst: | 3047 | case OperationType::MapFirst: |
| 3046 | case OperationType::Map: { | 3048 | case OperationType::Map: { |
| 3047 | ASSERT(map_addr); | 3049 | ASSERT(map_addr); |
| 3048 | ASSERT(Common::IsAligned(GetInteger(map_addr), PageSize)); | 3050 | ASSERT(Common::IsAligned(GetInteger(map_addr), PageSize)); |
| 3049 | m_system.Memory().MapMemoryRegion(*m_page_table_impl, addr, num_pages * PageSize, map_addr); | 3051 | m_memory->MapMemoryRegion(*m_page_table_impl, addr, num_pages * PageSize, map_addr); |
| 3050 | 3052 | ||
| 3051 | // Open references to pages, if we should. | 3053 | // Open references to pages, if we should. |
| 3052 | if (IsHeapPhysicalAddress(m_kernel.MemoryLayout(), map_addr)) { | 3054 | if (IsHeapPhysicalAddress(m_kernel.MemoryLayout(), map_addr)) { |
diff --git a/src/core/hle/kernel/k_page_table.h b/src/core/hle/kernel/k_page_table.h index 1917b2a98..022d15f35 100644 --- a/src/core/hle/kernel/k_page_table.h +++ b/src/core/hle/kernel/k_page_table.h | |||
| @@ -66,7 +66,8 @@ public: | |||
| 66 | Result InitializeForProcess(FileSys::ProgramAddressSpaceType as_type, bool enable_aslr, | 66 | Result InitializeForProcess(FileSys::ProgramAddressSpaceType as_type, bool enable_aslr, |
| 67 | bool enable_das_merge, bool from_back, KMemoryManager::Pool pool, | 67 | bool enable_das_merge, bool from_back, KMemoryManager::Pool pool, |
| 68 | KProcessAddress code_addr, size_t code_size, | 68 | KProcessAddress code_addr, size_t code_size, |
| 69 | KSystemResource* system_resource, KResourceLimit* resource_limit); | 69 | KSystemResource* system_resource, KResourceLimit* resource_limit, |
| 70 | Core::Memory::Memory& memory); | ||
| 70 | 71 | ||
| 71 | void Finalize(); | 72 | void Finalize(); |
| 72 | 73 | ||
| @@ -546,6 +547,7 @@ private: | |||
| 546 | 547 | ||
| 547 | Core::System& m_system; | 548 | Core::System& m_system; |
| 548 | KernelCore& m_kernel; | 549 | KernelCore& m_kernel; |
| 550 | Core::Memory::Memory* m_memory{}; | ||
| 549 | }; | 551 | }; |
| 550 | 552 | ||
| 551 | } // namespace Kernel | 553 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/k_process.cpp b/src/core/hle/kernel/k_process.cpp index 53f8139f3..efe86ad27 100644 --- a/src/core/hle/kernel/k_process.cpp +++ b/src/core/hle/kernel/k_process.cpp | |||
| @@ -367,8 +367,8 @@ Result KProcess::LoadFromMetadata(const FileSys::ProgramMetadata& metadata, std: | |||
| 367 | // Initialize process address space | 367 | // Initialize process address space |
| 368 | if (const Result result{m_page_table.InitializeForProcess( | 368 | if (const Result result{m_page_table.InitializeForProcess( |
| 369 | metadata.GetAddressSpaceType(), false, false, false, KMemoryManager::Pool::Application, | 369 | metadata.GetAddressSpaceType(), false, false, false, KMemoryManager::Pool::Application, |
| 370 | 0x8000000, code_size, std::addressof(m_kernel.GetAppSystemResource()), | 370 | 0x8000000, code_size, std::addressof(m_kernel.GetAppSystemResource()), m_resource_limit, |
| 371 | m_resource_limit)}; | 371 | m_kernel.System().ApplicationMemory())}; |
| 372 | result.IsError()) { | 372 | result.IsError()) { |
| 373 | R_RETURN(result); | 373 | R_RETURN(result); |
| 374 | } | 374 | } |
| @@ -592,8 +592,7 @@ Result KProcess::DeleteThreadLocalRegion(KProcessAddress addr) { | |||
| 592 | R_SUCCEED(); | 592 | R_SUCCEED(); |
| 593 | } | 593 | } |
| 594 | 594 | ||
| 595 | bool KProcess::InsertWatchpoint(Core::System& system, KProcessAddress addr, u64 size, | 595 | bool KProcess::InsertWatchpoint(KProcessAddress addr, u64 size, DebugWatchpointType type) { |
| 596 | DebugWatchpointType type) { | ||
| 597 | const auto watch{std::find_if(m_watchpoints.begin(), m_watchpoints.end(), [&](const auto& wp) { | 596 | const auto watch{std::find_if(m_watchpoints.begin(), m_watchpoints.end(), [&](const auto& wp) { |
| 598 | return wp.type == DebugWatchpointType::None; | 597 | return wp.type == DebugWatchpointType::None; |
| 599 | })}; | 598 | })}; |
| @@ -609,14 +608,13 @@ bool KProcess::InsertWatchpoint(Core::System& system, KProcessAddress addr, u64 | |||
| 609 | for (KProcessAddress page = Common::AlignDown(GetInteger(addr), PageSize); page < addr + size; | 608 | for (KProcessAddress page = Common::AlignDown(GetInteger(addr), PageSize); page < addr + size; |
| 610 | page += PageSize) { | 609 | page += PageSize) { |
| 611 | m_debug_page_refcounts[page]++; | 610 | m_debug_page_refcounts[page]++; |
| 612 | system.Memory().MarkRegionDebug(page, PageSize, true); | 611 | this->GetMemory().MarkRegionDebug(page, PageSize, true); |
| 613 | } | 612 | } |
| 614 | 613 | ||
| 615 | return true; | 614 | return true; |
| 616 | } | 615 | } |
| 617 | 616 | ||
| 618 | bool KProcess::RemoveWatchpoint(Core::System& system, KProcessAddress addr, u64 size, | 617 | bool KProcess::RemoveWatchpoint(KProcessAddress addr, u64 size, DebugWatchpointType type) { |
| 619 | DebugWatchpointType type) { | ||
| 620 | const auto watch{std::find_if(m_watchpoints.begin(), m_watchpoints.end(), [&](const auto& wp) { | 618 | const auto watch{std::find_if(m_watchpoints.begin(), m_watchpoints.end(), [&](const auto& wp) { |
| 621 | return wp.start_address == addr && wp.end_address == addr + size && wp.type == type; | 619 | return wp.start_address == addr && wp.end_address == addr + size && wp.type == type; |
| 622 | })}; | 620 | })}; |
| @@ -633,7 +631,7 @@ bool KProcess::RemoveWatchpoint(Core::System& system, KProcessAddress addr, u64 | |||
| 633 | page += PageSize) { | 631 | page += PageSize) { |
| 634 | m_debug_page_refcounts[page]--; | 632 | m_debug_page_refcounts[page]--; |
| 635 | if (!m_debug_page_refcounts[page]) { | 633 | if (!m_debug_page_refcounts[page]) { |
| 636 | system.Memory().MarkRegionDebug(page, PageSize, false); | 634 | this->GetMemory().MarkRegionDebug(page, PageSize, false); |
| 637 | } | 635 | } |
| 638 | } | 636 | } |
| 639 | 637 | ||
| @@ -646,8 +644,7 @@ void KProcess::LoadModule(CodeSet code_set, KProcessAddress base_addr) { | |||
| 646 | m_page_table.SetProcessMemoryPermission(segment.addr + base_addr, segment.size, permission); | 644 | m_page_table.SetProcessMemoryPermission(segment.addr + base_addr, segment.size, permission); |
| 647 | }; | 645 | }; |
| 648 | 646 | ||
| 649 | m_kernel.System().Memory().WriteBlock(*this, base_addr, code_set.memory.data(), | 647 | this->GetMemory().WriteBlock(base_addr, code_set.memory.data(), code_set.memory.size()); |
| 650 | code_set.memory.size()); | ||
| 651 | 648 | ||
| 652 | ReprotectSegment(code_set.CodeSegment(), Svc::MemoryPermission::ReadExecute); | 649 | ReprotectSegment(code_set.CodeSegment(), Svc::MemoryPermission::ReadExecute); |
| 653 | ReprotectSegment(code_set.RODataSegment(), Svc::MemoryPermission::Read); | 650 | ReprotectSegment(code_set.RODataSegment(), Svc::MemoryPermission::Read); |
| @@ -706,4 +703,9 @@ Result KProcess::AllocateMainThreadStack(std::size_t stack_size) { | |||
| 706 | R_SUCCEED(); | 703 | R_SUCCEED(); |
| 707 | } | 704 | } |
| 708 | 705 | ||
| 706 | Core::Memory::Memory& KProcess::GetMemory() const { | ||
| 707 | // TODO: per-process memory | ||
| 708 | return m_kernel.System().ApplicationMemory(); | ||
| 709 | } | ||
| 710 | |||
| 709 | } // namespace Kernel | 711 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/k_process.h b/src/core/hle/kernel/k_process.h index 04b6bbb86..925981d06 100644 --- a/src/core/hle/kernel/k_process.h +++ b/src/core/hle/kernel/k_process.h | |||
| @@ -22,8 +22,12 @@ | |||
| 22 | #include "core/hle/result.h" | 22 | #include "core/hle/result.h" |
| 23 | 23 | ||
| 24 | namespace Core { | 24 | namespace Core { |
| 25 | namespace Memory { | ||
| 26 | class Memory; | ||
| 27 | }; | ||
| 28 | |||
| 25 | class System; | 29 | class System; |
| 26 | } | 30 | } // namespace Core |
| 27 | 31 | ||
| 28 | namespace FileSys { | 32 | namespace FileSys { |
| 29 | class ProgramMetadata; | 33 | class ProgramMetadata; |
| @@ -135,6 +139,9 @@ public: | |||
| 135 | return m_handle_table; | 139 | return m_handle_table; |
| 136 | } | 140 | } |
| 137 | 141 | ||
| 142 | /// Gets a reference to process's memory. | ||
| 143 | Core::Memory::Memory& GetMemory() const; | ||
| 144 | |||
| 138 | Result SignalToAddress(KProcessAddress address) { | 145 | Result SignalToAddress(KProcessAddress address) { |
| 139 | return m_condition_var.SignalToAddress(address); | 146 | return m_condition_var.SignalToAddress(address); |
| 140 | } | 147 | } |
| @@ -397,12 +404,10 @@ public: | |||
| 397 | // Debug watchpoint management | 404 | // Debug watchpoint management |
| 398 | 405 | ||
| 399 | // Attempts to insert a watchpoint into a free slot. Returns false if none are available. | 406 | // Attempts to insert a watchpoint into a free slot. Returns false if none are available. |
| 400 | bool InsertWatchpoint(Core::System& system, KProcessAddress addr, u64 size, | 407 | bool InsertWatchpoint(KProcessAddress addr, u64 size, DebugWatchpointType type); |
| 401 | DebugWatchpointType type); | ||
| 402 | 408 | ||
| 403 | // Attempts to remove the watchpoint specified by the given parameters. | 409 | // Attempts to remove the watchpoint specified by the given parameters. |
| 404 | bool RemoveWatchpoint(Core::System& system, KProcessAddress addr, u64 size, | 410 | bool RemoveWatchpoint(KProcessAddress addr, u64 size, DebugWatchpointType type); |
| 405 | DebugWatchpointType type); | ||
| 406 | 411 | ||
| 407 | const std::array<DebugWatchpoint, Core::Hardware::NUM_WATCHPOINTS>& GetWatchpoints() const { | 412 | const std::array<DebugWatchpoint, Core::Hardware::NUM_WATCHPOINTS>& GetWatchpoints() const { |
| 408 | return m_watchpoints; | 413 | return m_watchpoints; |
diff --git a/src/core/hle/kernel/k_server_session.cpp b/src/core/hle/kernel/k_server_session.cpp index 2288ee435..c66aff501 100644 --- a/src/core/hle/kernel/k_server_session.cpp +++ b/src/core/hle/kernel/k_server_session.cpp | |||
| @@ -222,7 +222,7 @@ Result KServerSession::SendReply(bool is_hle) { | |||
| 222 | // HLE servers write directly to a pointer to the thread command buffer. Therefore | 222 | // HLE servers write directly to a pointer to the thread command buffer. Therefore |
| 223 | // the reply has already been written in this case. | 223 | // the reply has already been written in this case. |
| 224 | } else { | 224 | } else { |
| 225 | Core::Memory::Memory& memory{m_kernel.System().Memory()}; | 225 | Core::Memory::Memory& memory{client_thread->GetOwnerProcess()->GetMemory()}; |
| 226 | KThread* server_thread{GetCurrentThreadPointer(m_kernel)}; | 226 | KThread* server_thread{GetCurrentThreadPointer(m_kernel)}; |
| 227 | UNIMPLEMENTED_IF(server_thread->GetOwnerProcess() != client_thread->GetOwnerProcess()); | 227 | UNIMPLEMENTED_IF(server_thread->GetOwnerProcess() != client_thread->GetOwnerProcess()); |
| 228 | 228 | ||
| @@ -319,7 +319,7 @@ Result KServerSession::ReceiveRequest(std::shared_ptr<Service::HLERequestContext | |||
| 319 | // bool recv_list_broken = false; | 319 | // bool recv_list_broken = false; |
| 320 | 320 | ||
| 321 | // Receive the message. | 321 | // Receive the message. |
| 322 | Core::Memory::Memory& memory{m_kernel.System().Memory()}; | 322 | Core::Memory::Memory& memory{client_thread->GetOwnerProcess()->GetMemory()}; |
| 323 | if (out_context != nullptr) { | 323 | if (out_context != nullptr) { |
| 324 | // HLE request. | 324 | // HLE request. |
| 325 | u32* cmd_buf{reinterpret_cast<u32*>(memory.GetPointer(client_message))}; | 325 | u32* cmd_buf{reinterpret_cast<u32*>(memory.GetPointer(client_message))}; |
diff --git a/src/core/hle/kernel/k_thread.cpp b/src/core/hle/kernel/k_thread.cpp index 9d101c640..70480b725 100644 --- a/src/core/hle/kernel/k_thread.cpp +++ b/src/core/hle/kernel/k_thread.cpp | |||
| @@ -546,7 +546,7 @@ u16 KThread::GetUserDisableCount() const { | |||
| 546 | return {}; | 546 | return {}; |
| 547 | } | 547 | } |
| 548 | 548 | ||
| 549 | auto& memory = m_kernel.System().Memory(); | 549 | auto& memory = this->GetOwnerProcess()->GetMemory(); |
| 550 | return memory.Read16(m_tls_address + offsetof(ThreadLocalRegion, disable_count)); | 550 | return memory.Read16(m_tls_address + offsetof(ThreadLocalRegion, disable_count)); |
| 551 | } | 551 | } |
| 552 | 552 | ||
| @@ -556,7 +556,7 @@ void KThread::SetInterruptFlag() { | |||
| 556 | return; | 556 | return; |
| 557 | } | 557 | } |
| 558 | 558 | ||
| 559 | auto& memory = m_kernel.System().Memory(); | 559 | auto& memory = this->GetOwnerProcess()->GetMemory(); |
| 560 | memory.Write16(m_tls_address + offsetof(ThreadLocalRegion, interrupt_flag), 1); | 560 | memory.Write16(m_tls_address + offsetof(ThreadLocalRegion, interrupt_flag), 1); |
| 561 | } | 561 | } |
| 562 | 562 | ||
| @@ -566,7 +566,7 @@ void KThread::ClearInterruptFlag() { | |||
| 566 | return; | 566 | return; |
| 567 | } | 567 | } |
| 568 | 568 | ||
| 569 | auto& memory = m_kernel.System().Memory(); | 569 | auto& memory = this->GetOwnerProcess()->GetMemory(); |
| 570 | memory.Write16(m_tls_address + offsetof(ThreadLocalRegion, interrupt_flag), 0); | 570 | memory.Write16(m_tls_address + offsetof(ThreadLocalRegion, interrupt_flag), 0); |
| 571 | } | 571 | } |
| 572 | 572 | ||
| @@ -1422,6 +1422,11 @@ s32 GetCurrentCoreId(KernelCore& kernel) { | |||
| 1422 | return GetCurrentThread(kernel).GetCurrentCore(); | 1422 | return GetCurrentThread(kernel).GetCurrentCore(); |
| 1423 | } | 1423 | } |
| 1424 | 1424 | ||
| 1425 | Core::Memory::Memory& GetCurrentMemory(KernelCore& kernel) { | ||
| 1426 | // TODO: per-process memory | ||
| 1427 | return kernel.System().ApplicationMemory(); | ||
| 1428 | } | ||
| 1429 | |||
| 1425 | KScopedDisableDispatch::~KScopedDisableDispatch() { | 1430 | KScopedDisableDispatch::~KScopedDisableDispatch() { |
| 1426 | // If we are shutting down the kernel, none of this is relevant anymore. | 1431 | // If we are shutting down the kernel, none of this is relevant anymore. |
| 1427 | if (m_kernel.IsShuttingDown()) { | 1432 | if (m_kernel.IsShuttingDown()) { |
diff --git a/src/core/hle/kernel/k_thread.h b/src/core/hle/kernel/k_thread.h index 0fa9672bf..9c1a41128 100644 --- a/src/core/hle/kernel/k_thread.h +++ b/src/core/hle/kernel/k_thread.h | |||
| @@ -34,6 +34,9 @@ class Fiber; | |||
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | namespace Core { | 36 | namespace Core { |
| 37 | namespace Memory { | ||
| 38 | class Memory; | ||
| 39 | } | ||
| 37 | class ARM_Interface; | 40 | class ARM_Interface; |
| 38 | class System; | 41 | class System; |
| 39 | } // namespace Core | 42 | } // namespace Core |
| @@ -113,6 +116,7 @@ KThread& GetCurrentThread(KernelCore& kernel); | |||
| 113 | KProcess* GetCurrentProcessPointer(KernelCore& kernel); | 116 | KProcess* GetCurrentProcessPointer(KernelCore& kernel); |
| 114 | KProcess& GetCurrentProcess(KernelCore& kernel); | 117 | KProcess& GetCurrentProcess(KernelCore& kernel); |
| 115 | s32 GetCurrentCoreId(KernelCore& kernel); | 118 | s32 GetCurrentCoreId(KernelCore& kernel); |
| 119 | Core::Memory::Memory& GetCurrentMemory(KernelCore& kernel); | ||
| 116 | 120 | ||
| 117 | class KThread final : public KAutoObjectWithSlabHeapAndContainer<KThread, KWorkerTask>, | 121 | class KThread final : public KAutoObjectWithSlabHeapAndContainer<KThread, KWorkerTask>, |
| 118 | public boost::intrusive::list_base_hook<>, | 122 | public boost::intrusive::list_base_hook<>, |
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 29809b2c5..4f3366c9d 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp | |||
| @@ -102,7 +102,7 @@ struct KernelCore::Impl { | |||
| 102 | void InitializeCores() { | 102 | void InitializeCores() { |
| 103 | for (u32 core_id = 0; core_id < Core::Hardware::NUM_CPU_CORES; core_id++) { | 103 | for (u32 core_id = 0; core_id < Core::Hardware::NUM_CPU_CORES; core_id++) { |
| 104 | cores[core_id]->Initialize((*application_process).Is64BitProcess()); | 104 | cores[core_id]->Initialize((*application_process).Is64BitProcess()); |
| 105 | system.Memory().SetCurrentPageTable(*application_process, core_id); | 105 | system.ApplicationMemory().SetCurrentPageTable(*application_process, core_id); |
| 106 | } | 106 | } |
| 107 | } | 107 | } |
| 108 | 108 | ||
| @@ -206,7 +206,7 @@ struct KernelCore::Impl { | |||
| 206 | 206 | ||
| 207 | void InitializePhysicalCores() { | 207 | void InitializePhysicalCores() { |
| 208 | exclusive_monitor = | 208 | exclusive_monitor = |
| 209 | Core::MakeExclusiveMonitor(system.Memory(), Core::Hardware::NUM_CPU_CORES); | 209 | Core::MakeExclusiveMonitor(system.ApplicationMemory(), Core::Hardware::NUM_CPU_CORES); |
| 210 | for (u32 i = 0; i < Core::Hardware::NUM_CPU_CORES; i++) { | 210 | for (u32 i = 0; i < Core::Hardware::NUM_CPU_CORES; i++) { |
| 211 | const s32 core{static_cast<s32>(i)}; | 211 | const s32 core{static_cast<s32>(i)}; |
| 212 | 212 | ||
diff --git a/src/core/hle/kernel/svc/svc_cache.cpp b/src/core/hle/kernel/svc/svc_cache.cpp index 1779832d3..082942dab 100644 --- a/src/core/hle/kernel/svc/svc_cache.cpp +++ b/src/core/hle/kernel/svc/svc_cache.cpp | |||
| @@ -46,7 +46,7 @@ Result FlushProcessDataCache(Core::System& system, Handle process_handle, u64 ad | |||
| 46 | R_UNLESS(page_table.Contains(address, size), ResultInvalidCurrentMemory); | 46 | R_UNLESS(page_table.Contains(address, size), ResultInvalidCurrentMemory); |
| 47 | 47 | ||
| 48 | // Perform the operation. | 48 | // Perform the operation. |
| 49 | R_RETURN(system.Memory().FlushDataCache(*process, address, size)); | 49 | R_RETURN(GetCurrentMemory(system.Kernel()).FlushDataCache(address, size)); |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | void FlushEntireDataCache64(Core::System& system) { | 52 | void FlushEntireDataCache64(Core::System& system) { |
diff --git a/src/core/hle/kernel/svc/svc_debug_string.cpp b/src/core/hle/kernel/svc/svc_debug_string.cpp index 8771d2b01..4c14ce668 100644 --- a/src/core/hle/kernel/svc/svc_debug_string.cpp +++ b/src/core/hle/kernel/svc/svc_debug_string.cpp | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | 2 | // SPDX-License-Identifier: GPL-2.0-or-later |
| 3 | 3 | ||
| 4 | #include "core/core.h" | 4 | #include "core/core.h" |
| 5 | #include "core/hle/kernel/k_thread.h" | ||
| 5 | #include "core/hle/kernel/svc.h" | 6 | #include "core/hle/kernel/svc.h" |
| 6 | #include "core/memory.h" | 7 | #include "core/memory.h" |
| 7 | 8 | ||
| @@ -12,7 +13,7 @@ Result OutputDebugString(Core::System& system, u64 address, u64 len) { | |||
| 12 | R_SUCCEED_IF(len == 0); | 13 | R_SUCCEED_IF(len == 0); |
| 13 | 14 | ||
| 14 | std::string str(len, '\0'); | 15 | std::string str(len, '\0'); |
| 15 | system.Memory().ReadBlock(address, str.data(), str.size()); | 16 | GetCurrentMemory(system.Kernel()).ReadBlock(address, str.data(), str.size()); |
| 16 | LOG_DEBUG(Debug_Emulated, "{}", str); | 17 | LOG_DEBUG(Debug_Emulated, "{}", str); |
| 17 | 18 | ||
| 18 | R_SUCCEED(); | 19 | R_SUCCEED(); |
diff --git a/src/core/hle/kernel/svc/svc_exception.cpp b/src/core/hle/kernel/svc/svc_exception.cpp index 4ab5f471f..580cf2f75 100644 --- a/src/core/hle/kernel/svc/svc_exception.cpp +++ b/src/core/hle/kernel/svc/svc_exception.cpp | |||
| @@ -25,7 +25,7 @@ void Break(Core::System& system, BreakReason reason, u64 info1, u64 info2) { | |||
| 25 | return; | 25 | return; |
| 26 | } | 26 | } |
| 27 | 27 | ||
| 28 | auto& memory = system.Memory(); | 28 | auto& memory = GetCurrentMemory(system.Kernel()); |
| 29 | 29 | ||
| 30 | // This typically is an error code so we're going to assume this is the case | 30 | // This typically is an error code so we're going to assume this is the case |
| 31 | if (sz == sizeof(u32)) { | 31 | if (sz == sizeof(u32)) { |
diff --git a/src/core/hle/kernel/svc/svc_ipc.cpp b/src/core/hle/kernel/svc/svc_ipc.cpp index 2a8c09a79..ea03068aa 100644 --- a/src/core/hle/kernel/svc/svc_ipc.cpp +++ b/src/core/hle/kernel/svc/svc_ipc.cpp | |||
| @@ -41,12 +41,12 @@ Result ReplyAndReceive(Core::System& system, s32* out_index, uint64_t handles_ad | |||
| 41 | auto& handle_table = GetCurrentProcess(kernel).GetHandleTable(); | 41 | auto& handle_table = GetCurrentProcess(kernel).GetHandleTable(); |
| 42 | 42 | ||
| 43 | R_UNLESS(0 <= num_handles && num_handles <= ArgumentHandleCountMax, ResultOutOfRange); | 43 | R_UNLESS(0 <= num_handles && num_handles <= ArgumentHandleCountMax, ResultOutOfRange); |
| 44 | R_UNLESS(system.Memory().IsValidVirtualAddressRange( | 44 | R_UNLESS(GetCurrentMemory(kernel).IsValidVirtualAddressRange( |
| 45 | handles_addr, static_cast<u64>(sizeof(Handle) * num_handles)), | 45 | handles_addr, static_cast<u64>(sizeof(Handle) * num_handles)), |
| 46 | ResultInvalidPointer); | 46 | ResultInvalidPointer); |
| 47 | 47 | ||
| 48 | std::vector<Handle> handles(num_handles); | 48 | std::vector<Handle> handles(num_handles); |
| 49 | system.Memory().ReadBlock(handles_addr, handles.data(), sizeof(Handle) * num_handles); | 49 | GetCurrentMemory(kernel).ReadBlock(handles_addr, handles.data(), sizeof(Handle) * num_handles); |
| 50 | 50 | ||
| 51 | // Convert handle list to object table. | 51 | // Convert handle list to object table. |
| 52 | std::vector<KSynchronizationObject*> objs(num_handles); | 52 | std::vector<KSynchronizationObject*> objs(num_handles); |
diff --git a/src/core/hle/kernel/svc/svc_port.cpp b/src/core/hle/kernel/svc/svc_port.cpp index c6eb70422..abba757c7 100644 --- a/src/core/hle/kernel/svc/svc_port.cpp +++ b/src/core/hle/kernel/svc/svc_port.cpp | |||
| @@ -14,7 +14,8 @@ namespace Kernel::Svc { | |||
| 14 | 14 | ||
| 15 | Result ConnectToNamedPort(Core::System& system, Handle* out, u64 user_name) { | 15 | Result ConnectToNamedPort(Core::System& system, Handle* out, u64 user_name) { |
| 16 | // Copy the provided name from user memory to kernel memory. | 16 | // Copy the provided name from user memory to kernel memory. |
| 17 | auto string_name = system.Memory().ReadCString(user_name, KObjectName::NameLengthMax); | 17 | auto string_name = |
| 18 | GetCurrentMemory(system.Kernel()).ReadCString(user_name, KObjectName::NameLengthMax); | ||
| 18 | 19 | ||
| 19 | std::array<char, KObjectName::NameLengthMax> name{}; | 20 | std::array<char, KObjectName::NameLengthMax> name{}; |
| 20 | std::strncpy(name.data(), string_name.c_str(), KObjectName::NameLengthMax - 1); | 21 | std::strncpy(name.data(), string_name.c_str(), KObjectName::NameLengthMax - 1); |
| @@ -62,7 +63,8 @@ Result ConnectToPort(Core::System& system, Handle* out_handle, Handle port) { | |||
| 62 | Result ManageNamedPort(Core::System& system, Handle* out_server_handle, uint64_t user_name, | 63 | Result ManageNamedPort(Core::System& system, Handle* out_server_handle, uint64_t user_name, |
| 63 | int32_t max_sessions) { | 64 | int32_t max_sessions) { |
| 64 | // Copy the provided name from user memory to kernel memory. | 65 | // Copy the provided name from user memory to kernel memory. |
| 65 | auto string_name = system.Memory().ReadCString(user_name, KObjectName::NameLengthMax); | 66 | auto string_name = |
| 67 | GetCurrentMemory(system.Kernel()).ReadCString(user_name, KObjectName::NameLengthMax); | ||
| 66 | 68 | ||
| 67 | // Copy the provided name from user memory to kernel memory. | 69 | // Copy the provided name from user memory to kernel memory. |
| 68 | std::array<char, KObjectName::NameLengthMax> name{}; | 70 | std::array<char, KObjectName::NameLengthMax> name{}; |
diff --git a/src/core/hle/kernel/svc/svc_process.cpp b/src/core/hle/kernel/svc/svc_process.cpp index 3c3579947..619ed16a3 100644 --- a/src/core/hle/kernel/svc/svc_process.cpp +++ b/src/core/hle/kernel/svc/svc_process.cpp | |||
| @@ -73,7 +73,7 @@ Result GetProcessList(Core::System& system, s32* out_num_processes, u64 out_proc | |||
| 73 | R_THROW(ResultInvalidCurrentMemory); | 73 | R_THROW(ResultInvalidCurrentMemory); |
| 74 | } | 74 | } |
| 75 | 75 | ||
| 76 | auto& memory = system.Memory(); | 76 | auto& memory = GetCurrentMemory(kernel); |
| 77 | const auto& process_list = kernel.GetProcessList(); | 77 | const auto& process_list = kernel.GetProcessList(); |
| 78 | const auto num_processes = process_list.size(); | 78 | const auto num_processes = process_list.size(); |
| 79 | const auto copy_amount = | 79 | const auto copy_amount = |
diff --git a/src/core/hle/kernel/svc/svc_query_memory.cpp b/src/core/hle/kernel/svc/svc_query_memory.cpp index 5db5611f0..4d9fcd25f 100644 --- a/src/core/hle/kernel/svc/svc_query_memory.cpp +++ b/src/core/hle/kernel/svc/svc_query_memory.cpp | |||
| @@ -30,10 +30,10 @@ Result QueryProcessMemory(Core::System& system, uint64_t out_memory_info, PageIn | |||
| 30 | R_THROW(ResultInvalidHandle); | 30 | R_THROW(ResultInvalidHandle); |
| 31 | } | 31 | } |
| 32 | 32 | ||
| 33 | auto& memory{system.Memory()}; | 33 | auto& current_memory{GetCurrentMemory(system.Kernel())}; |
| 34 | const auto memory_info{process->PageTable().QueryInfo(address).GetSvcMemoryInfo()}; | 34 | const auto memory_info{process->PageTable().QueryInfo(address).GetSvcMemoryInfo()}; |
| 35 | 35 | ||
| 36 | memory.WriteBlock(out_memory_info, std::addressof(memory_info), sizeof(memory_info)); | 36 | current_memory.WriteBlock(out_memory_info, std::addressof(memory_info), sizeof(memory_info)); |
| 37 | 37 | ||
| 38 | //! This is supposed to be part of the QueryInfo call. | 38 | //! This is supposed to be part of the QueryInfo call. |
| 39 | *out_page_info = {}; | 39 | *out_page_info = {}; |
diff --git a/src/core/hle/kernel/svc/svc_synchronization.cpp b/src/core/hle/kernel/svc/svc_synchronization.cpp index e490a13ae..04d65f0bd 100644 --- a/src/core/hle/kernel/svc/svc_synchronization.cpp +++ b/src/core/hle/kernel/svc/svc_synchronization.cpp | |||
| @@ -90,7 +90,8 @@ Result WaitSynchronization(Core::System& system, int32_t* out_index, u64 user_ha | |||
| 90 | 90 | ||
| 91 | std::vector<Handle> handles(num_handles); | 91 | std::vector<Handle> handles(num_handles); |
| 92 | if (num_handles > 0) { | 92 | if (num_handles > 0) { |
| 93 | system.Memory().ReadBlock(user_handles, handles.data(), num_handles * sizeof(Handle)); | 93 | GetCurrentMemory(system.Kernel()) |
| 94 | .ReadBlock(user_handles, handles.data(), num_handles * sizeof(Handle)); | ||
| 94 | } | 95 | } |
| 95 | 96 | ||
| 96 | R_RETURN(WaitSynchronization(system, out_index, handles.data(), num_handles, timeout_ns)); | 97 | R_RETURN(WaitSynchronization(system, out_index, handles.data(), num_handles, timeout_ns)); |
diff --git a/src/core/hle/kernel/svc/svc_thread.cpp b/src/core/hle/kernel/svc/svc_thread.cpp index 0be4858a2..37b54079c 100644 --- a/src/core/hle/kernel/svc/svc_thread.cpp +++ b/src/core/hle/kernel/svc/svc_thread.cpp | |||
| @@ -178,7 +178,7 @@ Result GetThreadContext3(Core::System& system, u64 out_context, Handle thread_ha | |||
| 178 | R_TRY(thread->GetThreadContext3(context)); | 178 | R_TRY(thread->GetThreadContext3(context)); |
| 179 | 179 | ||
| 180 | // Copy the thread context to user space. | 180 | // Copy the thread context to user space. |
| 181 | system.Memory().WriteBlock(out_context, context.data(), context.size()); | 181 | GetCurrentMemory(kernel).WriteBlock(out_context, context.data(), context.size()); |
| 182 | 182 | ||
| 183 | R_SUCCEED(); | 183 | R_SUCCEED(); |
| 184 | } | 184 | } |
| @@ -242,7 +242,7 @@ Result GetThreadList(Core::System& system, s32* out_num_threads, u64 out_thread_ | |||
| 242 | R_THROW(ResultInvalidCurrentMemory); | 242 | R_THROW(ResultInvalidCurrentMemory); |
| 243 | } | 243 | } |
| 244 | 244 | ||
| 245 | auto& memory = system.Memory(); | 245 | auto& memory = GetCurrentMemory(system.Kernel()); |
| 246 | const auto& thread_list = current_process->GetThreadList(); | 246 | const auto& thread_list = current_process->GetThreadList(); |
| 247 | const auto num_threads = thread_list.size(); | 247 | const auto num_threads = thread_list.size(); |
| 248 | const auto copy_amount = std::min(static_cast<std::size_t>(out_thread_ids_size), num_threads); | 248 | const auto copy_amount = std::min(static_cast<std::size_t>(out_thread_ids_size), num_threads); |