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.cpp38
1 files changed, 32 insertions, 6 deletions
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp
index b0e75ba59..a7892c652 100644
--- a/src/core/hle/kernel/process.cpp
+++ b/src/core/hle/kernel/process.cpp
@@ -5,24 +5,39 @@
5#include "common/assert.h" 5#include "common/assert.h"
6#include "common/common_funcs.h" 6#include "common/common_funcs.h"
7#include "common/logging/log.h" 7#include "common/logging/log.h"
8#include "common/make_unique.h"
8 9
9#include "core/hle/kernel/process.h" 10#include "core/hle/kernel/process.h"
10#include "core/hle/kernel/resource_limit.h" 11#include "core/hle/kernel/resource_limit.h"
11#include "core/hle/kernel/thread.h" 12#include "core/hle/kernel/thread.h"
13#include "core/hle/kernel/vm_manager.h"
14#include "core/mem_map.h"
12#include "core/memory.h" 15#include "core/memory.h"
13 16
14namespace Kernel { 17namespace Kernel {
15 18
19SharedPtr<CodeSet> CodeSet::Create(std::string name, u64 program_id) {
20 SharedPtr<CodeSet> codeset(new CodeSet);
21
22 codeset->name = std::move(name);
23 codeset->program_id = program_id;
24
25 return codeset;
26}
27
28CodeSet::CodeSet() {}
29CodeSet::~CodeSet() {}
30
16u32 Process::next_process_id; 31u32 Process::next_process_id;
17 32
18SharedPtr<Process> Process::Create(std::string name, u64 program_id) { 33SharedPtr<Process> Process::Create(SharedPtr<CodeSet> code_set) {
19 SharedPtr<Process> process(new Process); 34 SharedPtr<Process> process(new Process);
20 35
21 process->name = std::move(name); 36 process->codeset = std::move(code_set);
22 process->program_id = program_id;
23
24 process->flags.raw = 0; 37 process->flags.raw = 0;
25 process->flags.memory_region = MemoryRegion::APPLICATION; 38 process->flags.memory_region = MemoryRegion::APPLICATION;
39 process->address_space = Common::make_unique<VMManager>();
40 Memory::InitLegacyAddressSpace(*process->address_space);
26 41
27 return process; 42 return process;
28} 43}
@@ -87,8 +102,19 @@ void Process::ParseKernelCaps(const u32* kernel_caps, size_t len) {
87 } 102 }
88} 103}
89 104
90void Process::Run(VAddr entry_point, s32 main_thread_priority, u32 stack_size) { 105void Process::Run(s32 main_thread_priority, u32 stack_size) {
91 Kernel::SetupMainThread(entry_point, main_thread_priority); 106 auto MapSegment = [&](CodeSet::Segment& segment, VMAPermission permissions, MemoryState memory_state) {
107 auto vma = address_space->MapMemoryBlock(segment.addr, codeset->memory,
108 segment.offset, segment.size, memory_state).Unwrap();
109 address_space->Reprotect(vma, permissions);
110 };
111
112 MapSegment(codeset->code, VMAPermission::ReadExecute, MemoryState::Code);
113 MapSegment(codeset->rodata, VMAPermission::Read, MemoryState::Code);
114 MapSegment(codeset->data, VMAPermission::ReadWrite, MemoryState::Private);
115
116 address_space->LogLayout();
117 Kernel::SetupMainThread(codeset->entrypoint, main_thread_priority);
92} 118}
93 119
94Kernel::Process::Process() {} 120Kernel::Process::Process() {}