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.cpp32
1 files changed, 27 insertions, 5 deletions
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp
index 35cf6dc95..8e74059ea 100644
--- a/src/core/hle/kernel/process.cpp
+++ b/src/core/hle/kernel/process.cpp
@@ -2,6 +2,7 @@
2// Licensed under GPLv2 or any later version 2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include <algorithm>
5#include <memory> 6#include <memory>
6#include "common/assert.h" 7#include "common/assert.h"
7#include "common/common_funcs.h" 8#include "common/common_funcs.h"
@@ -16,6 +17,9 @@
16 17
17namespace Kernel { 18namespace Kernel {
18 19
20// Lists all processes that exist in the current session.
21static std::vector<SharedPtr<Process>> process_list;
22
19SharedPtr<CodeSet> CodeSet::Create(std::string name, u64 program_id) { 23SharedPtr<CodeSet> CodeSet::Create(std::string name, u64 program_id) {
20 SharedPtr<CodeSet> codeset(new CodeSet); 24 SharedPtr<CodeSet> codeset(new CodeSet);
21 25
@@ -36,7 +40,9 @@ SharedPtr<Process> Process::Create(std::string&& name) {
36 process->name = std::move(name); 40 process->name = std::move(name);
37 process->flags.raw = 0; 41 process->flags.raw = 0;
38 process->flags.memory_region.Assign(MemoryRegion::APPLICATION); 42 process->flags.memory_region.Assign(MemoryRegion::APPLICATION);
43 process->status = ProcessStatus::Created;
39 44
45 process_list.push_back(process);
40 return process; 46 return process;
41} 47}
42 48
@@ -129,6 +135,7 @@ void Process::Run(VAddr entry_point, s32 main_thread_priority, u32 stack_size) {
129 } 135 }
130 136
131 vm_manager.LogLayout(Log::Level::Debug); 137 vm_manager.LogLayout(Log::Level::Debug);
138 status = ProcessStatus::Running;
132 139
133 Kernel::SetupMainThread(entry_point, main_thread_priority, this); 140 Kernel::SetupMainThread(entry_point, main_thread_priority, this);
134} 141}
@@ -137,11 +144,11 @@ void Process::LoadModule(SharedPtr<CodeSet> module_, VAddr base_addr) {
137 memory_region = GetMemoryRegion(flags.memory_region); 144 memory_region = GetMemoryRegion(flags.memory_region);
138 145
139 auto MapSegment = [&](CodeSet::Segment& segment, VMAPermission permissions, 146 auto MapSegment = [&](CodeSet::Segment& segment, VMAPermission permissions,
140 MemoryState memory_state) { 147 MemoryState memory_state) {
141 auto vma = vm_manager 148 auto vma = vm_manager
142 .MapMemoryBlock(segment.addr + base_addr, module_->memory, segment.offset, segment.size, 149 .MapMemoryBlock(segment.addr + base_addr, module_->memory, segment.offset,
143 memory_state) 150 segment.size, memory_state)
144 .Unwrap(); 151 .Unwrap();
145 vm_manager.Reprotect(vma, permissions); 152 vm_manager.Reprotect(vma, permissions);
146 misc_memory_used += segment.size; 153 misc_memory_used += segment.size;
147 memory_region->used += segment.size; 154 memory_region->used += segment.size;
@@ -299,5 +306,20 @@ ResultCode Process::UnmapMemory(VAddr dst_addr, VAddr /*src_addr*/, u64 size) {
299Kernel::Process::Process() {} 306Kernel::Process::Process() {}
300Kernel::Process::~Process() {} 307Kernel::Process::~Process() {}
301 308
302SharedPtr<Process> g_current_process; 309void ClearProcessList() {
310 process_list.clear();
311}
312
313SharedPtr<Process> GetProcessById(u32 process_id) {
314 auto itr = std::find_if(
315 process_list.begin(), process_list.end(),
316 [&](const SharedPtr<Process>& process) { return process->process_id == process_id; });
317
318 if (itr == process_list.end())
319 return nullptr;
320
321 return *itr;
303} 322}
323
324SharedPtr<Process> g_current_process;
325} // namespace Kernel