diff options
| author | 2017-10-22 23:50:26 -0400 | |
|---|---|---|
| committer | 2017-10-22 23:50:26 -0400 | |
| commit | 3f0caefdf5dbb19fb6a0e714b7cc3f9b2640bada (patch) | |
| tree | ff2a39ae5c6b20b6ddd77cd3a38d2729c8661f59 /src/core/loader/nso.cpp | |
| parent | memory: Support 32-bit paging, move heap address space up. (diff) | |
| download | yuzu-3f0caefdf5dbb19fb6a0e714b7cc3f9b2640bada.tar.gz yuzu-3f0caefdf5dbb19fb6a0e714b7cc3f9b2640bada.tar.xz yuzu-3f0caefdf5dbb19fb6a0e714b7cc3f9b2640bada.zip | |
nso: Load more common submodules.
Diffstat (limited to 'src/core/loader/nso.cpp')
| -rw-r--r-- | src/core/loader/nso.cpp | 26 |
1 files changed, 11 insertions, 15 deletions
diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp index 7b44d452e..0e45dadcb 100644 --- a/src/core/loader/nso.cpp +++ b/src/core/loader/nso.cpp | |||
| @@ -153,22 +153,18 @@ ResultStatus AppLoader_NSO::Load(Kernel::SharedPtr<Kernel::Process>& process) { | |||
| 153 | return ResultStatus::Error; | 153 | return ResultStatus::Error; |
| 154 | } | 154 | } |
| 155 | 155 | ||
| 156 | // Load and relocate "rtld" NSO | ||
| 157 | static constexpr VAddr base_addr{Memory::PROCESS_IMAGE_VADDR}; | ||
| 158 | process = Kernel::Process::Create("main"); | 156 | process = Kernel::Process::Create("main"); |
| 159 | VAddr next_base_addr{LoadNso(filepath, base_addr)}; | ||
| 160 | if (!next_base_addr) { | ||
| 161 | return ResultStatus::ErrorInvalidFormat; | ||
| 162 | } | ||
| 163 | 157 | ||
| 164 | // Load and relocate remaining submodules | 158 | // Load NSO modules |
| 165 | for (const auto& module_name : {"main", "sdk", "subsdk0", "subsdk1"}) { | 159 | VAddr next_load_addr{Memory::PROCESS_IMAGE_VADDR}; |
| 166 | LOG_INFO(Loader, "loading %s @ 0x%llx", module_name, next_base_addr); | 160 | for (const auto& module : {"rtld", "main", "sdk", "subsdk0", "subsdk1", "subsdk2", "subsdk3"}) { |
| 167 | const std::string module_path = | 161 | const std::string path = filepath.substr(0, filepath.find_last_of("/\\")) + "/" + module; |
| 168 | filepath.substr(0, filepath.find_last_of("/\\")) + "/" + module_name; | 162 | const VAddr load_addr = next_load_addr; |
| 169 | next_base_addr = LoadNso(module_path, next_base_addr); | 163 | next_load_addr = LoadNso(path, load_addr); |
| 170 | if (!next_base_addr) { | 164 | if (next_load_addr) { |
| 171 | LOG_WARNING(Loader, "failed to find load module: %s", module_name); | 165 | LOG_DEBUG(Loader, "loaded module %s @ 0x%llx", module, load_addr); |
| 166 | } else { | ||
| 167 | next_load_addr = load_addr; | ||
| 172 | } | 168 | } |
| 173 | } | 169 | } |
| 174 | 170 | ||
| @@ -176,7 +172,7 @@ ResultStatus AppLoader_NSO::Load(Kernel::SharedPtr<Kernel::Process>& process) { | |||
| 176 | process->address_mappings = default_address_mappings; | 172 | process->address_mappings = default_address_mappings; |
| 177 | process->resource_limit = | 173 | process->resource_limit = |
| 178 | Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION); | 174 | Kernel::ResourceLimit::GetForCategory(Kernel::ResourceLimitCategory::APPLICATION); |
| 179 | process->Run(base_addr, 48, Kernel::DEFAULT_STACK_SIZE); | 175 | process->Run(Memory::PROCESS_IMAGE_VADDR, 48, Kernel::DEFAULT_STACK_SIZE); |
| 180 | 176 | ||
| 181 | ResolveImports(); | 177 | ResolveImports(); |
| 182 | 178 | ||