diff options
| author | 2017-10-19 23:00:46 -0400 | |
|---|---|---|
| committer | 2017-10-19 23:00:46 -0400 | |
| commit | dcd6bb82f7a5bc1daaa8570f710ffb062fa4c596 (patch) | |
| tree | 95f6a5d5f816a9c8a6367889dd4d551deb625eb0 /src/core/hle/kernel/process.cpp | |
| parent | lm: Implement lm::Initialize and Logger::log. (diff) | |
| download | yuzu-dcd6bb82f7a5bc1daaa8570f710ffb062fa4c596.tar.gz yuzu-dcd6bb82f7a5bc1daaa8570f710ffb062fa4c596.tar.xz yuzu-dcd6bb82f7a5bc1daaa8570f710ffb062fa4c596.zip | |
hle: Fix QueryMemory response for MemoryInfo.
Diffstat (limited to 'src/core/hle/kernel/process.cpp')
| -rw-r--r-- | src/core/hle/kernel/process.cpp | 42 |
1 files changed, 5 insertions, 37 deletions
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp index 9e145866f..98c5b0905 100644 --- a/src/core/hle/kernel/process.cpp +++ b/src/core/hle/kernel/process.cpp | |||
| @@ -117,7 +117,7 @@ void Process::Run(VAddr entry_point, s32 main_thread_priority, u32 stack_size) { | |||
| 117 | vm_manager | 117 | vm_manager |
| 118 | .MapMemoryBlock(Memory::HEAP_VADDR_END - stack_size, | 118 | .MapMemoryBlock(Memory::HEAP_VADDR_END - stack_size, |
| 119 | std::make_shared<std::vector<u8>>(stack_size, 0), 0, stack_size, | 119 | std::make_shared<std::vector<u8>>(stack_size, 0), 0, stack_size, |
| 120 | MemoryState::Locked) | 120 | MemoryState::Heap) |
| 121 | .Unwrap(); | 121 | .Unwrap(); |
| 122 | misc_memory_used += stack_size; | 122 | misc_memory_used += stack_size; |
| 123 | memory_region->used += stack_size; | 123 | memory_region->used += stack_size; |
| @@ -148,7 +148,7 @@ void Process::LoadModule(SharedPtr<CodeSet> module_, VAddr base_addr) { | |||
| 148 | }; | 148 | }; |
| 149 | 149 | ||
| 150 | // Map CodeSet segments | 150 | // Map CodeSet segments |
| 151 | MapSegment(module_->code, VMAPermission::ReadWrite, MemoryState::Private); | 151 | MapSegment(module_->code, VMAPermission::ReadExecute, MemoryState::Code); |
| 152 | MapSegment(module_->rodata, VMAPermission::Read, MemoryState::Static); | 152 | MapSegment(module_->rodata, VMAPermission::Read, MemoryState::Static); |
| 153 | MapSegment(module_->data, VMAPermission::ReadWrite, MemoryState::Static); | 153 | MapSegment(module_->data, VMAPermission::ReadWrite, MemoryState::Static); |
| 154 | } | 154 | } |
| @@ -193,7 +193,7 @@ ResultVal<VAddr> Process::HeapAllocate(VAddr target, u32 size, VMAPermission per | |||
| 193 | ASSERT(heap_end - heap_start == heap_memory->size()); | 193 | ASSERT(heap_end - heap_start == heap_memory->size()); |
| 194 | 194 | ||
| 195 | CASCADE_RESULT(auto vma, vm_manager.MapMemoryBlock(target, heap_memory, target - heap_start, | 195 | CASCADE_RESULT(auto vma, vm_manager.MapMemoryBlock(target, heap_memory, target - heap_start, |
| 196 | size, MemoryState::Private)); | 196 | size, MemoryState::Heap)); |
| 197 | vm_manager.Reprotect(vma, perms); | 197 | vm_manager.Reprotect(vma, perms); |
| 198 | 198 | ||
| 199 | heap_used += size; | 199 | heap_used += size; |
| @@ -223,40 +223,8 @@ ResultCode Process::HeapFree(VAddr target, u32 size) { | |||
| 223 | } | 223 | } |
| 224 | 224 | ||
| 225 | ResultVal<VAddr> Process::LinearAllocate(VAddr target, u32 size, VMAPermission perms) { | 225 | ResultVal<VAddr> Process::LinearAllocate(VAddr target, u32 size, VMAPermission perms) { |
| 226 | auto& linheap_memory = memory_region->linear_heap_memory; | 226 | UNIMPLEMENTED(); |
| 227 | 227 | return {}; | |
| 228 | VAddr heap_end = GetLinearHeapBase() + (u32)linheap_memory->size(); | ||
| 229 | // Games and homebrew only ever seem to pass 0 here (which lets the kernel decide the address), | ||
| 230 | // but explicit addresses are also accepted and respected. | ||
| 231 | if (target == 0) { | ||
| 232 | target = heap_end; | ||
| 233 | } | ||
| 234 | |||
| 235 | if (target < GetLinearHeapBase() || target + size > GetLinearHeapLimit() || target > heap_end || | ||
| 236 | target + size < target) { | ||
| 237 | |||
| 238 | return ERR_INVALID_ADDRESS; | ||
| 239 | } | ||
| 240 | |||
| 241 | // Expansion of the linear heap is only allowed if you do an allocation immediately at its | ||
| 242 | // end. It's possible to free gaps in the middle of the heap and then reallocate them later, | ||
| 243 | // but expansions are only allowed at the end. | ||
| 244 | if (target == heap_end) { | ||
| 245 | linheap_memory->insert(linheap_memory->end(), size, 0); | ||
| 246 | vm_manager.RefreshMemoryBlockMappings(linheap_memory.get()); | ||
| 247 | } | ||
| 248 | |||
| 249 | // TODO(yuriks): As is, this lets processes map memory allocated by other processes from the | ||
| 250 | // same region. It is unknown if or how the 3DS kernel checks against this. | ||
| 251 | size_t offset = target - GetLinearHeapBase(); | ||
| 252 | CASCADE_RESULT(auto vma, vm_manager.MapMemoryBlock(target, linheap_memory, offset, size, | ||
| 253 | MemoryState::Continuous)); | ||
| 254 | vm_manager.Reprotect(vma, perms); | ||
| 255 | |||
| 256 | linear_heap_used += size; | ||
| 257 | memory_region->used += size; | ||
| 258 | |||
| 259 | return MakeResult<VAddr>(target); | ||
| 260 | } | 228 | } |
| 261 | 229 | ||
| 262 | ResultCode Process::LinearFree(VAddr target, u32 size) { | 230 | ResultCode Process::LinearFree(VAddr target, u32 size) { |