diff options
| author | 2015-07-11 20:07:49 -0700 | |
|---|---|---|
| committer | 2015-07-11 20:07:49 -0700 | |
| commit | 4e900d56f3dd2b5c9871b523689322028123d891 (patch) | |
| tree | 2b233263cff7c001506f660373e2364c8e702637 /src/core/hle/kernel/process.cpp | |
| parent | Merge pull request #914 from yuriks/bitfield-mask (diff) | |
| parent | Core: Properly configure address space when loading a binary (diff) | |
| download | yuzu-4e900d56f3dd2b5c9871b523689322028123d891.tar.gz yuzu-4e900d56f3dd2b5c9871b523689322028123d891.tar.xz yuzu-4e900d56f3dd2b5c9871b523689322028123d891.zip | |
Merge pull request #912 from yuriks/process-loading
Core: Properly configure address space during binary loading
Diffstat (limited to 'src/core/hle/kernel/process.cpp')
| -rw-r--r-- | src/core/hle/kernel/process.cpp | 38 |
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 | ||
| 14 | namespace Kernel { | 17 | namespace Kernel { |
| 15 | 18 | ||
| 19 | SharedPtr<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 | |||
| 28 | CodeSet::CodeSet() {} | ||
| 29 | CodeSet::~CodeSet() {} | ||
| 30 | |||
| 16 | u32 Process::next_process_id; | 31 | u32 Process::next_process_id; |
| 17 | 32 | ||
| 18 | SharedPtr<Process> Process::Create(std::string name, u64 program_id) { | 33 | SharedPtr<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 | ||
| 90 | void Process::Run(VAddr entry_point, s32 main_thread_priority, u32 stack_size) { | 105 | void 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 | ||
| 94 | Kernel::Process::Process() {} | 120 | Kernel::Process::Process() {} |