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.cpp23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp
index ba80fe7f8..32cb25fb7 100644
--- a/src/core/hle/kernel/process.cpp
+++ b/src/core/hle/kernel/process.cpp
@@ -35,7 +35,6 @@ SharedPtr<Process> Process::Create(SharedPtr<CodeSet> code_set) {
35 process->codeset = std::move(code_set); 35 process->codeset = std::move(code_set);
36 process->flags.raw = 0; 36 process->flags.raw = 0;
37 process->flags.memory_region.Assign(MemoryRegion::APPLICATION); 37 process->flags.memory_region.Assign(MemoryRegion::APPLICATION);
38 Memory::InitLegacyAddressSpace(process->vm_manager);
39 38
40 return process; 39 return process;
41} 40}
@@ -78,8 +77,15 @@ void Process::ParseKernelCaps(const u32* kernel_caps, size_t len) {
78 77
79 AddressMapping mapping; 78 AddressMapping mapping;
80 mapping.address = descriptor << 12; 79 mapping.address = descriptor << 12;
81 mapping.size = (end_desc << 12) - mapping.address; 80 VAddr end_address = end_desc << 12;
82 mapping.writable = (descriptor & (1 << 20)) != 0; 81
82 if (mapping.address < end_address) {
83 mapping.size = end_address - mapping.address;
84 } else {
85 mapping.size = 0;
86 }
87
88 mapping.read_only = (descriptor & (1 << 20)) != 0;
83 mapping.unk_flag = (end_desc & (1 << 20)) != 0; 89 mapping.unk_flag = (end_desc & (1 << 20)) != 0;
84 90
85 address_mappings.push_back(mapping); 91 address_mappings.push_back(mapping);
@@ -88,8 +94,10 @@ void Process::ParseKernelCaps(const u32* kernel_caps, size_t len) {
88 AddressMapping mapping; 94 AddressMapping mapping;
89 mapping.address = descriptor << 12; 95 mapping.address = descriptor << 12;
90 mapping.size = Memory::PAGE_SIZE; 96 mapping.size = Memory::PAGE_SIZE;
91 mapping.writable = true; // TODO: Not sure if correct 97 mapping.read_only = false;
92 mapping.unk_flag = false; 98 mapping.unk_flag = false;
99
100 address_mappings.push_back(mapping);
93 } else if ((type & 0xFE0) == 0xFC0) { // 0x01FF 101 } else if ((type & 0xFE0) == 0xFC0) { // 0x01FF
94 // Kernel version 102 // Kernel version
95 kernel_version = descriptor & 0xFFFF; 103 kernel_version = descriptor & 0xFFFF;
@@ -131,6 +139,12 @@ void Process::Run(s32 main_thread_priority, u32 stack_size) {
131 misc_memory_used += stack_size; 139 misc_memory_used += stack_size;
132 memory_region->used += stack_size; 140 memory_region->used += stack_size;
133 141
142 // Map special address mappings
143 MapSharedPages(vm_manager);
144 for (const auto& mapping : address_mappings) {
145 HandleSpecialMapping(vm_manager, mapping);
146 }
147
134 vm_manager.LogLayout(Log::Level::Debug); 148 vm_manager.LogLayout(Log::Level::Debug);
135 Kernel::SetupMainThread(codeset->entrypoint, main_thread_priority); 149 Kernel::SetupMainThread(codeset->entrypoint, main_thread_priority);
136} 150}
@@ -138,6 +152,7 @@ void Process::Run(s32 main_thread_priority, u32 stack_size) {
138VAddr Process::GetLinearHeapAreaAddress() const { 152VAddr Process::GetLinearHeapAreaAddress() const {
139 return kernel_version < 0x22C ? Memory::LINEAR_HEAP_VADDR : Memory::NEW_LINEAR_HEAP_VADDR; 153 return kernel_version < 0x22C ? Memory::LINEAR_HEAP_VADDR : Memory::NEW_LINEAR_HEAP_VADDR;
140} 154}
155
141VAddr Process::GetLinearHeapBase() const { 156VAddr Process::GetLinearHeapBase() const {
142 return GetLinearHeapAreaAddress() + memory_region->base; 157 return GetLinearHeapAreaAddress() + memory_region->base;
143} 158}