summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/process.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/kernel/process.cpp')
-rw-r--r--src/core/hle/kernel/process.cpp21
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
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