summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Lioncash2018-09-24 20:01:45 -0400
committerGravatar Lioncash2018-09-24 22:16:03 -0400
commit83377113bfe7791483a1b67e06dd0f51620c04ec (patch)
treed766a2d2f20d247e8663c1a76d5c41fcf7f643d4 /src
parentsvc: Report correct memory-related values within some of the cases in svcGetI... (diff)
downloadyuzu-83377113bfe7791483a1b67e06dd0f51620c04ec.tar.gz
yuzu-83377113bfe7791483a1b67e06dd0f51620c04ec.tar.xz
yuzu-83377113bfe7791483a1b67e06dd0f51620c04ec.zip
memory: Dehardcode the use of fixed memory range constants
The locations of these can actually vary depending on the address space layout, so we shouldn't be using these when determining where to map memory or be using them as offsets for calculations. This keeps all the memory ranges flexible and malleable based off of the virtual memory manager instance state.
Diffstat (limited to 'src')
-rw-r--r--src/core/gdbstub/gdbstub.cpp15
-rw-r--r--src/core/hle/kernel/process.cpp20
-rw-r--r--src/core/hle/kernel/shared_memory.cpp4
-rw-r--r--src/core/hle/kernel/svc.cpp3
-rw-r--r--src/core/hle/kernel/thread.cpp3
-rw-r--r--src/core/loader/deconstructed_rom_directory.cpp7
-rw-r--r--src/core/loader/elf.cpp24
-rw-r--r--src/core/loader/nro.cpp7
-rw-r--r--src/core/loader/nso.cpp9
-rw-r--r--src/core/memory.cpp12
-rw-r--r--src/core/memory.h31
11 files changed, 60 insertions, 75 deletions
diff --git a/src/core/gdbstub/gdbstub.cpp b/src/core/gdbstub/gdbstub.cpp
index 0ecdd9f82..d8c7b3492 100644
--- a/src/core/gdbstub/gdbstub.cpp
+++ b/src/core/gdbstub/gdbstub.cpp
@@ -37,7 +37,9 @@
37#include "core/core.h" 37#include "core/core.h"
38#include "core/core_cpu.h" 38#include "core/core_cpu.h"
39#include "core/gdbstub/gdbstub.h" 39#include "core/gdbstub/gdbstub.h"
40#include "core/hle/kernel/process.h"
40#include "core/hle/kernel/scheduler.h" 41#include "core/hle/kernel/scheduler.h"
42#include "core/hle/kernel/vm_manager.h"
41#include "core/loader/loader.h" 43#include "core/loader/loader.h"
42#include "core/memory.h" 44#include "core/memory.h"
43 45
@@ -585,7 +587,8 @@ static void HandleQuery() {
585 strlen("Xfer:features:read:target.xml:")) == 0) { 587 strlen("Xfer:features:read:target.xml:")) == 0) {
586 SendReply(target_xml); 588 SendReply(target_xml);
587 } else if (strncmp(query, "Offsets", strlen("Offsets")) == 0) { 589 } else if (strncmp(query, "Offsets", strlen("Offsets")) == 0) {
588 std::string buffer = fmt::format("TextSeg={:0x}", Memory::PROCESS_IMAGE_VADDR); 590 const VAddr base_address = Core::CurrentProcess()->vm_manager.GetCodeRegionBaseAddress();
591 std::string buffer = fmt::format("TextSeg={:0x}", base_address);
589 SendReply(buffer.c_str()); 592 SendReply(buffer.c_str());
590 } else if (strncmp(query, "fThreadInfo", strlen("fThreadInfo")) == 0) { 593 } else if (strncmp(query, "fThreadInfo", strlen("fThreadInfo")) == 0) {
591 std::string val = "m"; 594 std::string val = "m";
@@ -893,11 +896,11 @@ static void ReadMemory() {
893 static u8 reply[GDB_BUFFER_SIZE - 4]; 896 static u8 reply[GDB_BUFFER_SIZE - 4];
894 897
895 auto start_offset = command_buffer + 1; 898 auto start_offset = command_buffer + 1;
896 auto addr_pos = std::find(start_offset, command_buffer + command_length, ','); 899 const auto addr_pos = std::find(start_offset, command_buffer + command_length, ',');
897 VAddr addr = HexToLong(start_offset, static_cast<u64>(addr_pos - start_offset)); 900 const VAddr addr = HexToLong(start_offset, static_cast<u64>(addr_pos - start_offset));
898 901
899 start_offset = addr_pos + 1; 902 start_offset = addr_pos + 1;
900 u64 len = 903 const u64 len =
901 HexToLong(start_offset, static_cast<u64>((command_buffer + command_length) - start_offset)); 904 HexToLong(start_offset, static_cast<u64>((command_buffer + command_length) - start_offset));
902 905
903 LOG_DEBUG(Debug_GDBStub, "gdb: addr: {:016X} len: {:016X}", addr, len); 906 LOG_DEBUG(Debug_GDBStub, "gdb: addr: {:016X} len: {:016X}", addr, len);
@@ -906,7 +909,9 @@ static void ReadMemory() {
906 SendReply("E01"); 909 SendReply("E01");
907 } 910 }
908 911
909 if (addr < Memory::PROCESS_IMAGE_VADDR || addr >= Memory::MAP_REGION_VADDR_END) { 912 const auto& vm_manager = Core::CurrentProcess()->vm_manager;
913 if (addr < vm_manager.GetCodeRegionBaseAddress() ||
914 addr >= vm_manager.GetMapRegionEndAddress()) {
910 return SendReply("E00"); 915 return SendReply("E00");
911 } 916 }
912 917
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp
index f337f626f..a8e3098ca 100644
--- a/src/core/hle/kernel/process.cpp
+++ b/src/core/hle/kernel/process.cpp
@@ -127,7 +127,7 @@ void Process::Run(VAddr entry_point, s32 main_thread_priority, u32 stack_size) {
127 // TODO(bunnei): This is heap area that should be allocated by the kernel and not mapped as part 127 // TODO(bunnei): This is heap area that should be allocated by the kernel and not mapped as part
128 // of the user address space. 128 // of the user address space.
129 vm_manager 129 vm_manager
130 .MapMemoryBlock(Memory::STACK_AREA_VADDR_END - stack_size, 130 .MapMemoryBlock(vm_manager.GetTLSIORegionEndAddress() - stack_size,
131 std::make_shared<std::vector<u8>>(stack_size, 0), 0, stack_size, 131 std::make_shared<std::vector<u8>>(stack_size, 0), 0, stack_size,
132 MemoryState::Mapped) 132 MemoryState::Mapped)
133 .Unwrap(); 133 .Unwrap();
@@ -193,6 +193,7 @@ static std::tuple<std::size_t, std::size_t, bool> FindFreeThreadLocalSlot(
193 193
194VAddr Process::MarkNextAvailableTLSSlotAsUsed(Thread& thread) { 194VAddr Process::MarkNextAvailableTLSSlotAsUsed(Thread& thread) {
195 auto [available_page, available_slot, needs_allocation] = FindFreeThreadLocalSlot(tls_slots); 195 auto [available_page, available_slot, needs_allocation] = FindFreeThreadLocalSlot(tls_slots);
196 const VAddr tls_begin = vm_manager.GetTLSIORegionBaseAddress();
196 197
197 if (needs_allocation) { 198 if (needs_allocation) {
198 tls_slots.emplace_back(0); // The page is completely available at the start 199 tls_slots.emplace_back(0); // The page is completely available at the start
@@ -205,18 +206,17 @@ VAddr Process::MarkNextAvailableTLSSlotAsUsed(Thread& thread) {
205 206
206 vm_manager.RefreshMemoryBlockMappings(tls_memory.get()); 207 vm_manager.RefreshMemoryBlockMappings(tls_memory.get());
207 208
208 vm_manager.MapMemoryBlock(Memory::TLS_AREA_VADDR + available_page * Memory::PAGE_SIZE, 209 vm_manager.MapMemoryBlock(tls_begin + available_page * Memory::PAGE_SIZE, tls_memory, 0,
209 tls_memory, 0, Memory::PAGE_SIZE, MemoryState::ThreadLocal); 210 Memory::PAGE_SIZE, MemoryState::ThreadLocal);
210 } 211 }
211 212
212 tls_slots[available_page].set(available_slot); 213 tls_slots[available_page].set(available_slot);
213 214
214 return Memory::TLS_AREA_VADDR + available_page * Memory::PAGE_SIZE + 215 return tls_begin + available_page * Memory::PAGE_SIZE + available_slot * Memory::TLS_ENTRY_SIZE;
215 available_slot * Memory::TLS_ENTRY_SIZE;
216} 216}
217 217
218void Process::FreeTLSSlot(VAddr tls_address) { 218void Process::FreeTLSSlot(VAddr tls_address) {
219 const VAddr tls_base = tls_address - Memory::TLS_AREA_VADDR; 219 const VAddr tls_base = tls_address - vm_manager.GetTLSIORegionBaseAddress();
220 const VAddr tls_page = tls_base / Memory::PAGE_SIZE; 220 const VAddr tls_page = tls_base / Memory::PAGE_SIZE;
221 const VAddr tls_slot = (tls_base % Memory::PAGE_SIZE) / Memory::TLS_ENTRY_SIZE; 221 const VAddr tls_slot = (tls_base % Memory::PAGE_SIZE) / Memory::TLS_ENTRY_SIZE;
222 222
@@ -240,8 +240,8 @@ void Process::LoadModule(SharedPtr<CodeSet> module_, VAddr base_addr) {
240} 240}
241 241
242ResultVal<VAddr> Process::HeapAllocate(VAddr target, u64 size, VMAPermission perms) { 242ResultVal<VAddr> Process::HeapAllocate(VAddr target, u64 size, VMAPermission perms) {
243 if (target < Memory::HEAP_VADDR || target + size > Memory::HEAP_VADDR_END || 243 if (target < vm_manager.GetHeapRegionBaseAddress() ||
244 target + size < target) { 244 target + size > vm_manager.GetHeapRegionEndAddress() || target + size < target) {
245 return ERR_INVALID_ADDRESS; 245 return ERR_INVALID_ADDRESS;
246 } 246 }
247 247
@@ -276,8 +276,8 @@ ResultVal<VAddr> Process::HeapAllocate(VAddr target, u64 size, VMAPermission per
276} 276}
277 277
278ResultCode Process::HeapFree(VAddr target, u32 size) { 278ResultCode Process::HeapFree(VAddr target, u32 size) {
279 if (target < Memory::HEAP_VADDR || target + size > Memory::HEAP_VADDR_END || 279 if (target < vm_manager.GetHeapRegionBaseAddress() ||
280 target + size < target) { 280 target + size > vm_manager.GetHeapRegionEndAddress() || target + size < target) {
281 return ERR_INVALID_ADDRESS; 281 return ERR_INVALID_ADDRESS;
282 } 282 }
283 283
diff --git a/src/core/hle/kernel/shared_memory.cpp b/src/core/hle/kernel/shared_memory.cpp
index abb1d09cd..9b78c8cb5 100644
--- a/src/core/hle/kernel/shared_memory.cpp
+++ b/src/core/hle/kernel/shared_memory.cpp
@@ -8,6 +8,7 @@
8#include "common/logging/log.h" 8#include "common/logging/log.h"
9#include "core/core.h" 9#include "core/core.h"
10#include "core/hle/kernel/errors.h" 10#include "core/hle/kernel/errors.h"
11#include "core/hle/kernel/kernel.h"
11#include "core/hle/kernel/shared_memory.h" 12#include "core/hle/kernel/shared_memory.h"
12#include "core/memory.h" 13#include "core/memory.h"
13 14
@@ -71,7 +72,8 @@ SharedPtr<SharedMemory> SharedMemory::CreateForApplet(
71 shared_memory->other_permissions = other_permissions; 72 shared_memory->other_permissions = other_permissions;
72 shared_memory->backing_block = std::move(heap_block); 73 shared_memory->backing_block = std::move(heap_block);
73 shared_memory->backing_block_offset = offset; 74 shared_memory->backing_block_offset = offset;
74 shared_memory->base_address = Memory::HEAP_VADDR + offset; 75 shared_memory->base_address =
76 kernel.CurrentProcess()->vm_manager.GetHeapRegionBaseAddress() + offset;
75 77
76 return shared_memory; 78 return shared_memory;
77} 79}
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp
index e0f5e3f39..c2b77eb49 100644
--- a/src/core/hle/kernel/svc.cpp
+++ b/src/core/hle/kernel/svc.cpp
@@ -51,8 +51,9 @@ static ResultCode SetHeapSize(VAddr* heap_addr, u64 heap_size) {
51 } 51 }
52 52
53 auto& process = *Core::CurrentProcess(); 53 auto& process = *Core::CurrentProcess();
54 const VAddr heap_base = process.vm_manager.GetHeapRegionBaseAddress();
54 CASCADE_RESULT(*heap_addr, 55 CASCADE_RESULT(*heap_addr,
55 process.HeapAllocate(Memory::HEAP_VADDR, heap_size, VMAPermission::ReadWrite)); 56 process.HeapAllocate(heap_base, heap_size, VMAPermission::ReadWrite));
56 return RESULT_SUCCESS; 57 return RESULT_SUCCESS;
57} 58}
58 59
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp
index 315f65338..064ed908d 100644
--- a/src/core/hle/kernel/thread.cpp
+++ b/src/core/hle/kernel/thread.cpp
@@ -262,8 +262,9 @@ SharedPtr<Thread> SetupMainThread(KernelCore& kernel, VAddr entry_point, u32 pri
262 SetCurrentPageTable(&owner_process.vm_manager.page_table); 262 SetCurrentPageTable(&owner_process.vm_manager.page_table);
263 263
264 // Initialize new "main" thread 264 // Initialize new "main" thread
265 const VAddr stack_top = owner_process.vm_manager.GetTLSIORegionEndAddress();
265 auto thread_res = Thread::Create(kernel, "main", entry_point, priority, 0, THREADPROCESSORID_0, 266 auto thread_res = Thread::Create(kernel, "main", entry_point, priority, 0, THREADPROCESSORID_0,
266 Memory::STACK_AREA_VADDR_END, &owner_process); 267 stack_top, &owner_process);
267 268
268 SharedPtr<Thread> thread = std::move(thread_res).Unwrap(); 269 SharedPtr<Thread> thread = std::move(thread_res).Unwrap();
269 270
diff --git a/src/core/loader/deconstructed_rom_directory.cpp b/src/core/loader/deconstructed_rom_directory.cpp
index 44d62ab7f..7e8035d0f 100644
--- a/src/core/loader/deconstructed_rom_directory.cpp
+++ b/src/core/loader/deconstructed_rom_directory.cpp
@@ -17,7 +17,6 @@
17#include "core/hle/service/filesystem/filesystem.h" 17#include "core/hle/service/filesystem/filesystem.h"
18#include "core/loader/deconstructed_rom_directory.h" 18#include "core/loader/deconstructed_rom_directory.h"
19#include "core/loader/nso.h" 19#include "core/loader/nso.h"
20#include "core/memory.h"
21 20
22namespace Loader { 21namespace Loader {
23 22
@@ -134,7 +133,8 @@ ResultStatus AppLoader_DeconstructedRomDirectory::Load(
134 process->LoadFromMetadata(metadata); 133 process->LoadFromMetadata(metadata);
135 134
136 // Load NSO modules 135 // Load NSO modules
137 VAddr next_load_addr{Memory::PROCESS_IMAGE_VADDR}; 136 const VAddr base_address = process->vm_manager.GetCodeRegionBaseAddress();
137 VAddr next_load_addr = base_address;
138 for (const auto& module : {"rtld", "main", "subsdk0", "subsdk1", "subsdk2", "subsdk3", 138 for (const auto& module : {"rtld", "main", "subsdk0", "subsdk1", "subsdk2", "subsdk3",
139 "subsdk4", "subsdk5", "subsdk6", "subsdk7", "sdk"}) { 139 "subsdk4", "subsdk5", "subsdk6", "subsdk7", "sdk"}) {
140 const FileSys::VirtualFile module_file = dir->GetFile(module); 140 const FileSys::VirtualFile module_file = dir->GetFile(module);
@@ -147,8 +147,7 @@ ResultStatus AppLoader_DeconstructedRomDirectory::Load(
147 } 147 }
148 } 148 }
149 149
150 process->Run(Memory::PROCESS_IMAGE_VADDR, metadata.GetMainThreadPriority(), 150 process->Run(base_address, metadata.GetMainThreadPriority(), metadata.GetMainThreadStackSize());
151 metadata.GetMainThreadStackSize());
152 151
153 // Find the RomFS by searching for a ".romfs" file in this directory 152 // Find the RomFS by searching for a ".romfs" file in this directory
154 const auto& files = dir->GetFiles(); 153 const auto& files = dir->GetFiles();
diff --git a/src/core/loader/elf.cpp b/src/core/loader/elf.cpp
index 00d8a82b8..ff1221574 100644
--- a/src/core/loader/elf.cpp
+++ b/src/core/loader/elf.cpp
@@ -12,6 +12,7 @@
12#include "core/core.h" 12#include "core/core.h"
13#include "core/hle/kernel/kernel.h" 13#include "core/hle/kernel/kernel.h"
14#include "core/hle/kernel/process.h" 14#include "core/hle/kernel/process.h"
15#include "core/hle/kernel/vm_manager.h"
15#include "core/loader/elf.h" 16#include "core/loader/elf.h"
16#include "core/memory.h" 17#include "core/memory.h"
17 18
@@ -188,7 +189,7 @@ private:
188 189
189 u32* sectionAddrs; 190 u32* sectionAddrs;
190 bool relocate; 191 bool relocate;
191 u32 entryPoint; 192 VAddr entryPoint;
192 193
193public: 194public:
194 explicit ElfReader(void* ptr); 195 explicit ElfReader(void* ptr);
@@ -204,13 +205,13 @@ public:
204 ElfMachine GetMachine() const { 205 ElfMachine GetMachine() const {
205 return (ElfMachine)(header->e_machine); 206 return (ElfMachine)(header->e_machine);
206 } 207 }
207 u32 GetEntryPoint() const { 208 VAddr GetEntryPoint() const {
208 return entryPoint; 209 return entryPoint;
209 } 210 }
210 u32 GetFlags() const { 211 u32 GetFlags() const {
211 return (u32)(header->e_flags); 212 return (u32)(header->e_flags);
212 } 213 }
213 SharedPtr<CodeSet> LoadInto(u32 vaddr); 214 SharedPtr<CodeSet> LoadInto(VAddr vaddr);
214 215
215 int GetNumSegments() const { 216 int GetNumSegments() const {
216 return (int)(header->e_phnum); 217 return (int)(header->e_phnum);
@@ -273,7 +274,7 @@ const char* ElfReader::GetSectionName(int section) const {
273 return nullptr; 274 return nullptr;
274} 275}
275 276
276SharedPtr<CodeSet> ElfReader::LoadInto(u32 vaddr) { 277SharedPtr<CodeSet> ElfReader::LoadInto(VAddr vaddr) {
277 LOG_DEBUG(Loader, "String section: {}", header->e_shstrndx); 278 LOG_DEBUG(Loader, "String section: {}", header->e_shstrndx);
278 279
279 // Should we relocate? 280 // Should we relocate?
@@ -288,11 +289,11 @@ SharedPtr<CodeSet> ElfReader::LoadInto(u32 vaddr) {
288 LOG_DEBUG(Loader, "{} segments:", header->e_phnum); 289 LOG_DEBUG(Loader, "{} segments:", header->e_phnum);
289 290
290 // First pass : Get the bits into RAM 291 // First pass : Get the bits into RAM
291 u32 base_addr = relocate ? vaddr : 0; 292 const VAddr base_addr = relocate ? vaddr : 0;
292 293
293 u32 total_image_size = 0; 294 u64 total_image_size = 0;
294 for (unsigned int i = 0; i < header->e_phnum; ++i) { 295 for (unsigned int i = 0; i < header->e_phnum; ++i) {
295 Elf32_Phdr* p = &segments[i]; 296 const Elf32_Phdr* p = &segments[i];
296 if (p->p_type == PT_LOAD) { 297 if (p->p_type == PT_LOAD) {
297 total_image_size += (p->p_memsz + 0xFFF) & ~0xFFF; 298 total_image_size += (p->p_memsz + 0xFFF) & ~0xFFF;
298 } 299 }
@@ -305,7 +306,7 @@ SharedPtr<CodeSet> ElfReader::LoadInto(u32 vaddr) {
305 SharedPtr<CodeSet> codeset = CodeSet::Create(kernel, ""); 306 SharedPtr<CodeSet> codeset = CodeSet::Create(kernel, "");
306 307
307 for (unsigned int i = 0; i < header->e_phnum; ++i) { 308 for (unsigned int i = 0; i < header->e_phnum; ++i) {
308 Elf32_Phdr* p = &segments[i]; 309 const Elf32_Phdr* p = &segments[i];
309 LOG_DEBUG(Loader, "Type: {} Vaddr: {:08X} Filesz: {:08X} Memsz: {:08X} ", p->p_type, 310 LOG_DEBUG(Loader, "Type: {} Vaddr: {:08X} Filesz: {:08X} Memsz: {:08X} ", p->p_type,
310 p->p_vaddr, p->p_filesz, p->p_memsz); 311 p->p_vaddr, p->p_filesz, p->p_memsz);
311 312
@@ -332,8 +333,8 @@ SharedPtr<CodeSet> ElfReader::LoadInto(u32 vaddr) {
332 continue; 333 continue;
333 } 334 }
334 335
335 u32 segment_addr = base_addr + p->p_vaddr; 336 const VAddr segment_addr = base_addr + p->p_vaddr;
336 u32 aligned_size = (p->p_memsz + 0xFFF) & ~0xFFF; 337 const u32 aligned_size = (p->p_memsz + 0xFFF) & ~0xFFF;
337 338
338 codeset_segment->offset = current_image_position; 339 codeset_segment->offset = current_image_position;
339 codeset_segment->addr = segment_addr; 340 codeset_segment->addr = segment_addr;
@@ -394,8 +395,9 @@ ResultStatus AppLoader_ELF::Load(Kernel::SharedPtr<Kernel::Process>& process) {
394 if (buffer.size() != file->GetSize()) 395 if (buffer.size() != file->GetSize())
395 return ResultStatus::ErrorIncorrectELFFileSize; 396 return ResultStatus::ErrorIncorrectELFFileSize;
396 397
398 const VAddr base_address = process->vm_manager.GetCodeRegionBaseAddress();
397 ElfReader elf_reader(&buffer[0]); 399 ElfReader elf_reader(&buffer[0]);
398 SharedPtr<CodeSet> codeset = elf_reader.LoadInto(Memory::PROCESS_IMAGE_VADDR); 400 SharedPtr<CodeSet> codeset = elf_reader.LoadInto(base_address);
399 codeset->name = file->GetName(); 401 codeset->name = file->GetName();
400 402
401 process->LoadModule(codeset, codeset->entrypoint); 403 process->LoadModule(codeset, codeset->entrypoint);
diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp
index 2385012eb..b72871efa 100644
--- a/src/core/loader/nro.cpp
+++ b/src/core/loader/nro.cpp
@@ -16,6 +16,7 @@
16#include "core/gdbstub/gdbstub.h" 16#include "core/gdbstub/gdbstub.h"
17#include "core/hle/kernel/kernel.h" 17#include "core/hle/kernel/kernel.h"
18#include "core/hle/kernel/process.h" 18#include "core/hle/kernel/process.h"
19#include "core/hle/kernel/vm_manager.h"
19#include "core/loader/nro.h" 20#include "core/loader/nro.h"
20#include "core/memory.h" 21#include "core/memory.h"
21 22
@@ -180,13 +181,13 @@ ResultStatus AppLoader_NRO::Load(Kernel::SharedPtr<Kernel::Process>& process) {
180 } 181 }
181 182
182 // Load NRO 183 // Load NRO
183 static constexpr VAddr base_addr{Memory::PROCESS_IMAGE_VADDR}; 184 const VAddr base_address = process->vm_manager.GetCodeRegionBaseAddress();
184 185
185 if (!LoadNro(file, base_addr)) { 186 if (!LoadNro(file, base_address)) {
186 return ResultStatus::ErrorLoadingNRO; 187 return ResultStatus::ErrorLoadingNRO;
187 } 188 }
188 189
189 process->Run(base_addr, Kernel::THREADPRIO_DEFAULT, Memory::DEFAULT_STACK_SIZE); 190 process->Run(base_address, Kernel::THREADPRIO_DEFAULT, Memory::DEFAULT_STACK_SIZE);
190 191
191 is_loaded = true; 192 is_loaded = true;
192 return ResultStatus::Success; 193 return ResultStatus::Success;
diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp
index 9fd9933fb..1a6876a22 100644
--- a/src/core/loader/nso.cpp
+++ b/src/core/loader/nso.cpp
@@ -13,6 +13,7 @@
13#include "core/gdbstub/gdbstub.h" 13#include "core/gdbstub/gdbstub.h"
14#include "core/hle/kernel/kernel.h" 14#include "core/hle/kernel/kernel.h"
15#include "core/hle/kernel/process.h" 15#include "core/hle/kernel/process.h"
16#include "core/hle/kernel/vm_manager.h"
16#include "core/loader/nso.h" 17#include "core/loader/nso.h"
17#include "core/memory.h" 18#include "core/memory.h"
18 19
@@ -158,11 +159,11 @@ ResultStatus AppLoader_NSO::Load(Kernel::SharedPtr<Kernel::Process>& process) {
158 } 159 }
159 160
160 // Load module 161 // Load module
161 LoadModule(file, Memory::PROCESS_IMAGE_VADDR); 162 const VAddr base_address = process->vm_manager.GetCodeRegionBaseAddress();
162 LOG_DEBUG(Loader, "loaded module {} @ 0x{:X}", file->GetName(), Memory::PROCESS_IMAGE_VADDR); 163 LoadModule(file, base_address);
164 LOG_DEBUG(Loader, "loaded module {} @ 0x{:X}", file->GetName(), base_address);
163 165
164 process->Run(Memory::PROCESS_IMAGE_VADDR, Kernel::THREADPRIO_DEFAULT, 166 process->Run(base_address, Kernel::THREADPRIO_DEFAULT, Memory::DEFAULT_STACK_SIZE);
165 Memory::DEFAULT_STACK_SIZE);
166 167
167 is_loaded = true; 168 is_loaded = true;
168 return ResultStatus::Success; 169 return ResultStatus::Success;
diff --git a/src/core/memory.cpp b/src/core/memory.cpp
index 674ef0829..6430daad4 100644
--- a/src/core/memory.cpp
+++ b/src/core/memory.cpp
@@ -14,11 +14,11 @@
14#include "core/arm/arm_interface.h" 14#include "core/arm/arm_interface.h"
15#include "core/core.h" 15#include "core/core.h"
16#include "core/hle/kernel/process.h" 16#include "core/hle/kernel/process.h"
17#include "core/hle/kernel/vm_manager.h"
17#include "core/hle/lock.h" 18#include "core/hle/lock.h"
18#include "core/memory.h" 19#include "core/memory.h"
19#include "core/memory_setup.h" 20#include "core/memory_setup.h"
20#include "video_core/renderer_base.h" 21#include "video_core/renderer_base.h"
21#include "video_core/video_core.h"
22 22
23namespace Memory { 23namespace Memory {
24 24
@@ -337,7 +337,7 @@ void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode) {
337 return; 337 return;
338 } 338 }
339 339
340 VAddr end = start + size; 340 const VAddr end = start + size;
341 341
342 const auto CheckRegion = [&](VAddr region_start, VAddr region_end) { 342 const auto CheckRegion = [&](VAddr region_start, VAddr region_end) {
343 if (start >= region_end || end <= region_start) { 343 if (start >= region_end || end <= region_start) {
@@ -347,7 +347,7 @@ void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode) {
347 347
348 const VAddr overlap_start = std::max(start, region_start); 348 const VAddr overlap_start = std::max(start, region_start);
349 const VAddr overlap_end = std::min(end, region_end); 349 const VAddr overlap_end = std::min(end, region_end);
350 const u64 overlap_size = overlap_end - overlap_start; 350 const VAddr overlap_size = overlap_end - overlap_start;
351 351
352 auto& rasterizer = system_instance.Renderer().Rasterizer(); 352 auto& rasterizer = system_instance.Renderer().Rasterizer();
353 switch (mode) { 353 switch (mode) {
@@ -363,8 +363,10 @@ void RasterizerFlushVirtualRegion(VAddr start, u64 size, FlushMode mode) {
363 } 363 }
364 }; 364 };
365 365
366 CheckRegion(PROCESS_IMAGE_VADDR, PROCESS_IMAGE_VADDR_END); 366 const auto& vm_manager = Core::CurrentProcess()->vm_manager;
367 CheckRegion(HEAP_VADDR, HEAP_VADDR_END); 367
368 CheckRegion(vm_manager.GetCodeRegionBaseAddress(), vm_manager.GetCodeRegionEndAddress());
369 CheckRegion(vm_manager.GetHeapRegionBaseAddress(), vm_manager.GetHeapRegionEndAddress());
368} 370}
369 371
370u8 Read8(const VAddr addr) { 372u8 Read8(const VAddr addr) {
diff --git a/src/core/memory.h b/src/core/memory.h
index 739e5be94..1acf5ce8c 100644
--- a/src/core/memory.h
+++ b/src/core/memory.h
@@ -93,11 +93,6 @@ struct PageTable {
93 93
94/// Virtual user-space memory regions 94/// Virtual user-space memory regions
95enum : VAddr { 95enum : VAddr {
96 /// Where the application text, data and bss reside.
97 PROCESS_IMAGE_VADDR = 0x08000000,
98 PROCESS_IMAGE_MAX_SIZE = 0x08000000,
99 PROCESS_IMAGE_VADDR_END = PROCESS_IMAGE_VADDR + PROCESS_IMAGE_MAX_SIZE,
100
101 /// Read-only page containing kernel and system configuration values. 96 /// Read-only page containing kernel and system configuration values.
102 CONFIG_MEMORY_VADDR = 0x1FF80000, 97 CONFIG_MEMORY_VADDR = 0x1FF80000,
103 CONFIG_MEMORY_SIZE = 0x00001000, 98 CONFIG_MEMORY_SIZE = 0x00001000,
@@ -108,36 +103,12 @@ enum : VAddr {
108 SHARED_PAGE_SIZE = 0x00001000, 103 SHARED_PAGE_SIZE = 0x00001000,
109 SHARED_PAGE_VADDR_END = SHARED_PAGE_VADDR + SHARED_PAGE_SIZE, 104 SHARED_PAGE_VADDR_END = SHARED_PAGE_VADDR + SHARED_PAGE_SIZE,
110 105
111 /// Area where TLS (Thread-Local Storage) buffers are allocated. 106 /// TLS (Thread-Local Storage) related.
112 TLS_AREA_VADDR = 0x40000000,
113 TLS_ENTRY_SIZE = 0x200, 107 TLS_ENTRY_SIZE = 0x200,
114 TLS_AREA_SIZE = 0x10000000,
115 TLS_AREA_VADDR_END = TLS_AREA_VADDR + TLS_AREA_SIZE,
116 108
117 /// Application stack 109 /// Application stack
118 STACK_AREA_VADDR = TLS_AREA_VADDR_END,
119 STACK_AREA_SIZE = 0x10000000,
120 STACK_AREA_VADDR_END = STACK_AREA_VADDR + STACK_AREA_SIZE,
121 DEFAULT_STACK_SIZE = 0x100000, 110 DEFAULT_STACK_SIZE = 0x100000,
122 111
123 /// Application heap
124 /// Size is confirmed to be a static value on fw 3.0.0
125 HEAP_VADDR = 0x108000000,
126 HEAP_SIZE = 0x180000000,
127 HEAP_VADDR_END = HEAP_VADDR + HEAP_SIZE,
128
129 /// New map region
130 /// Size is confirmed to be a static value on fw 3.0.0
131 NEW_MAP_REGION_VADDR = HEAP_VADDR_END,
132 NEW_MAP_REGION_SIZE = 0x80000000,
133 NEW_MAP_REGION_VADDR_END = NEW_MAP_REGION_VADDR + NEW_MAP_REGION_SIZE,
134
135 /// Map region
136 /// Size is confirmed to be a static value on fw 3.0.0
137 MAP_REGION_VADDR = NEW_MAP_REGION_VADDR_END,
138 MAP_REGION_SIZE = 0x1000000000,
139 MAP_REGION_VADDR_END = MAP_REGION_VADDR + MAP_REGION_SIZE,
140
141 /// Kernel Virtual Address Range 112 /// Kernel Virtual Address Range
142 KERNEL_REGION_VADDR = 0xFFFFFF8000000000, 113 KERNEL_REGION_VADDR = 0xFFFFFF8000000000,
143 KERNEL_REGION_SIZE = 0x7FFFE00000, 114 KERNEL_REGION_SIZE = 0x7FFFE00000,