diff options
| author | 2018-03-16 20:06:27 -0400 | |
|---|---|---|
| committer | 2018-03-16 20:06:27 -0400 | |
| commit | e7ba2a4447bb06146f23163e82689852bf83008e (patch) | |
| tree | 7ff83f9d4b4fd4df5f48333d07fb743e3c4531cb /src/core/hle/kernel/process.cpp | |
| parent | Merge pull request #237 from mailwl/nifm-module (diff) | |
| parent | process: MirrorMemory should use MemoryState::Mapped. (diff) | |
| download | yuzu-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/core/hle/kernel/process.cpp')
| -rw-r--r-- | src/core/hle/kernel/process.cpp | 21 |
1 files changed, 12 insertions, 9 deletions
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 |