summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Lioncash2018-09-22 20:09:32 -0400
committerGravatar Lioncash2018-09-24 17:24:50 -0400
commit75603b005bb9163810a02376cd33854cd1b16ef9 (patch)
treeebb28bd5ff9e0c4a57c53ee5ea6a72ce75023103
parentAdded glObjectLabels for renderdoc for textures and shader programs (#1384) (diff)
downloadyuzu-75603b005bb9163810a02376cd33854cd1b16ef9.tar.gz
yuzu-75603b005bb9163810a02376cd33854cd1b16ef9.tar.xz
yuzu-75603b005bb9163810a02376cd33854cd1b16ef9.zip
process/vm_manager: Amend API to allow reading parameters from NPDM metadata
Rather than hard-code the address range to be 36-bit, we can derive the parameters from supplied NPDM metadata if the supplied exectuable supports it. This is the bare minimum necessary for this to be possible. The following commits will rework the memory code further to adjust to this.
-rw-r--r--src/core/file_sys/program_metadata.cpp4
-rw-r--r--src/core/file_sys/program_metadata.h6
-rw-r--r--src/core/hle/kernel/process.cpp8
-rw-r--r--src/core/hle/kernel/process.h12
-rw-r--r--src/core/hle/kernel/vm_manager.cpp154
-rw-r--r--src/core/hle/kernel/vm_manager.h84
-rw-r--r--src/core/loader/deconstructed_rom_directory.cpp11
-rw-r--r--src/core/loader/elf.cpp8
-rw-r--r--src/core/loader/nro.cpp5
-rw-r--r--src/core/loader/nso.cpp5
10 files changed, 259 insertions, 38 deletions
diff --git a/src/core/file_sys/program_metadata.cpp b/src/core/file_sys/program_metadata.cpp
index 02319ce0f..8903ed1d3 100644
--- a/src/core/file_sys/program_metadata.cpp
+++ b/src/core/file_sys/program_metadata.cpp
@@ -83,10 +83,12 @@ void ProgramMetadata::Print() const {
83 83
84 auto address_space = "Unknown"; 84 auto address_space = "Unknown";
85 switch (npdm_header.address_space_type) { 85 switch (npdm_header.address_space_type) {
86 case ProgramAddressSpaceType::Is64Bit: 86 case ProgramAddressSpaceType::Is36Bit:
87 case ProgramAddressSpaceType::Is39Bit:
87 address_space = "64-bit"; 88 address_space = "64-bit";
88 break; 89 break;
89 case ProgramAddressSpaceType::Is32Bit: 90 case ProgramAddressSpaceType::Is32Bit:
91 case ProgramAddressSpaceType::Is32BitNoMap:
90 address_space = "32-bit"; 92 address_space = "32-bit";
91 break; 93 break;
92 } 94 }
diff --git a/src/core/file_sys/program_metadata.h b/src/core/file_sys/program_metadata.h
index 1143e36c4..e4470d6f0 100644
--- a/src/core/file_sys/program_metadata.h
+++ b/src/core/file_sys/program_metadata.h
@@ -17,8 +17,10 @@ enum class ResultStatus : u16;
17namespace FileSys { 17namespace FileSys {
18 18
19enum class ProgramAddressSpaceType : u8 { 19enum class ProgramAddressSpaceType : u8 {
20 Is64Bit = 1, 20 Is32Bit = 0,
21 Is32Bit = 2, 21 Is36Bit = 1,
22 Is32BitNoMap = 2,
23 Is39Bit = 3,
22}; 24};
23 25
24enum class ProgramFilePermission : u64 { 26enum class ProgramFilePermission : u64 {
diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp
index 121f741fd..f337f626f 100644
--- a/src/core/hle/kernel/process.cpp
+++ b/src/core/hle/kernel/process.cpp
@@ -8,6 +8,7 @@
8#include "common/common_funcs.h" 8#include "common/common_funcs.h"
9#include "common/logging/log.h" 9#include "common/logging/log.h"
10#include "core/core.h" 10#include "core/core.h"
11#include "core/file_sys/program_metadata.h"
11#include "core/hle/kernel/errors.h" 12#include "core/hle/kernel/errors.h"
12#include "core/hle/kernel/kernel.h" 13#include "core/hle/kernel/kernel.h"
13#include "core/hle/kernel/process.h" 14#include "core/hle/kernel/process.h"
@@ -34,14 +35,21 @@ SharedPtr<Process> Process::Create(KernelCore& kernel, std::string&& name) {
34 process->name = std::move(name); 35 process->name = std::move(name);
35 process->flags.raw = 0; 36 process->flags.raw = 0;
36 process->flags.memory_region.Assign(MemoryRegion::APPLICATION); 37 process->flags.memory_region.Assign(MemoryRegion::APPLICATION);
38 process->resource_limit = kernel.ResourceLimitForCategory(ResourceLimitCategory::APPLICATION);
37 process->status = ProcessStatus::Created; 39 process->status = ProcessStatus::Created;
38 process->program_id = 0; 40 process->program_id = 0;
39 process->process_id = kernel.CreateNewProcessID(); 41 process->process_id = kernel.CreateNewProcessID();
42 process->svc_access_mask.set();
40 43
41 kernel.AppendNewProcess(process); 44 kernel.AppendNewProcess(process);
42 return process; 45 return process;
43} 46}
44 47
48void Process::LoadFromMetadata(const FileSys::ProgramMetadata& metadata) {
49 program_id = metadata.GetTitleID();
50 vm_manager.Reset(metadata.GetAddressSpaceType());
51}
52
45void Process::ParseKernelCaps(const u32* kernel_caps, std::size_t len) { 53void Process::ParseKernelCaps(const u32* kernel_caps, std::size_t len) {
46 for (std::size_t i = 0; i < len; ++i) { 54 for (std::size_t i = 0; i < len; ++i) {
47 u32 descriptor = kernel_caps[i]; 55 u32 descriptor = kernel_caps[i];
diff --git a/src/core/hle/kernel/process.h b/src/core/hle/kernel/process.h
index 04d74e572..adb03c228 100644
--- a/src/core/hle/kernel/process.h
+++ b/src/core/hle/kernel/process.h
@@ -17,6 +17,10 @@
17#include "core/hle/kernel/thread.h" 17#include "core/hle/kernel/thread.h"
18#include "core/hle/kernel/vm_manager.h" 18#include "core/hle/kernel/vm_manager.h"
19 19
20namespace FileSys {
21class ProgramMetadata;
22}
23
20namespace Kernel { 24namespace Kernel {
21 25
22class KernelCore; 26class KernelCore;
@@ -141,6 +145,14 @@ public:
141 return process_id; 145 return process_id;
142 } 146 }
143 147
148 /**
149 * Loads process-specifics configuration info with metadata provided
150 * by an executable.
151 *
152 * @param metadata The provided metadata to load process specific info.
153 */
154 void LoadFromMetadata(const FileSys::ProgramMetadata& metadata);
155
144 /// Title ID corresponding to the process 156 /// Title ID corresponding to the process
145 u64 program_id; 157 u64 program_id;
146 158
diff --git a/src/core/hle/kernel/vm_manager.cpp b/src/core/hle/kernel/vm_manager.cpp
index 608cbd57b..337f17b7b 100644
--- a/src/core/hle/kernel/vm_manager.cpp
+++ b/src/core/hle/kernel/vm_manager.cpp
@@ -9,6 +9,7 @@
9#include "common/logging/log.h" 9#include "common/logging/log.h"
10#include "core/arm/arm_interface.h" 10#include "core/arm/arm_interface.h"
11#include "core/core.h" 11#include "core/core.h"
12#include "core/file_sys/program_metadata.h"
12#include "core/hle/kernel/errors.h" 13#include "core/hle/kernel/errors.h"
13#include "core/hle/kernel/vm_manager.h" 14#include "core/hle/kernel/vm_manager.h"
14#include "core/memory.h" 15#include "core/memory.h"
@@ -54,25 +55,24 @@ bool VirtualMemoryArea::CanBeMergedWith(const VirtualMemoryArea& next) const {
54} 55}
55 56
56VMManager::VMManager() { 57VMManager::VMManager() {
57 Reset(); 58 // Default to assuming a 39-bit address space. This way we have a sane
59 // starting point with executables that don't provide metadata.
60 Reset(FileSys::ProgramAddressSpaceType::Is39Bit);
58} 61}
59 62
60VMManager::~VMManager() { 63VMManager::~VMManager() {
61 Reset(); 64 Reset(FileSys::ProgramAddressSpaceType::Is39Bit);
62} 65}
63 66
64void VMManager::Reset() { 67void VMManager::Reset(FileSys::ProgramAddressSpaceType type) {
65 vma_map.clear(); 68 Clear();
69 InitializeMemoryRegionRanges(type);
66 70
67 // Initialize the map with a single free region covering the entire managed space. 71 // Initialize the map with a single free region covering the entire managed space.
68 VirtualMemoryArea initial_vma; 72 VirtualMemoryArea initial_vma;
69 initial_vma.size = MAX_ADDRESS; 73 initial_vma.size = MAX_ADDRESS;
70 vma_map.emplace(initial_vma.base, initial_vma); 74 vma_map.emplace(initial_vma.base, initial_vma);
71 75
72 page_table.pointers.fill(nullptr);
73 page_table.special_regions.clear();
74 page_table.attributes.fill(Memory::PageType::Unmapped);
75
76 UpdatePageTableForVMA(initial_vma); 76 UpdatePageTableForVMA(initial_vma);
77} 77}
78 78
@@ -382,6 +382,84 @@ void VMManager::UpdatePageTableForVMA(const VirtualMemoryArea& vma) {
382 } 382 }
383} 383}
384 384
385void VMManager::InitializeMemoryRegionRanges(FileSys::ProgramAddressSpaceType type) {
386 u64 map_region_size = 0;
387 u64 heap_region_size = 0;
388 u64 new_map_region_size = 0;
389 u64 tls_io_region_size = 0;
390
391 switch (type) {
392 case FileSys::ProgramAddressSpaceType::Is32Bit:
393 address_space_width = 32;
394 code_region_base = 0x200000;
395 code_region_end = code_region_base + 0x3FE00000;
396 map_region_size = 0x40000000;
397 heap_region_size = 0x40000000;
398 break;
399 case FileSys::ProgramAddressSpaceType::Is36Bit:
400 address_space_width = 36;
401 code_region_base = 0x8000000;
402 code_region_end = code_region_base + 0x78000000;
403 map_region_size = 0x180000000;
404 heap_region_size = 0x180000000;
405 break;
406 case FileSys::ProgramAddressSpaceType::Is32BitNoMap:
407 address_space_width = 32;
408 code_region_base = 0x200000;
409 code_region_end = code_region_base + 0x3FE00000;
410 map_region_size = 0;
411 heap_region_size = 0x80000000;
412 break;
413 case FileSys::ProgramAddressSpaceType::Is39Bit:
414 address_space_width = 39;
415 code_region_base = 0x8000000;
416 code_region_end = code_region_base + 0x80000000;
417 map_region_size = 0x1000000000;
418 heap_region_size = 0x180000000;
419 new_map_region_size = 0x80000000;
420 tls_io_region_size = 0x1000000000;
421 break;
422 default:
423 UNREACHABLE_MSG("Invalid address space type specified: {}", static_cast<u32>(type));
424 return;
425 }
426
427 address_space_base = 0;
428 address_space_end = 1ULL << address_space_width;
429
430 map_region_base = code_region_end;
431 map_region_end = map_region_base + map_region_size;
432
433 heap_region_base = map_region_end;
434 heap_region_end = heap_region_base + heap_region_size;
435
436 new_map_region_base = heap_region_end;
437 new_map_region_end = new_map_region_base + new_map_region_size;
438
439 tls_io_region_base = new_map_region_end;
440 tls_io_region_end = tls_io_region_base + tls_io_region_size;
441
442 if (new_map_region_size == 0) {
443 new_map_region_base = address_space_base;
444 new_map_region_end = address_space_end;
445 }
446}
447
448void VMManager::Clear() {
449 ClearVMAMap();
450 ClearPageTable();
451}
452
453void VMManager::ClearVMAMap() {
454 vma_map.clear();
455}
456
457void VMManager::ClearPageTable() {
458 page_table.pointers.fill(nullptr);
459 page_table.special_regions.clear();
460 page_table.attributes.fill(Memory::PageType::Unmapped);
461}
462
385u64 VMManager::GetTotalMemoryUsage() const { 463u64 VMManager::GetTotalMemoryUsage() const {
386 LOG_WARNING(Kernel, "(STUBBED) called"); 464 LOG_WARNING(Kernel, "(STUBBED) called");
387 return 0xF8000000; 465 return 0xF8000000;
@@ -402,4 +480,64 @@ u64 VMManager::GetAddressSpaceSize() const {
402 return MAX_ADDRESS; 480 return MAX_ADDRESS;
403} 481}
404 482
483VAddr VMManager::GetCodeRegionBaseAddress() const {
484 return code_region_base;
485}
486
487VAddr VMManager::GetCodeRegionEndAddress() const {
488 return code_region_end;
489}
490
491u64 VMManager::GetCodeRegionSize() const {
492 return code_region_end - code_region_base;
493}
494
495VAddr VMManager::GetHeapRegionBaseAddress() const {
496 return heap_region_base;
497}
498
499VAddr VMManager::GetHeapRegionEndAddress() const {
500 return heap_region_end;
501}
502
503u64 VMManager::GetHeapRegionSize() const {
504 return heap_region_end - heap_region_base;
505}
506
507VAddr VMManager::GetMapRegionBaseAddress() const {
508 return map_region_base;
509}
510
511VAddr VMManager::GetMapRegionEndAddress() const {
512 return map_region_end;
513}
514
515u64 VMManager::GetMapRegionSize() const {
516 return map_region_end - map_region_base;
517}
518
519VAddr VMManager::GetNewMapRegionBaseAddress() const {
520 return new_map_region_base;
521}
522
523VAddr VMManager::GetNewMapRegionEndAddress() const {
524 return new_map_region_end;
525}
526
527u64 VMManager::GetNewMapRegionSize() const {
528 return new_map_region_end - new_map_region_base;
529}
530
531VAddr VMManager::GetTLSIORegionBaseAddress() const {
532 return tls_io_region_base;
533}
534
535VAddr VMManager::GetTLSIORegionEndAddress() const {
536 return tls_io_region_end;
537}
538
539u64 VMManager::GetTLSIORegionSize() const {
540 return tls_io_region_end - tls_io_region_base;
541}
542
405} // namespace Kernel 543} // namespace Kernel
diff --git a/src/core/hle/kernel/vm_manager.h b/src/core/hle/kernel/vm_manager.h
index de75036c0..0ce240126 100644
--- a/src/core/hle/kernel/vm_manager.h
+++ b/src/core/hle/kernel/vm_manager.h
@@ -12,6 +12,10 @@
12#include "core/memory.h" 12#include "core/memory.h"
13#include "core/memory_hook.h" 13#include "core/memory_hook.h"
14 14
15namespace FileSys {
16enum class ProgramAddressSpaceType : u8;
17}
18
15namespace Kernel { 19namespace Kernel {
16 20
17enum class VMAType : u8 { 21enum class VMAType : u8 {
@@ -130,7 +134,7 @@ public:
130 ~VMManager(); 134 ~VMManager();
131 135
132 /// Clears the address space map, re-initializing with a single free area. 136 /// Clears the address space map, re-initializing with a single free area.
133 void Reset(); 137 void Reset(FileSys::ProgramAddressSpaceType type);
134 138
135 /// Finds the VMA in which the given address is included in, or `vma_map.end()`. 139 /// Finds the VMA in which the given address is included in, or `vma_map.end()`.
136 VMAHandle FindVMA(VAddr target) const; 140 VMAHandle FindVMA(VAddr target) const;
@@ -195,12 +199,57 @@ public:
195 /// Gets the total heap usage, used by svcGetInfo 199 /// Gets the total heap usage, used by svcGetInfo
196 u64 GetTotalHeapUsage() const; 200 u64 GetTotalHeapUsage() const;
197 201
198 /// Gets the total address space base address, used by svcGetInfo 202 /// Gets the address space base address, used by svcGetInfo
199 VAddr GetAddressSpaceBaseAddr() const; 203 VAddr GetAddressSpaceBaseAddr() const;
200 204
201 /// Gets the total address space address size, used by svcGetInfo 205 /// Gets the total address space address size, used by svcGetInfo
202 u64 GetAddressSpaceSize() const; 206 u64 GetAddressSpaceSize() const;
203 207
208 /// Gets the base address of the code region.
209 VAddr GetCodeRegionBaseAddress() const;
210
211 /// Gets the end address of the code region.
212 VAddr GetCodeRegionEndAddress() const;
213
214 /// Gets the total size of the code region in bytes.
215 u64 GetCodeRegionSize() const;
216
217 /// Gets the base address of the heap region.
218 VAddr GetHeapRegionBaseAddress() const;
219
220 /// Gets the end address of the heap region;
221 VAddr GetHeapRegionEndAddress() const;
222
223 /// Gets the total size of the heap region in bytes.
224 u64 GetHeapRegionSize() const;
225
226 /// Gets the base address of the map region.
227 VAddr GetMapRegionBaseAddress() const;
228
229 /// Gets the end address of the map region.
230 VAddr GetMapRegionEndAddress() const;
231
232 /// Gets the total size of the map region in bytes.
233 u64 GetMapRegionSize() const;
234
235 /// Gets the base address of the new map region.
236 VAddr GetNewMapRegionBaseAddress() const;
237
238 /// Gets the end address of the new map region.
239 VAddr GetNewMapRegionEndAddress() const;
240
241 /// Gets the total size of the new map region in bytes.
242 u64 GetNewMapRegionSize() const;
243
244 /// Gets the base address of the TLS IO region.
245 VAddr GetTLSIORegionBaseAddress() const;
246
247 /// Gets the end address of the TLS IO region.
248 VAddr GetTLSIORegionEndAddress() const;
249
250 /// Gets the total size of the TLS IO region in bytes.
251 u64 GetTLSIORegionSize() const;
252
204 /// Each VMManager has its own page table, which is set as the main one when the owning process 253 /// Each VMManager has its own page table, which is set as the main one when the owning process
205 /// is scheduled. 254 /// is scheduled.
206 Memory::PageTable page_table; 255 Memory::PageTable page_table;
@@ -240,5 +289,36 @@ private:
240 289
241 /// Updates the pages corresponding to this VMA so they match the VMA's attributes. 290 /// Updates the pages corresponding to this VMA so they match the VMA's attributes.
242 void UpdatePageTableForVMA(const VirtualMemoryArea& vma); 291 void UpdatePageTableForVMA(const VirtualMemoryArea& vma);
292
293 /// Initializes memory region ranges to adhere to a given address space type.
294 void InitializeMemoryRegionRanges(FileSys::ProgramAddressSpaceType type);
295
296 /// Clears the underlying map and page table.
297 void Clear();
298
299 /// Clears out the VMA map, unmapping any previously mapped ranges.
300 void ClearVMAMap();
301
302 /// Clears out the page table
303 void ClearPageTable();
304
305 u32 address_space_width = 0;
306 VAddr address_space_base = 0;
307 VAddr address_space_end = 0;
308
309 VAddr code_region_base = 0;
310 VAddr code_region_end = 0;
311
312 VAddr heap_region_base = 0;
313 VAddr heap_region_end = 0;
314
315 VAddr map_region_base = 0;
316 VAddr map_region_end = 0;
317
318 VAddr new_map_region_base = 0;
319 VAddr new_map_region_end = 0;
320
321 VAddr tls_io_region_base = 0;
322 VAddr tls_io_region_end = 0;
243}; 323};
244} // namespace Kernel 324} // namespace Kernel
diff --git a/src/core/loader/deconstructed_rom_directory.cpp b/src/core/loader/deconstructed_rom_directory.cpp
index 2b8f78136..44d62ab7f 100644
--- a/src/core/loader/deconstructed_rom_directory.cpp
+++ b/src/core/loader/deconstructed_rom_directory.cpp
@@ -14,7 +14,6 @@
14#include "core/gdbstub/gdbstub.h" 14#include "core/gdbstub/gdbstub.h"
15#include "core/hle/kernel/kernel.h" 15#include "core/hle/kernel/kernel.h"
16#include "core/hle/kernel/process.h" 16#include "core/hle/kernel/process.h"
17#include "core/hle/kernel/resource_limit.h"
18#include "core/hle/service/filesystem/filesystem.h" 17#include "core/hle/service/filesystem/filesystem.h"
19#include "core/loader/deconstructed_rom_directory.h" 18#include "core/loader/deconstructed_rom_directory.h"
20#include "core/loader/nso.h" 19#include "core/loader/nso.h"
@@ -127,10 +126,13 @@ ResultStatus AppLoader_DeconstructedRomDirectory::Load(
127 metadata.Print(); 126 metadata.Print();
128 127
129 const FileSys::ProgramAddressSpaceType arch_bits{metadata.GetAddressSpaceType()}; 128 const FileSys::ProgramAddressSpaceType arch_bits{metadata.GetAddressSpaceType()};
130 if (arch_bits == FileSys::ProgramAddressSpaceType::Is32Bit) { 129 if (arch_bits == FileSys::ProgramAddressSpaceType::Is32Bit ||
130 arch_bits == FileSys::ProgramAddressSpaceType::Is32BitNoMap) {
131 return ResultStatus::Error32BitISA; 131 return ResultStatus::Error32BitISA;
132 } 132 }
133 133
134 process->LoadFromMetadata(metadata);
135
134 // Load NSO modules 136 // Load NSO modules
135 VAddr next_load_addr{Memory::PROCESS_IMAGE_VADDR}; 137 VAddr next_load_addr{Memory::PROCESS_IMAGE_VADDR};
136 for (const auto& module : {"rtld", "main", "subsdk0", "subsdk1", "subsdk2", "subsdk3", 138 for (const auto& module : {"rtld", "main", "subsdk0", "subsdk1", "subsdk2", "subsdk3",
@@ -145,11 +147,6 @@ ResultStatus AppLoader_DeconstructedRomDirectory::Load(
145 } 147 }
146 } 148 }
147 149
148 auto& kernel = Core::System::GetInstance().Kernel();
149 process->program_id = metadata.GetTitleID();
150 process->svc_access_mask.set();
151 process->resource_limit =
152 kernel.ResourceLimitForCategory(Kernel::ResourceLimitCategory::APPLICATION);
153 process->Run(Memory::PROCESS_IMAGE_VADDR, metadata.GetMainThreadPriority(), 150 process->Run(Memory::PROCESS_IMAGE_VADDR, metadata.GetMainThreadPriority(),
154 metadata.GetMainThreadStackSize()); 151 metadata.GetMainThreadStackSize());
155 152
diff --git a/src/core/loader/elf.cpp b/src/core/loader/elf.cpp
index 0e2af20b4..00d8a82b8 100644
--- a/src/core/loader/elf.cpp
+++ b/src/core/loader/elf.cpp
@@ -12,7 +12,6 @@
12#include "core/core.h" 12#include "core/core.h"
13#include "core/hle/kernel/kernel.h" 13#include "core/hle/kernel/kernel.h"
14#include "core/hle/kernel/process.h" 14#include "core/hle/kernel/process.h"
15#include "core/hle/kernel/resource_limit.h"
16#include "core/loader/elf.h" 15#include "core/loader/elf.h"
17#include "core/memory.h" 16#include "core/memory.h"
18 17
@@ -400,13 +399,6 @@ ResultStatus AppLoader_ELF::Load(Kernel::SharedPtr<Kernel::Process>& process) {
400 codeset->name = file->GetName(); 399 codeset->name = file->GetName();
401 400
402 process->LoadModule(codeset, codeset->entrypoint); 401 process->LoadModule(codeset, codeset->entrypoint);
403 process->svc_access_mask.set();
404
405 // Attach the default resource limit (APPLICATION) to the process
406 auto& kernel = Core::System::GetInstance().Kernel();
407 process->resource_limit =
408 kernel.ResourceLimitForCategory(Kernel::ResourceLimitCategory::APPLICATION);
409
410 process->Run(codeset->entrypoint, 48, Memory::DEFAULT_STACK_SIZE); 402 process->Run(codeset->entrypoint, 48, Memory::DEFAULT_STACK_SIZE);
411 403
412 is_loaded = true; 404 is_loaded = true;
diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp
index c49ec34ab..2385012eb 100644
--- a/src/core/loader/nro.cpp
+++ b/src/core/loader/nro.cpp
@@ -16,7 +16,6 @@
16#include "core/gdbstub/gdbstub.h" 16#include "core/gdbstub/gdbstub.h"
17#include "core/hle/kernel/kernel.h" 17#include "core/hle/kernel/kernel.h"
18#include "core/hle/kernel/process.h" 18#include "core/hle/kernel/process.h"
19#include "core/hle/kernel/resource_limit.h"
20#include "core/loader/nro.h" 19#include "core/loader/nro.h"
21#include "core/memory.h" 20#include "core/memory.h"
22 21
@@ -187,10 +186,6 @@ ResultStatus AppLoader_NRO::Load(Kernel::SharedPtr<Kernel::Process>& process) {
187 return ResultStatus::ErrorLoadingNRO; 186 return ResultStatus::ErrorLoadingNRO;
188 } 187 }
189 188
190 auto& kernel = Core::System::GetInstance().Kernel();
191 process->svc_access_mask.set();
192 process->resource_limit =
193 kernel.ResourceLimitForCategory(Kernel::ResourceLimitCategory::APPLICATION);
194 process->Run(base_addr, Kernel::THREADPRIO_DEFAULT, Memory::DEFAULT_STACK_SIZE); 189 process->Run(base_addr, Kernel::THREADPRIO_DEFAULT, Memory::DEFAULT_STACK_SIZE);
195 190
196 is_loaded = true; 191 is_loaded = true;
diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp
index 78a4438c4..9fd9933fb 100644
--- a/src/core/loader/nso.cpp
+++ b/src/core/loader/nso.cpp
@@ -13,7 +13,6 @@
13#include "core/gdbstub/gdbstub.h" 13#include "core/gdbstub/gdbstub.h"
14#include "core/hle/kernel/kernel.h" 14#include "core/hle/kernel/kernel.h"
15#include "core/hle/kernel/process.h" 15#include "core/hle/kernel/process.h"
16#include "core/hle/kernel/resource_limit.h"
17#include "core/loader/nso.h" 16#include "core/loader/nso.h"
18#include "core/memory.h" 17#include "core/memory.h"
19 18
@@ -162,10 +161,6 @@ ResultStatus AppLoader_NSO::Load(Kernel::SharedPtr<Kernel::Process>& process) {
162 LoadModule(file, Memory::PROCESS_IMAGE_VADDR); 161 LoadModule(file, Memory::PROCESS_IMAGE_VADDR);
163 LOG_DEBUG(Loader, "loaded module {} @ 0x{:X}", file->GetName(), Memory::PROCESS_IMAGE_VADDR); 162 LOG_DEBUG(Loader, "loaded module {} @ 0x{:X}", file->GetName(), Memory::PROCESS_IMAGE_VADDR);
164 163
165 auto& kernel = Core::System::GetInstance().Kernel();
166 process->svc_access_mask.set();
167 process->resource_limit =
168 kernel.ResourceLimitForCategory(Kernel::ResourceLimitCategory::APPLICATION);
169 process->Run(Memory::PROCESS_IMAGE_VADDR, Kernel::THREADPRIO_DEFAULT, 164 process->Run(Memory::PROCESS_IMAGE_VADDR, Kernel::THREADPRIO_DEFAULT,
170 Memory::DEFAULT_STACK_SIZE); 165 Memory::DEFAULT_STACK_SIZE);
171 166