diff options
| author | 2015-11-26 19:00:16 -0800 | |
|---|---|---|
| committer | 2015-11-30 19:49:44 -0800 | |
| commit | 84a22cb5947b0733a043429032367227e73342dc (patch) | |
| tree | 928497d2056d1c5ea719ac0cb359888b0df4d6bc /src/core/hle/kernel | |
| parent | Merge pull request #1259 from lioncash/zero (diff) | |
| download | yuzu-84a22cb5947b0733a043429032367227e73342dc.tar.gz yuzu-84a22cb5947b0733a043429032367227e73342dc.tar.xz yuzu-84a22cb5947b0733a043429032367227e73342dc.zip | |
Kernel: Implement svcGetSystemInfo
This makes smealum/ctrulib@b96dd51d3349961189d4ab1bc2a5c45deff21c09 work
with Citra.
Diffstat (limited to 'src/core/hle/kernel')
| -rw-r--r-- | src/core/hle/kernel/memory.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/kernel/memory.h | 1 | ||||
| -rw-r--r-- | src/core/hle/kernel/process.cpp | 6 | ||||
| -rw-r--r-- | src/core/hle/kernel/thread.cpp | 3 |
4 files changed, 12 insertions, 0 deletions
diff --git a/src/core/hle/kernel/memory.cpp b/src/core/hle/kernel/memory.cpp index e4fc5f3c4..0cfb43fc7 100644 --- a/src/core/hle/kernel/memory.cpp +++ b/src/core/hle/kernel/memory.cpp | |||
| @@ -51,6 +51,7 @@ void MemoryInit(u32 mem_type) { | |||
| 51 | for (int i = 0; i < 3; ++i) { | 51 | for (int i = 0; i < 3; ++i) { |
| 52 | memory_regions[i].base = base; | 52 | memory_regions[i].base = base; |
| 53 | memory_regions[i].size = memory_region_sizes[mem_type][i]; | 53 | memory_regions[i].size = memory_region_sizes[mem_type][i]; |
| 54 | memory_regions[i].used = 0; | ||
| 54 | memory_regions[i].linear_heap_memory = std::make_shared<std::vector<u8>>(); | 55 | memory_regions[i].linear_heap_memory = std::make_shared<std::vector<u8>>(); |
| 55 | 56 | ||
| 56 | base += memory_regions[i].size; | 57 | base += memory_regions[i].size; |
| @@ -72,6 +73,7 @@ void MemoryShutdown() { | |||
| 72 | for (auto& region : memory_regions) { | 73 | for (auto& region : memory_regions) { |
| 73 | region.base = 0; | 74 | region.base = 0; |
| 74 | region.size = 0; | 75 | region.size = 0; |
| 76 | region.used = 0; | ||
| 75 | region.linear_heap_memory = nullptr; | 77 | region.linear_heap_memory = nullptr; |
| 76 | } | 78 | } |
| 77 | } | 79 | } |
diff --git a/src/core/hle/kernel/memory.h b/src/core/hle/kernel/memory.h index 36690b091..091c1f89f 100644 --- a/src/core/hle/kernel/memory.h +++ b/src/core/hle/kernel/memory.h | |||
| @@ -17,6 +17,7 @@ class VMManager; | |||
| 17 | struct MemoryRegionInfo { | 17 | struct MemoryRegionInfo { |
| 18 | u32 base; // Not an address, but offset from start of FCRAM | 18 | u32 base; // Not an address, but offset from start of FCRAM |
| 19 | u32 size; | 19 | u32 size; |
| 20 | u32 used; | ||
| 20 | 21 | ||
| 21 | std::shared_ptr<std::vector<u8>> linear_heap_memory; | 22 | std::shared_ptr<std::vector<u8>> linear_heap_memory; |
| 22 | }; | 23 | }; |
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp index c2b4963d4..d148efde2 100644 --- a/src/core/hle/kernel/process.cpp +++ b/src/core/hle/kernel/process.cpp | |||
| @@ -111,6 +111,7 @@ void Process::Run(s32 main_thread_priority, u32 stack_size) { | |||
| 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 | misc_memory_used += segment.size; |
| 114 | memory_region->used += segment.size; | ||
| 114 | }; | 115 | }; |
| 115 | 116 | ||
| 116 | // Map CodeSet segments | 117 | // Map CodeSet segments |
| @@ -123,6 +124,7 @@ void Process::Run(s32 main_thread_priority, u32 stack_size) { | |||
| 123 | std::make_shared<std::vector<u8>>(stack_size, 0), 0, stack_size, MemoryState::Locked | 124 | std::make_shared<std::vector<u8>>(stack_size, 0), 0, stack_size, MemoryState::Locked |
| 124 | ).Unwrap(); | 125 | ).Unwrap(); |
| 125 | misc_memory_used += stack_size; | 126 | misc_memory_used += stack_size; |
| 127 | memory_region->used += stack_size; | ||
| 126 | 128 | ||
| 127 | vm_manager.LogLayout(Log::Level::Debug); | 129 | vm_manager.LogLayout(Log::Level::Debug); |
| 128 | Kernel::SetupMainThread(codeset->entrypoint, main_thread_priority); | 130 | Kernel::SetupMainThread(codeset->entrypoint, main_thread_priority); |
| @@ -165,6 +167,7 @@ ResultVal<VAddr> Process::HeapAllocate(VAddr target, u32 size, VMAPermission per | |||
| 165 | vm_manager.Reprotect(vma, perms); | 167 | vm_manager.Reprotect(vma, perms); |
| 166 | 168 | ||
| 167 | heap_used += size; | 169 | heap_used += size; |
| 170 | memory_region->used += size; | ||
| 168 | 171 | ||
| 169 | return MakeResult<VAddr>(heap_end - size); | 172 | return MakeResult<VAddr>(heap_end - size); |
| 170 | } | 173 | } |
| @@ -182,6 +185,7 @@ ResultCode Process::HeapFree(VAddr target, u32 size) { | |||
| 182 | if (result.IsError()) return result; | 185 | if (result.IsError()) return result; |
| 183 | 186 | ||
| 184 | heap_used -= size; | 187 | heap_used -= size; |
| 188 | memory_region->used -= size; | ||
| 185 | 189 | ||
| 186 | return RESULT_SUCCESS; | 190 | return RESULT_SUCCESS; |
| 187 | } | 191 | } |
| @@ -217,6 +221,7 @@ ResultVal<VAddr> Process::LinearAllocate(VAddr target, u32 size, VMAPermission p | |||
| 217 | vm_manager.Reprotect(vma, perms); | 221 | vm_manager.Reprotect(vma, perms); |
| 218 | 222 | ||
| 219 | linear_heap_used += size; | 223 | linear_heap_used += size; |
| 224 | memory_region->used += size; | ||
| 220 | 225 | ||
| 221 | return MakeResult<VAddr>(target); | 226 | return MakeResult<VAddr>(target); |
| 222 | } | 227 | } |
| @@ -243,6 +248,7 @@ ResultCode Process::LinearFree(VAddr target, u32 size) { | |||
| 243 | if (result.IsError()) return result; | 248 | if (result.IsError()) return result; |
| 244 | 249 | ||
| 245 | linear_heap_used -= size; | 250 | linear_heap_used -= size; |
| 251 | memory_region->used -= size; | ||
| 246 | 252 | ||
| 247 | if (target + size == heap_end) { | 253 | if (target + size == heap_end) { |
| 248 | // End of linear heap has been freed, so check what's the last allocated block in it and | 254 | // End of linear heap has been freed, so check what's the last allocated block in it and |
diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp index 00fa995f6..c08fc1c7a 100644 --- a/src/core/hle/kernel/thread.cpp +++ b/src/core/hle/kernel/thread.cpp | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | #include "core/hle/kernel/kernel.h" | 20 | #include "core/hle/kernel/kernel.h" |
| 21 | #include "core/hle/kernel/process.h" | 21 | #include "core/hle/kernel/process.h" |
| 22 | #include "core/hle/kernel/thread.h" | 22 | #include "core/hle/kernel/thread.h" |
| 23 | #include "core/hle/kernel/memory.h" | ||
| 23 | #include "core/hle/kernel/mutex.h" | 24 | #include "core/hle/kernel/mutex.h" |
| 24 | #include "core/hle/result.h" | 25 | #include "core/hle/result.h" |
| 25 | #include "core/memory.h" | 26 | #include "core/memory.h" |
| @@ -118,6 +119,7 @@ void Thread::Stop() { | |||
| 118 | 119 | ||
| 119 | Kernel::g_current_process->used_tls_slots[tls_index] = false; | 120 | Kernel::g_current_process->used_tls_slots[tls_index] = false; |
| 120 | g_current_process->misc_memory_used -= Memory::TLS_ENTRY_SIZE; | 121 | g_current_process->misc_memory_used -= Memory::TLS_ENTRY_SIZE; |
| 122 | g_current_process->memory_region->used -= Memory::TLS_ENTRY_SIZE; | ||
| 121 | 123 | ||
| 122 | HLE::Reschedule(__func__); | 124 | HLE::Reschedule(__func__); |
| 123 | } | 125 | } |
| @@ -416,6 +418,7 @@ ResultVal<SharedPtr<Thread>> Thread::Create(std::string name, VAddr entry_point, | |||
| 416 | 418 | ||
| 417 | ASSERT_MSG(thread->tls_index != -1, "Out of TLS space"); | 419 | ASSERT_MSG(thread->tls_index != -1, "Out of TLS space"); |
| 418 | g_current_process->misc_memory_used += Memory::TLS_ENTRY_SIZE; | 420 | g_current_process->misc_memory_used += Memory::TLS_ENTRY_SIZE; |
| 421 | g_current_process->memory_region->used += Memory::TLS_ENTRY_SIZE; | ||
| 419 | 422 | ||
| 420 | // TODO(peachum): move to ScheduleThread() when scheduler is added so selected core is used | 423 | // TODO(peachum): move to ScheduleThread() when scheduler is added so selected core is used |
| 421 | // to initialize the context | 424 | // to initialize the context |