summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2018-03-16 20:06:27 -0400
committerGravatar GitHub2018-03-16 20:06:27 -0400
commite7ba2a4447bb06146f23163e82689852bf83008e (patch)
tree7ff83f9d4b4fd4df5f48333d07fb743e3c4531cb /src
parentMerge pull request #237 from mailwl/nifm-module (diff)
parentprocess: MirrorMemory should use MemoryState::Mapped. (diff)
downloadyuzu-e7ba2a4447bb06146f23163e82689852bf83008e.tar.gz
yuzu-e7ba2a4447bb06146f23163e82689852bf83008e.tar.xz
yuzu-e7ba2a4447bb06146f23163e82689852bf83008e.zip
Merge pull request #232 from bunnei/heap-fixes
Various heap fixes for libtransistor
Diffstat (limited to 'src')
-rw-r--r--src/core/arm/arm_interface.h6
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic.cpp4
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic.h2
-rw-r--r--src/core/arm/unicorn/arm_unicorn.cpp4
-rw-r--r--src/core/arm/unicorn/arm_unicorn.h1
-rw-r--r--src/core/hle/kernel/kernel.h4
-rw-r--r--src/core/hle/kernel/process.cpp21
-rw-r--r--src/core/hle/kernel/svc.cpp12
-rw-r--r--src/core/hle/kernel/thread.cpp4
-rw-r--r--src/core/hle/kernel/vm_manager.cpp42
-rw-r--r--src/core/hle/kernel/vm_manager.h38
-rw-r--r--src/core/loader/elf.cpp2
-rw-r--r--src/core/loader/nro.cpp2
-rw-r--r--src/core/loader/nso.cpp2
-rw-r--r--src/core/memory.h48
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
139void ARM_Dynarmic::UnmapMemory(u64 address, size_t size) {
140 inner_unicorn.UnmapMemory(address, size);
141}
142
139void ARM_Dynarmic::SetPC(u64 pc) { 143void 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
80void ARM_Unicorn::UnmapMemory(VAddr address, size_t size) {
81 CHECKED(uc_mem_unmap(uc, address, size));
82}
83
80void ARM_Unicorn::SetPC(u64 pc) { 84void 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
36enum {
37 DEFAULT_STACK_SIZE = 0x10000,
38};
39
40enum class ResetType { 36enum 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
119void Process::Run(VAddr entry_point, s32 main_thread_priority, u32 stack_size) { 119void 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
161VAddr Process::GetLinearHeapAreaAddress() const { 162VAddr 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
19static const char* GetMemoryStateName(MemoryState state) { 19static 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
380VAddr VMManager::GetMapRegionBaseAddr() {
381 LOG_WARNING(Kernel, "(STUBBED) called");
382 return Memory::HEAP_VADDR;
383}
384
385VAddr VMManager::GetNewMapRegionBaseAddr() {
386 LOG_WARNING(Kernel, "(STUBBED) called");
387 return 0x8000000;
388}
389
390u64 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.
43enum class MemoryState : u32 { 43enum 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