summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel
diff options
context:
space:
mode:
authorGravatar liamwhite2023-03-27 12:16:40 -0400
committerGravatar GitHub2023-03-27 12:16:40 -0400
commit0661f5ccd1704935dc9c49521a79cc26832db3b0 (patch)
treee0923dd40e8dd0f6ec92a2de7722f911bd26c514 /src/core/hle/kernel
parentMerge pull request #9995 from german77/plain (diff)
parentmemory: rename global memory references to application memory (diff)
downloadyuzu-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.cpp10
-rw-r--r--src/core/hle/kernel/k_condition_variable.cpp18
-rw-r--r--src/core/hle/kernel/k_page_table.cpp54
-rw-r--r--src/core/hle/kernel/k_page_table.h4
-rw-r--r--src/core/hle/kernel/k_process.cpp22
-rw-r--r--src/core/hle/kernel/k_process.h15
-rw-r--r--src/core/hle/kernel/k_server_session.cpp4
-rw-r--r--src/core/hle/kernel/k_thread.cpp11
-rw-r--r--src/core/hle/kernel/k_thread.h4
-rw-r--r--src/core/hle/kernel/kernel.cpp4
-rw-r--r--src/core/hle/kernel/svc/svc_cache.cpp2
-rw-r--r--src/core/hle/kernel/svc/svc_debug_string.cpp3
-rw-r--r--src/core/hle/kernel/svc/svc_exception.cpp2
-rw-r--r--src/core/hle/kernel/svc/svc_ipc.cpp4
-rw-r--r--src/core/hle/kernel/svc/svc_port.cpp6
-rw-r--r--src/core/hle/kernel/svc/svc_process.cpp2
-rw-r--r--src/core/hle/kernel/svc/svc_query_memory.cpp4
-rw-r--r--src/core/hle/kernel/svc/svc_synchronization.cpp3
-rw-r--r--src/core/hle/kernel/svc/svc_thread.cpp4
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
22namespace { 22namespace {
23 23
24bool ReadFromUser(Core::System& system, s32* out, KProcessAddress address) { 24bool 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
19namespace { 19namespace {
20 20
21bool ReadFromUser(Core::System& system, u32* out, KProcessAddress address) { 21bool 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
26bool WriteToUser(Core::System& system, KProcessAddress address, const u32* p) { 26bool 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
335void KPageTable::Finalize() { 339void 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
595bool KProcess::InsertWatchpoint(Core::System& system, KProcessAddress addr, u64 size, 595bool 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
618bool KProcess::RemoveWatchpoint(Core::System& system, KProcessAddress addr, u64 size, 617bool 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
706Core::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
24namespace Core { 24namespace Core {
25namespace Memory {
26class Memory;
27};
28
25class System; 29class System;
26} 30} // namespace Core
27 31
28namespace FileSys { 32namespace FileSys {
29class ProgramMetadata; 33class 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
1425Core::Memory::Memory& GetCurrentMemory(KernelCore& kernel) {
1426 // TODO: per-process memory
1427 return kernel.System().ApplicationMemory();
1428}
1429
1425KScopedDisableDispatch::~KScopedDisableDispatch() { 1430KScopedDisableDispatch::~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
36namespace Core { 36namespace Core {
37namespace Memory {
38class Memory;
39}
37class ARM_Interface; 40class ARM_Interface;
38class System; 41class System;
39} // namespace Core 42} // namespace Core
@@ -113,6 +116,7 @@ KThread& GetCurrentThread(KernelCore& kernel);
113KProcess* GetCurrentProcessPointer(KernelCore& kernel); 116KProcess* GetCurrentProcessPointer(KernelCore& kernel);
114KProcess& GetCurrentProcess(KernelCore& kernel); 117KProcess& GetCurrentProcess(KernelCore& kernel);
115s32 GetCurrentCoreId(KernelCore& kernel); 118s32 GetCurrentCoreId(KernelCore& kernel);
119Core::Memory::Memory& GetCurrentMemory(KernelCore& kernel);
116 120
117class KThread final : public KAutoObjectWithSlabHeapAndContainer<KThread, KWorkerTask>, 121class 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
52void FlushEntireDataCache64(Core::System& system) { 52void 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
15Result ConnectToNamedPort(Core::System& system, Handle* out, u64 user_name) { 15Result 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) {
62Result ManageNamedPort(Core::System& system, Handle* out_server_handle, uint64_t user_name, 63Result 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);