diff options
| author | 2015-08-05 21:39:53 -0300 | |
|---|---|---|
| committer | 2015-08-16 01:03:48 -0300 | |
| commit | 14eca982f4da2bfd4d2c105bc33722e88e59da5f (patch) | |
| tree | d812de676c6e2d056ac43abec89251aa36162165 /src/core/hle/kernel | |
| parent | Kernel: Add more infrastructure to support different memory layouts (diff) | |
| download | yuzu-14eca982f4da2bfd4d2c105bc33722e88e59da5f.tar.gz yuzu-14eca982f4da2bfd4d2c105bc33722e88e59da5f.tar.xz yuzu-14eca982f4da2bfd4d2c105bc33722e88e59da5f.zip | |
Kernel: Implement svcGetProcessInfo in a basic way
This also adds some basic memory usage accounting. These two types are
used by Super Smash Bros. during startup.
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/process.cpp | 10 | ||||
| -rw-r--r-- | src/core/hle/kernel/process.h | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/thread.cpp | 4 |
3 files changed, 15 insertions, 1 deletions
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp index 1f45e6cf8..124047a53 100644 --- a/src/core/hle/kernel/process.cpp +++ b/src/core/hle/kernel/process.cpp | |||
| @@ -110,6 +110,7 @@ void Process::Run(s32 main_thread_priority, u32 stack_size) { | |||
| 110 | auto vma = vm_manager.MapMemoryBlock(segment.addr, codeset->memory, | 110 | auto vma = vm_manager.MapMemoryBlock(segment.addr, codeset->memory, |
| 111 | segment.offset, segment.size, memory_state).Unwrap(); | 111 | segment.offset, segment.size, memory_state).Unwrap(); |
| 112 | vm_manager.Reprotect(vma, permissions); | 112 | vm_manager.Reprotect(vma, permissions); |
| 113 | misc_memory_used += segment.size; | ||
| 113 | }; | 114 | }; |
| 114 | 115 | ||
| 115 | // Map CodeSet segments | 116 | // Map CodeSet segments |
| @@ -121,6 +122,7 @@ void Process::Run(s32 main_thread_priority, u32 stack_size) { | |||
| 121 | vm_manager.MapMemoryBlock(Memory::HEAP_VADDR_END - stack_size, | 122 | vm_manager.MapMemoryBlock(Memory::HEAP_VADDR_END - stack_size, |
| 122 | std::make_shared<std::vector<u8>>(stack_size, 0), 0, stack_size, MemoryState::Locked | 123 | std::make_shared<std::vector<u8>>(stack_size, 0), 0, stack_size, MemoryState::Locked |
| 123 | ).Unwrap(); | 124 | ).Unwrap(); |
| 125 | misc_memory_used += stack_size; | ||
| 124 | 126 | ||
| 125 | vm_manager.LogLayout(Log::Level::Debug); | 127 | vm_manager.LogLayout(Log::Level::Debug); |
| 126 | Kernel::SetupMainThread(codeset->entrypoint, main_thread_priority); | 128 | Kernel::SetupMainThread(codeset->entrypoint, main_thread_priority); |
| @@ -162,6 +164,8 @@ ResultVal<VAddr> Process::HeapAllocate(VAddr target, u32 size, VMAPermission per | |||
| 162 | CASCADE_RESULT(auto vma, vm_manager.MapMemoryBlock(target, heap_memory, target - heap_start, size, MemoryState::Private)); | 164 | CASCADE_RESULT(auto vma, vm_manager.MapMemoryBlock(target, heap_memory, target - heap_start, size, MemoryState::Private)); |
| 163 | vm_manager.Reprotect(vma, perms); | 165 | vm_manager.Reprotect(vma, perms); |
| 164 | 166 | ||
| 167 | heap_used += size; | ||
| 168 | |||
| 165 | return MakeResult<VAddr>(heap_end - size); | 169 | return MakeResult<VAddr>(heap_end - size); |
| 166 | } | 170 | } |
| 167 | 171 | ||
| @@ -173,6 +177,8 @@ ResultCode Process::HeapFree(VAddr target, u32 size) { | |||
| 173 | ResultCode result = vm_manager.UnmapRange(target, size); | 177 | ResultCode result = vm_manager.UnmapRange(target, size); |
| 174 | if (result.IsError()) return result; | 178 | if (result.IsError()) return result; |
| 175 | 179 | ||
| 180 | heap_used -= size; | ||
| 181 | |||
| 176 | return RESULT_SUCCESS; | 182 | return RESULT_SUCCESS; |
| 177 | } | 183 | } |
| 178 | 184 | ||
| @@ -206,6 +212,8 @@ ResultVal<VAddr> Process::LinearAllocate(VAddr target, u32 size, VMAPermission p | |||
| 206 | CASCADE_RESULT(auto vma, vm_manager.MapMemoryBlock(target, linheap_memory, offset, size, MemoryState::Continuous)); | 212 | CASCADE_RESULT(auto vma, vm_manager.MapMemoryBlock(target, linheap_memory, offset, size, MemoryState::Continuous)); |
| 207 | vm_manager.Reprotect(vma, perms); | 213 | vm_manager.Reprotect(vma, perms); |
| 208 | 214 | ||
| 215 | linear_heap_used += size; | ||
| 216 | |||
| 209 | return MakeResult<VAddr>(target); | 217 | return MakeResult<VAddr>(target); |
| 210 | } | 218 | } |
| 211 | 219 | ||
| @@ -226,6 +234,8 @@ ResultCode Process::LinearFree(VAddr target, u32 size) { | |||
| 226 | ResultCode result = vm_manager.UnmapRange(target, size); | 234 | ResultCode result = vm_manager.UnmapRange(target, size); |
| 227 | if (result.IsError()) return result; | 235 | if (result.IsError()) return result; |
| 228 | 236 | ||
| 237 | linear_heap_used -= size; | ||
| 238 | |||
| 229 | if (target + size == heap_end) { | 239 | if (target + size == heap_end) { |
| 230 | // End of linear heap has been freed, so check what's the last allocated block in it and | 240 | // End of linear heap has been freed, so check what's the last allocated block in it and |
| 231 | // reduce the size. | 241 | // reduce the size. |
diff --git a/src/core/hle/kernel/process.h b/src/core/hle/kernel/process.h index 7c3a78b9e..60e17f251 100644 --- a/src/core/hle/kernel/process.h +++ b/src/core/hle/kernel/process.h | |||
| @@ -136,6 +136,8 @@ public: | |||
| 136 | // The left/right bounds of the address space covered by heap_memory. | 136 | // The left/right bounds of the address space covered by heap_memory. |
| 137 | VAddr heap_start = 0, heap_end = 0; | 137 | VAddr heap_start = 0, heap_end = 0; |
| 138 | 138 | ||
| 139 | u32 heap_used = 0, linear_heap_used = 0, misc_memory_used = 0; | ||
| 140 | |||
| 139 | MemoryRegionInfo* memory_region = nullptr; | 141 | MemoryRegionInfo* memory_region = nullptr; |
| 140 | 142 | ||
| 141 | /// Bitmask of the used TLS slots | 143 | /// Bitmask of the used TLS slots |
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp index 29ea6d531..c10126513 100644 --- a/src/core/hle/kernel/thread.cpp +++ b/src/core/hle/kernel/thread.cpp | |||
| @@ -117,6 +117,7 @@ void Thread::Stop() { | |||
| 117 | wait_objects.clear(); | 117 | wait_objects.clear(); |
| 118 | 118 | ||
| 119 | Kernel::g_current_process->used_tls_slots[tls_index] = false; | 119 | Kernel::g_current_process->used_tls_slots[tls_index] = false; |
| 120 | g_current_process->misc_memory_used -= Memory::TLS_ENTRY_SIZE; | ||
| 120 | 121 | ||
| 121 | HLE::Reschedule(__func__); | 122 | HLE::Reschedule(__func__); |
| 122 | } | 123 | } |
| @@ -414,6 +415,7 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point, | |||
| 414 | } | 415 | } |
| 415 | 416 | ||
| 416 | ASSERT_MSG(thread->tls_index != -1, "Out of TLS space"); | 417 | ASSERT_MSG(thread->tls_index != -1, "Out of TLS space"); |
| 418 | g_current_process->misc_memory_used += Memory::TLS_ENTRY_SIZE; | ||
| 417 | 419 | ||
| 418 | // TODO(peachum): move to ScheduleThread() when scheduler is added so selected core is used | 420 | // TODO(peachum): move to ScheduleThread() when scheduler is added so selected core is used |
| 419 | // to initialize the context | 421 | // to initialize the context |
| @@ -504,7 +506,7 @@ void Thread::SetWaitSynchronizationOutput(s32 output) { | |||
| 504 | } | 506 | } |
| 505 | 507 | ||
| 506 | VAddr Thread::GetTLSAddress() const { | 508 | VAddr Thread::GetTLSAddress() const { |
| 507 | return Memory::TLS_AREA_VADDR + tls_index * 0x200; | 509 | return Memory::TLS_AREA_VADDR + tls_index * Memory::TLS_ENTRY_SIZE; |
| 508 | } | 510 | } |
| 509 | 511 | ||
| 510 | //////////////////////////////////////////////////////////////////////////////////////////////////// | 512 | //////////////////////////////////////////////////////////////////////////////////////////////////// |