summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/hle/kernel/process.cpp39
-rw-r--r--src/core/hle/kernel/process.h8
2 files changed, 27 insertions, 20 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;
33SharedPtr<Process> Process::Create(SharedPtr<CodeSet> code_set) { 33SharedPtr<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
115void Process::Run(s32 main_thread_priority, u32 stack_size) { 115void 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
134void 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
153VAddr Process::GetLinearHeapAreaAddress() const { 154VAddr Process::GetLinearHeapAreaAddress() const {
diff --git a/src/core/hle/kernel/process.h b/src/core/hle/kernel/process.h
index b52211d2a..7350c6c41 100644
--- a/src/core/hle/kernel/process.h
+++ b/src/core/hle/kernel/process.h
@@ -79,7 +79,11 @@ struct CodeSet final : public Object {
79 u32 size = 0; 79 u32 size = 0;
80 }; 80 };
81 81
82 Segment code, rodata, data; 82 Segment segments[3];
83 Segment& code = segments[0];
84 Segment& rodata = segments[1];
85 Segment& data = segments[2];
86
83 VAddr entrypoint; 87 VAddr entrypoint;
84 88
85private: 89private:
@@ -136,6 +140,8 @@ public:
136 */ 140 */
137 void Run(s32 main_thread_priority, u32 stack_size); 141 void Run(s32 main_thread_priority, u32 stack_size);
138 142
143 void LoadModule(SharedPtr<CodeSet> module_, VAddr base_addr);
144
139 /////////////////////////////////////////////////////////////////////////////////////////////// 145 ///////////////////////////////////////////////////////////////////////////////////////////////
140 // Memory Management 146 // Memory Management
141 147