From aa7c824ea422152e3e8ac4586a9b94d2c755c23d Mon Sep 17 00:00:00 2001 From: bunnei Date: Mon, 1 Jan 2018 14:38:34 -0500 Subject: svc: Implement svcExitProcess. --- src/core/hle/kernel/process.cpp | 32 +++++++++++++++++++++++++++----- src/core/hle/kernel/process.h | 13 +++++++++++-- 2 files changed, 38 insertions(+), 7 deletions(-) (limited to 'src/core/hle/kernel') 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 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include #include #include "common/assert.h" #include "common/common_funcs.h" @@ -16,6 +17,9 @@ namespace Kernel { +// Lists all processes that exist in the current session. +static std::vector> process_list; + SharedPtr CodeSet::Create(std::string name, u64 program_id) { SharedPtr codeset(new CodeSet); @@ -36,7 +40,9 @@ SharedPtr Process::Create(std::string&& name) { process->name = std::move(name); process->flags.raw = 0; process->flags.memory_region.Assign(MemoryRegion::APPLICATION); + process->status = ProcessStatus::Created; + process_list.push_back(process); return process; } @@ -129,6 +135,7 @@ void Process::Run(VAddr entry_point, s32 main_thread_priority, u32 stack_size) { } vm_manager.LogLayout(Log::Level::Debug); + status = ProcessStatus::Running; Kernel::SetupMainThread(entry_point, main_thread_priority, this); } @@ -137,11 +144,11 @@ void Process::LoadModule(SharedPtr module_, VAddr base_addr) { memory_region = GetMemoryRegion(flags.memory_region); auto MapSegment = [&](CodeSet::Segment& segment, VMAPermission permissions, - MemoryState memory_state) { + MemoryState memory_state) { auto vma = vm_manager - .MapMemoryBlock(segment.addr + base_addr, module_->memory, segment.offset, segment.size, - memory_state) - .Unwrap(); + .MapMemoryBlock(segment.addr + base_addr, module_->memory, segment.offset, + segment.size, memory_state) + .Unwrap(); vm_manager.Reprotect(vma, permissions); misc_memory_used += segment.size; memory_region->used += segment.size; @@ -299,5 +306,20 @@ ResultCode Process::UnmapMemory(VAddr dst_addr, VAddr /*src_addr*/, u64 size) { Kernel::Process::Process() {} Kernel::Process::~Process() {} -SharedPtr g_current_process; +void ClearProcessList() { + process_list.clear(); +} + +SharedPtr GetProcessById(u32 process_id) { + auto itr = std::find_if( + process_list.begin(), process_list.end(), + [&](const SharedPtr& process) { return process->process_id == process_id; }); + + if (itr == process_list.end()) + return nullptr; + + return *itr; } + +SharedPtr g_current_process; +} // namespace Kernel diff --git a/src/core/hle/kernel/process.h b/src/core/hle/kernel/process.h index 3ea8c298f..305275387 100644 --- a/src/core/hle/kernel/process.h +++ b/src/core/hle/kernel/process.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #include "common/bit_field.h" #include "common/common_types.h" @@ -48,6 +49,8 @@ union ProcessFlags { BitField<12, 1, u16> loaded_high; ///< Application loaded high (not at 0x00100000). }; +enum class ProcessStatus { Created, Running, Exited }; + class ResourceLimit; struct MemoryRegionInfo; @@ -124,6 +127,8 @@ public: u16 kernel_version = 0; /// The default CPU for this process, threads are scheduled on this cpu by default. u8 ideal_processor = 0; + /// Current status of the process + ProcessStatus status; /// The id of this process u32 process_id = next_process_id++; @@ -181,11 +186,15 @@ public: ResultCode UnmapMemory(VAddr dst_addr, VAddr src_addr, u64 size); - private: Process(); ~Process() override; }; +void ClearProcessList(); + +/// Retrieves a process from the current list of processes. +SharedPtr GetProcessById(u32 process_id); + extern SharedPtr g_current_process; -} +} // namespace Kernel -- cgit v1.2.3