diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/arm/arm_interface.h | 6 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic.cpp | 4 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic.h | 2 | ||||
| -rw-r--r-- | src/core/arm/unicorn/arm_unicorn.cpp | 4 | ||||
| -rw-r--r-- | src/core/arm/unicorn/arm_unicorn.h | 1 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.h | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/process.cpp | 21 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 12 | ||||
| -rw-r--r-- | src/core/hle/kernel/thread.cpp | 4 | ||||
| -rw-r--r-- | src/core/hle/kernel/vm_manager.cpp | 42 | ||||
| -rw-r--r-- | src/core/hle/kernel/vm_manager.h | 38 | ||||
| -rw-r--r-- | src/core/loader/elf.cpp | 2 | ||||
| -rw-r--r-- | src/core/loader/nro.cpp | 2 | ||||
| -rw-r--r-- | src/core/loader/nso.cpp | 2 | ||||
| -rw-r--r-- | src/core/memory.h | 48 |
15 files changed, 110 insertions, 82 deletions
diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h index 5ae60214e..6667c7dba 100644 --- a/src/core/arm/arm_interface.h +++ b/src/core/arm/arm_interface.h | |||
| @@ -39,8 +39,12 @@ public: | |||
| 39 | Run(1); | 39 | Run(1); |
| 40 | } | 40 | } |
| 41 | 41 | ||
| 42 | /// Maps a backing memory region for the CPU | ||
| 42 | virtual void MapBackingMemory(VAddr address, size_t size, u8* memory, | 43 | virtual void MapBackingMemory(VAddr address, size_t size, u8* memory, |
| 43 | Kernel::VMAPermission perms) {} | 44 | Kernel::VMAPermission perms) = 0; |
| 45 | |||
| 46 | /// Unmaps a region of memory that was previously mapped using MapBackingMemory | ||
| 47 | virtual void UnmapMemory(VAddr address, size_t size) = 0; | ||
| 44 | 48 | ||
| 45 | /// Clear all instruction cache | 49 | /// Clear all instruction cache |
| 46 | virtual void ClearInstructionCache() = 0; | 50 | virtual void ClearInstructionCache() = 0; |
diff --git a/src/core/arm/dynarmic/arm_dynarmic.cpp b/src/core/arm/dynarmic/arm_dynarmic.cpp index 4da07b177..0902c6df3 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic.cpp | |||
| @@ -136,6 +136,10 @@ void ARM_Dynarmic::MapBackingMemory(u64 address, size_t size, u8* memory, | |||
| 136 | inner_unicorn.MapBackingMemory(address, size, memory, perms); | 136 | inner_unicorn.MapBackingMemory(address, size, memory, perms); |
| 137 | } | 137 | } |
| 138 | 138 | ||
| 139 | void ARM_Dynarmic::UnmapMemory(u64 address, size_t size) { | ||
| 140 | inner_unicorn.UnmapMemory(address, size); | ||
| 141 | } | ||
| 142 | |||
| 139 | void ARM_Dynarmic::SetPC(u64 pc) { | 143 | void ARM_Dynarmic::SetPC(u64 pc) { |
| 140 | jit->SetPC(pc); | 144 | jit->SetPC(pc); |
| 141 | } | 145 | } |
diff --git a/src/core/arm/dynarmic/arm_dynarmic.h b/src/core/arm/dynarmic/arm_dynarmic.h index 1d9dcf5ff..fd1a44802 100644 --- a/src/core/arm/dynarmic/arm_dynarmic.h +++ b/src/core/arm/dynarmic/arm_dynarmic.h | |||
| @@ -19,7 +19,7 @@ public: | |||
| 19 | 19 | ||
| 20 | void MapBackingMemory(VAddr address, size_t size, u8* memory, | 20 | void MapBackingMemory(VAddr address, size_t size, u8* memory, |
| 21 | Kernel::VMAPermission perms) override; | 21 | Kernel::VMAPermission perms) override; |
| 22 | 22 | void UnmapMemory(u64 address, size_t size) override; | |
| 23 | void SetPC(u64 pc) override; | 23 | void SetPC(u64 pc) override; |
| 24 | u64 GetPC() const override; | 24 | u64 GetPC() const override; |
| 25 | u64 GetReg(int index) const override; | 25 | u64 GetReg(int index) const override; |
diff --git a/src/core/arm/unicorn/arm_unicorn.cpp b/src/core/arm/unicorn/arm_unicorn.cpp index 5d2956bfd..162c766fd 100644 --- a/src/core/arm/unicorn/arm_unicorn.cpp +++ b/src/core/arm/unicorn/arm_unicorn.cpp | |||
| @@ -77,6 +77,10 @@ void ARM_Unicorn::MapBackingMemory(VAddr address, size_t size, u8* memory, | |||
| 77 | CHECKED(uc_mem_map_ptr(uc, address, size, static_cast<u32>(perms), memory)); | 77 | CHECKED(uc_mem_map_ptr(uc, address, size, static_cast<u32>(perms), memory)); |
| 78 | } | 78 | } |
| 79 | 79 | ||
| 80 | void ARM_Unicorn::UnmapMemory(VAddr address, size_t size) { | ||
| 81 | CHECKED(uc_mem_unmap(uc, address, size)); | ||
| 82 | } | ||
| 83 | |||
| 80 | void ARM_Unicorn::SetPC(u64 pc) { | 84 | void ARM_Unicorn::SetPC(u64 pc) { |
| 81 | CHECKED(uc_reg_write(uc, UC_ARM64_REG_PC, &pc)); | 85 | CHECKED(uc_reg_write(uc, UC_ARM64_REG_PC, &pc)); |
| 82 | } | 86 | } |
diff --git a/src/core/arm/unicorn/arm_unicorn.h b/src/core/arm/unicorn/arm_unicorn.h index c9a561dec..00b5b1865 100644 --- a/src/core/arm/unicorn/arm_unicorn.h +++ b/src/core/arm/unicorn/arm_unicorn.h | |||
| @@ -14,6 +14,7 @@ public: | |||
| 14 | ~ARM_Unicorn(); | 14 | ~ARM_Unicorn(); |
| 15 | void MapBackingMemory(VAddr address, size_t size, u8* memory, | 15 | void MapBackingMemory(VAddr address, size_t size, u8* memory, |
| 16 | Kernel::VMAPermission perms) override; | 16 | Kernel::VMAPermission perms) override; |
| 17 | void UnmapMemory(VAddr address, size_t size) override; | ||
| 17 | void SetPC(u64 pc) override; | 18 | void SetPC(u64 pc) override; |
| 18 | u64 GetPC() const override; | 19 | u64 GetPC() const override; |
| 19 | u64 GetReg(int index) const override; | 20 | u64 GetReg(int index) const override; |
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h index c77e58f3c..053bf4e17 100644 --- a/src/core/hle/kernel/kernel.h +++ b/src/core/hle/kernel/kernel.h | |||
| @@ -33,10 +33,6 @@ enum class HandleType : u32 { | |||
| 33 | ServerSession, | 33 | ServerSession, |
| 34 | }; | 34 | }; |
| 35 | 35 | ||
| 36 | enum { | ||
| 37 | DEFAULT_STACK_SIZE = 0x10000, | ||
| 38 | }; | ||
| 39 | |||
| 40 | enum class ResetType { | 36 | enum class ResetType { |
| 41 | OneShot, | 37 | OneShot, |
| 42 | Sticky, | 38 | Sticky, |
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp index 9ca2374ea..3694afc60 100644 --- a/src/core/hle/kernel/process.cpp +++ b/src/core/hle/kernel/process.cpp | |||
| @@ -117,11 +117,12 @@ void Process::ParseKernelCaps(const u32* kernel_caps, size_t len) { | |||
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | void Process::Run(VAddr entry_point, s32 main_thread_priority, u32 stack_size) { | 119 | void Process::Run(VAddr entry_point, s32 main_thread_priority, u32 stack_size) { |
| 120 | // Allocate and map stack | 120 | // Allocate and map the main thread stack |
| 121 | // TODO(bunnei): This is heap area that should be allocated by the kernel and not mapped as part | ||
| 122 | // of the user address space. | ||
| 121 | vm_manager | 123 | vm_manager |
| 122 | .MapMemoryBlock(Memory::HEAP_VADDR_END - stack_size, | 124 | .MapMemoryBlock(Memory::STACK_VADDR, std::make_shared<std::vector<u8>>(stack_size, 0), 0, |
| 123 | std::make_shared<std::vector<u8>>(stack_size, 0), 0, stack_size, | 125 | stack_size, MemoryState::Mapped) |
| 124 | MemoryState::Heap) | ||
| 125 | .Unwrap(); | 126 | .Unwrap(); |
| 126 | misc_memory_used += stack_size; | 127 | misc_memory_used += stack_size; |
| 127 | memory_region->used += stack_size; | 128 | memory_region->used += stack_size; |
| @@ -153,9 +154,9 @@ void Process::LoadModule(SharedPtr<CodeSet> module_, VAddr base_addr) { | |||
| 153 | }; | 154 | }; |
| 154 | 155 | ||
| 155 | // Map CodeSet segments | 156 | // Map CodeSet segments |
| 156 | MapSegment(module_->code, VMAPermission::ReadExecute, MemoryState::Code); | 157 | MapSegment(module_->code, VMAPermission::ReadExecute, MemoryState::CodeStatic); |
| 157 | MapSegment(module_->rodata, VMAPermission::Read, MemoryState::Static); | 158 | MapSegment(module_->rodata, VMAPermission::Read, MemoryState::CodeMutable); |
| 158 | MapSegment(module_->data, VMAPermission::ReadWrite, MemoryState::Static); | 159 | MapSegment(module_->data, VMAPermission::ReadWrite, MemoryState::CodeMutable); |
| 159 | } | 160 | } |
| 160 | 161 | ||
| 161 | VAddr Process::GetLinearHeapAreaAddress() const { | 162 | VAddr Process::GetLinearHeapAreaAddress() const { |
| @@ -182,6 +183,8 @@ ResultVal<VAddr> Process::HeapAllocate(VAddr target, u64 size, VMAPermission per | |||
| 182 | // Initialize heap | 183 | // Initialize heap |
| 183 | heap_memory = std::make_shared<std::vector<u8>>(); | 184 | heap_memory = std::make_shared<std::vector<u8>>(); |
| 184 | heap_start = heap_end = target; | 185 | heap_start = heap_end = target; |
| 186 | } else { | ||
| 187 | vm_manager.UnmapRange(heap_start, heap_end - heap_start); | ||
| 185 | } | 188 | } |
| 186 | 189 | ||
| 187 | // If necessary, expand backing vector to cover new heap extents. | 190 | // If necessary, expand backing vector to cover new heap extents. |
| @@ -201,7 +204,7 @@ ResultVal<VAddr> Process::HeapAllocate(VAddr target, u64 size, VMAPermission per | |||
| 201 | size, MemoryState::Heap)); | 204 | size, MemoryState::Heap)); |
| 202 | vm_manager.Reprotect(vma, perms); | 205 | vm_manager.Reprotect(vma, perms); |
| 203 | 206 | ||
| 204 | heap_used += size; | 207 | heap_used = size; |
| 205 | memory_region->used += size; | 208 | memory_region->used += size; |
| 206 | 209 | ||
| 207 | return MakeResult<VAddr>(heap_end - size); | 210 | return MakeResult<VAddr>(heap_end - size); |
| @@ -288,7 +291,7 @@ ResultCode Process::MirrorMemory(VAddr dst_addr, VAddr src_addr, u64 size) { | |||
| 288 | 291 | ||
| 289 | CASCADE_RESULT(auto new_vma, | 292 | CASCADE_RESULT(auto new_vma, |
| 290 | vm_manager.MapMemoryBlock(dst_addr, backing_block, backing_block_offset, size, | 293 | vm_manager.MapMemoryBlock(dst_addr, backing_block, backing_block_offset, size, |
| 291 | vma->second.meminfo_state)); | 294 | MemoryState::Mapped)); |
| 292 | // Protect mirror with permissions from old region | 295 | // Protect mirror with permissions from old region |
| 293 | vm_manager.Reprotect(new_vma, vma->second.permissions); | 296 | vm_manager.Reprotect(new_vma, vma->second.permissions); |
| 294 | // Remove permissions from old region | 297 | // Remove permissions from old region |
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 207583320..118ce3ee5 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -317,13 +317,13 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id) | |||
| 317 | *result = Core::CurrentProcess()->allowed_thread_priority_mask; | 317 | *result = Core::CurrentProcess()->allowed_thread_priority_mask; |
| 318 | break; | 318 | break; |
| 319 | case GetInfoType::MapRegionBaseAddr: | 319 | case GetInfoType::MapRegionBaseAddr: |
| 320 | *result = vm_manager.GetMapRegionBaseAddr(); | 320 | *result = Memory::MAP_REGION_VADDR; |
| 321 | break; | 321 | break; |
| 322 | case GetInfoType::MapRegionSize: | 322 | case GetInfoType::MapRegionSize: |
| 323 | *result = vm_manager.GetAddressSpaceSize(); | 323 | *result = Memory::MAP_REGION_SIZE; |
| 324 | break; | 324 | break; |
| 325 | case GetInfoType::HeapRegionBaseAddr: | 325 | case GetInfoType::HeapRegionBaseAddr: |
| 326 | *result = vm_manager.GetNewMapRegionBaseAddr() + vm_manager.GetNewMapRegionSize(); | 326 | *result = Memory::HEAP_VADDR; |
| 327 | break; | 327 | break; |
| 328 | case GetInfoType::HeapRegionSize: | 328 | case GetInfoType::HeapRegionSize: |
| 329 | *result = Memory::HEAP_SIZE; | 329 | *result = Memory::HEAP_SIZE; |
| @@ -347,10 +347,10 @@ static ResultCode GetInfo(u64* result, u64 info_id, u64 handle, u64 info_sub_id) | |||
| 347 | *result = vm_manager.GetAddressSpaceSize(); | 347 | *result = vm_manager.GetAddressSpaceSize(); |
| 348 | break; | 348 | break; |
| 349 | case GetInfoType::NewMapRegionBaseAddr: | 349 | case GetInfoType::NewMapRegionBaseAddr: |
| 350 | *result = vm_manager.GetNewMapRegionBaseAddr(); | 350 | *result = Memory::NEW_MAP_REGION_VADDR; |
| 351 | break; | 351 | break; |
| 352 | case GetInfoType::NewMapRegionSize: | 352 | case GetInfoType::NewMapRegionSize: |
| 353 | *result = vm_manager.GetNewMapRegionSize(); | 353 | *result = Memory::NEW_MAP_REGION_SIZE; |
| 354 | break; | 354 | break; |
| 355 | case GetInfoType::IsVirtualAddressMemoryEnabled: | 355 | case GetInfoType::IsVirtualAddressMemoryEnabled: |
| 356 | *result = Core::CurrentProcess()->is_virtual_address_memory_enabled; | 356 | *result = Core::CurrentProcess()->is_virtual_address_memory_enabled; |
| @@ -468,7 +468,7 @@ static ResultCode QueryProcessMemory(MemoryInfo* memory_info, PageInfo* /*page_i | |||
| 468 | memory_info->base_address = 0; | 468 | memory_info->base_address = 0; |
| 469 | memory_info->permission = static_cast<u32>(VMAPermission::None); | 469 | memory_info->permission = static_cast<u32>(VMAPermission::None); |
| 470 | memory_info->size = 0; | 470 | memory_info->size = 0; |
| 471 | memory_info->type = static_cast<u32>(MemoryState::Free); | 471 | memory_info->type = static_cast<u32>(MemoryState::Unmapped); |
| 472 | } else { | 472 | } else { |
| 473 | memory_info->base_address = vma->second.base; | 473 | memory_info->base_address = vma->second.base; |
| 474 | memory_info->permission = static_cast<u32>(vma->second.permissions); | 474 | memory_info->permission = static_cast<u32>(vma->second.permissions); |
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp index 2394620eb..a39c53db5 100644 --- a/src/core/hle/kernel/thread.cpp +++ b/src/core/hle/kernel/thread.cpp | |||
| @@ -314,7 +314,7 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point, | |||
| 314 | // TODO(Subv): Find the correct MemoryState for this region. | 314 | // TODO(Subv): Find the correct MemoryState for this region. |
| 315 | vm_manager.MapMemoryBlock(Memory::TLS_AREA_VADDR + available_page * Memory::PAGE_SIZE, | 315 | vm_manager.MapMemoryBlock(Memory::TLS_AREA_VADDR + available_page * Memory::PAGE_SIZE, |
| 316 | linheap_memory, offset, Memory::PAGE_SIZE, | 316 | linheap_memory, offset, Memory::PAGE_SIZE, |
| 317 | MemoryState::ThreadLocalStorage); | 317 | MemoryState::ThreadLocal); |
| 318 | } | 318 | } |
| 319 | 319 | ||
| 320 | // Mark the slot as used | 320 | // Mark the slot as used |
| @@ -357,7 +357,7 @@ SharedPtr<Thread> SetupMainThread(VAddr entry_point, u32 priority, | |||
| 357 | 357 | ||
| 358 | // Initialize new "main" thread | 358 | // Initialize new "main" thread |
| 359 | auto thread_res = Thread::Create("main", entry_point, priority, 0, THREADPROCESSORID_0, | 359 | auto thread_res = Thread::Create("main", entry_point, priority, 0, THREADPROCESSORID_0, |
| 360 | Memory::HEAP_VADDR_END, owner_process); | 360 | Memory::STACK_VADDR_END, owner_process); |
| 361 | 361 | ||
| 362 | SharedPtr<Thread> thread = std::move(thread_res).Unwrap(); | 362 | SharedPtr<Thread> thread = std::move(thread_res).Unwrap(); |
| 363 | 363 | ||
diff --git a/src/core/hle/kernel/vm_manager.cpp b/src/core/hle/kernel/vm_manager.cpp index d5b36d71a..1c2f873aa 100644 --- a/src/core/hle/kernel/vm_manager.cpp +++ b/src/core/hle/kernel/vm_manager.cpp | |||
| @@ -18,8 +18,26 @@ namespace Kernel { | |||
| 18 | 18 | ||
| 19 | static const char* GetMemoryStateName(MemoryState state) { | 19 | static const char* GetMemoryStateName(MemoryState state) { |
| 20 | static const char* names[] = { | 20 | static const char* names[] = { |
| 21 | "Free", "Reserved", "IO", "Static", "Code", "Private", | 21 | "Unmapped", |
| 22 | "Shared", "Continuous", "Aliased", "Alias", "AliasCode", "Locked", | 22 | "Io", |
| 23 | "Normal", | ||
| 24 | "CodeStatic", | ||
| 25 | "CodeMutable", | ||
| 26 | "Heap", | ||
| 27 | "Shared", | ||
| 28 | "Unknown1" | ||
| 29 | "ModuleCodeStatic", | ||
| 30 | "ModuleCodeMutable", | ||
| 31 | "IpcBuffer0", | ||
| 32 | "Mapped", | ||
| 33 | "ThreadLocal", | ||
| 34 | "TransferMemoryIsolated", | ||
| 35 | "TransferMemory", | ||
| 36 | "ProcessMemory", | ||
| 37 | "Unknown2" | ||
| 38 | "IpcBuffer1", | ||
| 39 | "IpcBuffer3", | ||
| 40 | "KernelStack", | ||
| 23 | }; | 41 | }; |
| 24 | 42 | ||
| 25 | return names[(int)state]; | 43 | return names[(int)state]; |
| @@ -142,7 +160,7 @@ VMManager::VMAIter VMManager::Unmap(VMAIter vma_handle) { | |||
| 142 | VirtualMemoryArea& vma = vma_handle->second; | 160 | VirtualMemoryArea& vma = vma_handle->second; |
| 143 | vma.type = VMAType::Free; | 161 | vma.type = VMAType::Free; |
| 144 | vma.permissions = VMAPermission::None; | 162 | vma.permissions = VMAPermission::None; |
| 145 | vma.meminfo_state = MemoryState::Free; | 163 | vma.meminfo_state = MemoryState::Unmapped; |
| 146 | 164 | ||
| 147 | vma.backing_block = nullptr; | 165 | vma.backing_block = nullptr; |
| 148 | vma.offset = 0; | 166 | vma.offset = 0; |
| @@ -166,6 +184,9 @@ ResultCode VMManager::UnmapRange(VAddr target, u64 size) { | |||
| 166 | } | 184 | } |
| 167 | 185 | ||
| 168 | ASSERT(FindVMA(target)->second.size >= size); | 186 | ASSERT(FindVMA(target)->second.size >= size); |
| 187 | |||
| 188 | Core::CPU().UnmapMemory(target, size); | ||
| 189 | |||
| 169 | return RESULT_SUCCESS; | 190 | return RESULT_SUCCESS; |
| 170 | } | 191 | } |
| 171 | 192 | ||
| @@ -377,19 +398,4 @@ u64 VMManager::GetAddressSpaceSize() { | |||
| 377 | return MAX_ADDRESS; | 398 | return MAX_ADDRESS; |
| 378 | } | 399 | } |
| 379 | 400 | ||
| 380 | VAddr VMManager::GetMapRegionBaseAddr() { | ||
| 381 | LOG_WARNING(Kernel, "(STUBBED) called"); | ||
| 382 | return Memory::HEAP_VADDR; | ||
| 383 | } | ||
| 384 | |||
| 385 | VAddr VMManager::GetNewMapRegionBaseAddr() { | ||
| 386 | LOG_WARNING(Kernel, "(STUBBED) called"); | ||
| 387 | return 0x8000000; | ||
| 388 | } | ||
| 389 | |||
| 390 | u64 VMManager::GetNewMapRegionSize() { | ||
| 391 | LOG_WARNING(Kernel, "(STUBBED) called"); | ||
| 392 | return 0x8000000; | ||
| 393 | } | ||
| 394 | |||
| 395 | } // namespace Kernel | 401 | } // namespace Kernel |
diff --git a/src/core/hle/kernel/vm_manager.h b/src/core/hle/kernel/vm_manager.h index 8de704a60..4d66146f6 100644 --- a/src/core/hle/kernel/vm_manager.h +++ b/src/core/hle/kernel/vm_manager.h | |||
| @@ -41,15 +41,24 @@ enum class VMAPermission : u8 { | |||
| 41 | 41 | ||
| 42 | /// Set of values returned in MemoryInfo.state by svcQueryMemory. | 42 | /// Set of values returned in MemoryInfo.state by svcQueryMemory. |
| 43 | enum class MemoryState : u32 { | 43 | enum class MemoryState : u32 { |
| 44 | Free = 0, | 44 | Unmapped = 0x0, |
| 45 | IO = 1, | 45 | Io = 0x1, |
| 46 | Normal = 2, | 46 | Normal = 0x2, |
| 47 | Code = 3, | 47 | CodeStatic = 0x3, |
| 48 | Static = 4, | 48 | CodeMutable = 0x4, |
| 49 | Heap = 5, | 49 | Heap = 0x5, |
| 50 | Shared = 6, | 50 | Shared = 0x6, |
| 51 | Mapped = 6, | 51 | ModuleCodeStatic = 0x8, |
| 52 | ThreadLocalStorage = 12, | 52 | ModuleCodeMutable = 0x9, |
| 53 | IpcBuffer0 = 0xA, | ||
| 54 | Mapped = 0xB, | ||
| 55 | ThreadLocal = 0xC, | ||
| 56 | TransferMemoryIsolated = 0xD, | ||
| 57 | TransferMemory = 0xE, | ||
| 58 | ProcessMemory = 0xF, | ||
| 59 | IpcBuffer1 = 0x11, | ||
| 60 | IpcBuffer3 = 0x12, | ||
| 61 | KernelStack = 0x13, | ||
| 53 | }; | 62 | }; |
| 54 | 63 | ||
| 55 | /** | 64 | /** |
| @@ -66,7 +75,7 @@ struct VirtualMemoryArea { | |||
| 66 | VMAType type = VMAType::Free; | 75 | VMAType type = VMAType::Free; |
| 67 | VMAPermission permissions = VMAPermission::None; | 76 | VMAPermission permissions = VMAPermission::None; |
| 68 | /// Tag returned by svcQueryMemory. Not otherwise used. | 77 | /// Tag returned by svcQueryMemory. Not otherwise used. |
| 69 | MemoryState meminfo_state = MemoryState::Free; | 78 | MemoryState meminfo_state = MemoryState::Unmapped; |
| 70 | 79 | ||
| 71 | // Settings for type = AllocatedMemoryBlock | 80 | // Settings for type = AllocatedMemoryBlock |
| 72 | /// Memory block backing this VMA. | 81 | /// Memory block backing this VMA. |
| @@ -192,15 +201,6 @@ public: | |||
| 192 | /// Gets the total address space address size, used by svcGetInfo | 201 | /// Gets the total address space address size, used by svcGetInfo |
| 193 | u64 GetAddressSpaceSize(); | 202 | u64 GetAddressSpaceSize(); |
| 194 | 203 | ||
| 195 | /// Gets the map region base address, used by svcGetInfo | ||
| 196 | VAddr GetMapRegionBaseAddr(); | ||
| 197 | |||
| 198 | /// Gets the base address for a new memory region, used by svcGetInfo | ||
| 199 | VAddr GetNewMapRegionBaseAddr(); | ||
| 200 | |||
| 201 | /// Gets the size for a new memory region, used by svcGetInfo | ||
| 202 | u64 GetNewMapRegionSize(); | ||
| 203 | |||
| 204 | /// Each VMManager has its own page table, which is set as the main one when the owning process | 204 | /// Each VMManager has its own page table, which is set as the main one when the owning process |
| 205 | /// is scheduled. | 205 | /// is scheduled. |
| 206 | Memory::PageTable page_table; | 206 | Memory::PageTable page_table; |
diff --git a/src/core/loader/elf.cpp b/src/core/loader/elf.cpp index 164d52258..0ba8c6fd2 100644 --- a/src/core/loader/elf.cpp +++ b/src/core/loader/elf.cpp | |||
| @@ -414,7 +414,7 @@ ResultStatus AppLoader_ELF::Load(Kernel::SharedPtr<Kernel::Process>& process) { | |||
| 414 | process->resource_limit = | 414 | process->resource_limit = |
| 415 | Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION); | 415 | Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION); |
| 416 | 416 | ||
| 417 | process->Run(codeset->entrypoint, 48, Kernel::DEFAULT_STACK_SIZE); | 417 | process->Run(codeset->entrypoint, 48, Memory::STACK_SIZE); |
| 418 | 418 | ||
| 419 | is_loaded = true; | 419 | is_loaded = true; |
| 420 | return ResultStatus::Success; | 420 | return ResultStatus::Success; |
diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp index 0dc06ccea..6dcd1ce48 100644 --- a/src/core/loader/nro.cpp +++ b/src/core/loader/nro.cpp | |||
| @@ -137,7 +137,7 @@ ResultStatus AppLoader_NRO::Load(Kernel::SharedPtr<Kernel::Process>& process) { | |||
| 137 | process->address_mappings = default_address_mappings; | 137 | process->address_mappings = default_address_mappings; |
| 138 | process->resource_limit = | 138 | process->resource_limit = |
| 139 | Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION); | 139 | Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION); |
| 140 | process->Run(base_addr, 48, Kernel::DEFAULT_STACK_SIZE); | 140 | process->Run(base_addr, 48, Memory::STACK_SIZE); |
| 141 | 141 | ||
| 142 | is_loaded = true; | 142 | is_loaded = true; |
| 143 | return ResultStatus::Success; | 143 | return ResultStatus::Success; |
diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp index c0eeb95d3..100aa022e 100644 --- a/src/core/loader/nso.cpp +++ b/src/core/loader/nso.cpp | |||
| @@ -165,7 +165,7 @@ ResultStatus AppLoader_NSO::Load(Kernel::SharedPtr<Kernel::Process>& process) { | |||
| 165 | process->address_mappings = default_address_mappings; | 165 | process->address_mappings = default_address_mappings; |
| 166 | process->resource_limit = | 166 | process->resource_limit = |
| 167 | Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION); | 167 | Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION); |
| 168 | process->Run(Memory::PROCESS_IMAGE_VADDR, 48, Kernel::DEFAULT_STACK_SIZE); | 168 | process->Run(Memory::PROCESS_IMAGE_VADDR, 48, Memory::STACK_SIZE); |
| 169 | 169 | ||
| 170 | is_loaded = true; | 170 | is_loaded = true; |
| 171 | return ResultStatus::Success; | 171 | return ResultStatus::Success; |
diff --git a/src/core/memory.h b/src/core/memory.h index f3ace7a98..f406cc848 100644 --- a/src/core/memory.h +++ b/src/core/memory.h | |||
| @@ -129,21 +129,6 @@ enum : VAddr { | |||
| 129 | PROCESS_IMAGE_MAX_SIZE = 0x08000000, | 129 | PROCESS_IMAGE_MAX_SIZE = 0x08000000, |
| 130 | PROCESS_IMAGE_VADDR_END = PROCESS_IMAGE_VADDR + PROCESS_IMAGE_MAX_SIZE, | 130 | PROCESS_IMAGE_VADDR_END = PROCESS_IMAGE_VADDR + PROCESS_IMAGE_MAX_SIZE, |
| 131 | 131 | ||
| 132 | /// Area where IPC buffers are mapped onto. | ||
| 133 | IPC_MAPPING_VADDR = 0x04000000, | ||
| 134 | IPC_MAPPING_SIZE = 0x04000000, | ||
| 135 | IPC_MAPPING_VADDR_END = IPC_MAPPING_VADDR + IPC_MAPPING_SIZE, | ||
| 136 | |||
| 137 | /// Application heap (includes stack). | ||
| 138 | HEAP_VADDR = 0x108000000, | ||
| 139 | HEAP_SIZE = 0xF0000000, | ||
| 140 | HEAP_VADDR_END = HEAP_VADDR + HEAP_SIZE, | ||
| 141 | |||
| 142 | /// Area where shared memory buffers are mapped onto. | ||
| 143 | SHARED_MEMORY_VADDR = 0x10000000, | ||
| 144 | SHARED_MEMORY_SIZE = 0x04000000, | ||
| 145 | SHARED_MEMORY_VADDR_END = SHARED_MEMORY_VADDR + SHARED_MEMORY_SIZE, | ||
| 146 | |||
| 147 | /// Maps 1:1 to an offset in FCRAM. Used for HW allocations that need to be linear in physical | 132 | /// Maps 1:1 to an offset in FCRAM. Used for HW allocations that need to be linear in physical |
| 148 | /// memory. | 133 | /// memory. |
| 149 | LINEAR_HEAP_VADDR = 0x14000000, | 134 | LINEAR_HEAP_VADDR = 0x14000000, |
| @@ -176,14 +161,39 @@ enum : VAddr { | |||
| 176 | SHARED_PAGE_SIZE = 0x00001000, | 161 | SHARED_PAGE_SIZE = 0x00001000, |
| 177 | SHARED_PAGE_VADDR_END = SHARED_PAGE_VADDR + SHARED_PAGE_SIZE, | 162 | SHARED_PAGE_VADDR_END = SHARED_PAGE_VADDR + SHARED_PAGE_SIZE, |
| 178 | 163 | ||
| 179 | /// Area where TLS (Thread-Local Storage) buffers are allocated. | ||
| 180 | TLS_AREA_VADDR = 0x228000000, | ||
| 181 | TLS_ENTRY_SIZE = 0x200, | ||
| 182 | |||
| 183 | /// Equivalent to LINEAR_HEAP_VADDR, but expanded to cover the extra memory in the New 3DS. | 164 | /// Equivalent to LINEAR_HEAP_VADDR, but expanded to cover the extra memory in the New 3DS. |
| 184 | NEW_LINEAR_HEAP_VADDR = 0x30000000, | 165 | NEW_LINEAR_HEAP_VADDR = 0x30000000, |
| 185 | NEW_LINEAR_HEAP_SIZE = 0x10000000, | 166 | NEW_LINEAR_HEAP_SIZE = 0x10000000, |
| 186 | NEW_LINEAR_HEAP_VADDR_END = NEW_LINEAR_HEAP_VADDR + NEW_LINEAR_HEAP_SIZE, | 167 | NEW_LINEAR_HEAP_VADDR_END = NEW_LINEAR_HEAP_VADDR + NEW_LINEAR_HEAP_SIZE, |
| 168 | |||
| 169 | /// Area where TLS (Thread-Local Storage) buffers are allocated. | ||
| 170 | TLS_AREA_VADDR = NEW_LINEAR_HEAP_VADDR_END, | ||
| 171 | TLS_ENTRY_SIZE = 0x200, | ||
| 172 | TLS_AREA_SIZE = 0x10000000, | ||
| 173 | TLS_ADREA_VADDR_END = TLS_AREA_VADDR + TLS_AREA_SIZE, | ||
| 174 | |||
| 175 | /// Application stack | ||
| 176 | STACK_VADDR = TLS_ADREA_VADDR_END, | ||
| 177 | STACK_SIZE = 0x10000, | ||
| 178 | STACK_VADDR_END = STACK_VADDR + STACK_SIZE, | ||
| 179 | |||
| 180 | /// Application heap | ||
| 181 | /// Size is confirmed to be a static value on fw 3.0.0 | ||
| 182 | HEAP_VADDR = 0x108000000, | ||
| 183 | HEAP_SIZE = 0x180000000, | ||
| 184 | HEAP_VADDR_END = HEAP_VADDR + HEAP_SIZE, | ||
| 185 | |||
| 186 | /// New map region | ||
| 187 | /// Size is confirmed to be a static value on fw 3.0.0 | ||
| 188 | NEW_MAP_REGION_VADDR = HEAP_VADDR_END, | ||
| 189 | NEW_MAP_REGION_SIZE = 0x80000000, | ||
| 190 | NEW_MAP_REGION_VADDR_END = NEW_MAP_REGION_VADDR + NEW_MAP_REGION_SIZE, | ||
| 191 | |||
| 192 | /// Map region | ||
| 193 | /// Size is confirmed to be a static value on fw 3.0.0 | ||
| 194 | MAP_REGION_VADDR = NEW_MAP_REGION_VADDR_END, | ||
| 195 | MAP_REGION_SIZE = 0x1000000000, | ||
| 196 | MAP_REGION_VADDR_END = MAP_REGION_VADDR + MAP_REGION_SIZE, | ||
| 187 | }; | 197 | }; |
| 188 | 198 | ||
| 189 | /// Currently active page table | 199 | /// Currently active page table |