diff options
Diffstat (limited to 'src/core/hle/kernel/process.cpp')
| -rw-r--r-- | src/core/hle/kernel/process.cpp | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp index 522ad2333..2b6634069 100644 --- a/src/core/hle/kernel/process.cpp +++ b/src/core/hle/kernel/process.cpp | |||
| @@ -33,7 +33,7 @@ u32 Process::next_process_id; | |||
| 33 | SharedPtr<Process> Process::Create(SharedPtr<CodeSet> code_set) { | 33 | SharedPtr<Process> Process::Create(SharedPtr<CodeSet> code_set) { |
| 34 | SharedPtr<Process> process(new Process); | 34 | SharedPtr<Process> process(new Process); |
| 35 | 35 | ||
| 36 | process->codeset = std::move(code_set); | 36 | process->codeset = code_set; |
| 37 | process->flags.raw = 0; | 37 | process->flags.raw = 0; |
| 38 | process->flags.memory_region.Assign(MemoryRegion::APPLICATION); | 38 | process->flags.memory_region.Assign(MemoryRegion::APPLICATION); |
| 39 | 39 | ||
| @@ -113,24 +113,6 @@ void Process::ParseKernelCaps(const u32* kernel_caps, size_t len) { | |||
| 113 | } | 113 | } |
| 114 | 114 | ||
| 115 | void Process::Run(s32 main_thread_priority, u32 stack_size) { | 115 | void Process::Run(s32 main_thread_priority, u32 stack_size) { |
| 116 | memory_region = GetMemoryRegion(flags.memory_region); | ||
| 117 | |||
| 118 | auto MapSegment = [&](CodeSet::Segment& segment, VMAPermission permissions, | ||
| 119 | MemoryState memory_state) { | ||
| 120 | auto vma = vm_manager | ||
| 121 | .MapMemoryBlock(segment.addr, codeset->memory, segment.offset, segment.size, | ||
| 122 | memory_state) | ||
| 123 | .Unwrap(); | ||
| 124 | vm_manager.Reprotect(vma, permissions); | ||
| 125 | misc_memory_used += segment.size; | ||
| 126 | memory_region->used += segment.size; | ||
| 127 | }; | ||
| 128 | |||
| 129 | // Map CodeSet segments | ||
| 130 | MapSegment(codeset->code, VMAPermission::ReadExecute, MemoryState::Code); | ||
| 131 | MapSegment(codeset->rodata, VMAPermission::Read, MemoryState::Code); | ||
| 132 | MapSegment(codeset->data, VMAPermission::ReadWrite, MemoryState::Private); | ||
| 133 | |||
| 134 | // Allocate and map stack | 116 | // Allocate and map stack |
| 135 | vm_manager | 117 | vm_manager |
| 136 | .MapMemoryBlock(Memory::HEAP_VADDR_END - stack_size, | 118 | .MapMemoryBlock(Memory::HEAP_VADDR_END - stack_size, |
| @@ -148,6 +130,25 @@ void Process::Run(s32 main_thread_priority, u32 stack_size) { | |||
| 148 | 130 | ||
| 149 | vm_manager.LogLayout(Log::Level::Debug); | 131 | vm_manager.LogLayout(Log::Level::Debug); |
| 150 | Kernel::SetupMainThread(codeset->entrypoint, main_thread_priority); | 132 | Kernel::SetupMainThread(codeset->entrypoint, main_thread_priority); |
| 133 | |||
| 134 | void Process::LoadModule(SharedPtr<CodeSet> module_, VAddr base_addr) { | ||
| 135 | memory_region = GetMemoryRegion(flags.memory_region); | ||
| 136 | |||
| 137 | auto MapSegment = [&](CodeSet::Segment& segment, VMAPermission permissions, | ||
| 138 | MemoryState memory_state) { | ||
| 139 | auto vma = vm_manager | ||
| 140 | .MapMemoryBlock(segment.addr + base_addr, module_->memory, segment.offset, segment.size, | ||
| 141 | memory_state) | ||
| 142 | .Unwrap(); | ||
| 143 | vm_manager.Reprotect(vma, permissions); | ||
| 144 | misc_memory_used += segment.size; | ||
| 145 | memory_region->used += segment.size; | ||
| 146 | }; | ||
| 147 | |||
| 148 | // Map CodeSet segments | ||
| 149 | MapSegment(module_->code, VMAPermission::ReadExecute, MemoryState::Code); | ||
| 150 | MapSegment(module_->rodata, VMAPermission::Read, MemoryState::Code); | ||
| 151 | MapSegment(module_->data, VMAPermission::ReadWrite, MemoryState::Private); | ||
| 151 | } | 152 | } |
| 152 | 153 | ||
| 153 | VAddr Process::GetLinearHeapAreaAddress() const { | 154 | VAddr Process::GetLinearHeapAreaAddress() const { |