diff options
Diffstat (limited to 'src/core/hle/kernel/process.cpp')
| -rw-r--r-- | src/core/hle/kernel/process.cpp | 23 |
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) { | |||
| 138 | VAddr Process::GetLinearHeapAreaAddress() const { | 152 | VAddr 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 | |||
| 141 | VAddr Process::GetLinearHeapBase() const { | 156 | VAddr Process::GetLinearHeapBase() const { |
| 142 | return GetLinearHeapAreaAddress() + memory_region->base; | 157 | return GetLinearHeapAreaAddress() + memory_region->base; |
| 143 | } | 158 | } |