diff options
| -rw-r--r-- | src/core/gdbstub/gdbstub.cpp | 15 | ||||
| -rw-r--r-- | src/core/hle/kernel/process.cpp | 20 | ||||
| -rw-r--r-- | src/core/hle/kernel/shared_memory.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 3 | ||||
| -rw-r--r-- | src/core/hle/kernel/thread.cpp | 3 | ||||
| -rw-r--r-- | src/core/loader/deconstructed_rom_directory.cpp | 7 | ||||
| -rw-r--r-- | src/core/loader/elf.cpp | 24 | ||||
| -rw-r--r-- | src/core/loader/nro.cpp | 7 | ||||
| -rw-r--r-- | src/core/loader/nso.cpp | 9 | ||||
| -rw-r--r-- | src/core/memory.cpp | 12 | ||||
| -rw-r--r-- | src/core/memory.h | 31 |
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 | ||
| 194 | VAddr Process::MarkNextAvailableTLSSlotAsUsed(Thread& thread) { | 194 | VAddr 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 | ||
| 218 | void Process::FreeTLSSlot(VAddr tls_address) { | 218 | void 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 | ||
| 242 | ResultVal<VAddr> Process::HeapAllocate(VAddr target, u64 size, VMAPermission perms) { | 242 | ResultVal<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 | ||
| 278 | ResultCode Process::HeapFree(VAddr target, u32 size) { | 278 | ResultCode 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 | ||
| 22 | namespace Loader { | 21 | namespace 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 | ||
| 193 | public: | 194 | public: |
| 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 | ||
| 276 | SharedPtr<CodeSet> ElfReader::LoadInto(u32 vaddr) { | 277 | SharedPtr<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 | ||
| 23 | namespace Memory { | 23 | namespace 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 | ||
| 370 | u8 Read8(const VAddr addr) { | 372 | u8 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 |
| 95 | enum : VAddr { | 95 | enum : 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, |