diff options
| -rw-r--r-- | src/core/loader/nro.cpp | 23 | ||||
| -rw-r--r-- | src/core/loader/nro.h | 2 |
2 files changed, 14 insertions, 11 deletions
diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp index 5d7e8136e..906544bc9 100644 --- a/src/core/loader/nro.cpp +++ b/src/core/loader/nro.cpp | |||
| @@ -131,7 +131,7 @@ static constexpr u32 PageAlignSize(u32 size) { | |||
| 131 | } | 131 | } |
| 132 | 132 | ||
| 133 | static bool LoadNroImpl(Kernel::Process& process, const std::vector<u8>& data, | 133 | static bool LoadNroImpl(Kernel::Process& process, const std::vector<u8>& data, |
| 134 | const std::string& name, VAddr load_base) { | 134 | const std::string& name) { |
| 135 | if (data.size() < sizeof(NroHeader)) { | 135 | if (data.size() < sizeof(NroHeader)) { |
| 136 | return {}; | 136 | return {}; |
| 137 | } | 137 | } |
| @@ -187,19 +187,25 @@ static bool LoadNroImpl(Kernel::Process& process, const std::vector<u8>& data, | |||
| 187 | codeset.DataSegment().size += bss_size; | 187 | codeset.DataSegment().size += bss_size; |
| 188 | program_image.resize(static_cast<u32>(program_image.size()) + bss_size); | 188 | program_image.resize(static_cast<u32>(program_image.size()) + bss_size); |
| 189 | 189 | ||
| 190 | // Setup the process code layout | ||
| 191 | if (process.LoadFromMetadata(FileSys::ProgramMetadata::GetDefault(), program_image.size()) | ||
| 192 | .IsError()) { | ||
| 193 | return false; | ||
| 194 | } | ||
| 195 | |||
| 190 | // Load codeset for current process | 196 | // Load codeset for current process |
| 191 | codeset.memory = std::move(program_image); | 197 | codeset.memory = std::move(program_image); |
| 192 | process.LoadModule(std::move(codeset), load_base); | 198 | process.LoadModule(std::move(codeset), process.PageTable().GetCodeRegionStart()); |
| 193 | 199 | ||
| 194 | // Register module with GDBStub | 200 | // Register module with GDBStub |
| 195 | GDBStub::RegisterModule(name, load_base, load_base); | 201 | GDBStub::RegisterModule(name, process.PageTable().GetCodeRegionStart(), |
| 202 | process.PageTable().GetCodeRegionEnd()); | ||
| 196 | 203 | ||
| 197 | return true; | 204 | return true; |
| 198 | } | 205 | } |
| 199 | 206 | ||
| 200 | bool AppLoader_NRO::LoadNro(Kernel::Process& process, const FileSys::VfsFile& file, | 207 | bool AppLoader_NRO::LoadNro(Kernel::Process& process, const FileSys::VfsFile& file) { |
| 201 | VAddr load_base) { | 208 | return LoadNroImpl(process, file.ReadAllBytes(), file.GetName()); |
| 202 | return LoadNroImpl(process, file.ReadAllBytes(), file.GetName(), load_base); | ||
| 203 | } | 209 | } |
| 204 | 210 | ||
| 205 | AppLoader_NRO::LoadResult AppLoader_NRO::Load(Kernel::Process& process) { | 211 | AppLoader_NRO::LoadResult AppLoader_NRO::Load(Kernel::Process& process) { |
| @@ -207,10 +213,7 @@ AppLoader_NRO::LoadResult AppLoader_NRO::Load(Kernel::Process& process) { | |||
| 207 | return {ResultStatus::ErrorAlreadyLoaded, {}}; | 213 | return {ResultStatus::ErrorAlreadyLoaded, {}}; |
| 208 | } | 214 | } |
| 209 | 215 | ||
| 210 | // Load NRO | 216 | if (!LoadNro(process, *file)) { |
| 211 | const VAddr base_address = process.PageTable().GetCodeRegionStart(); | ||
| 212 | |||
| 213 | if (!LoadNro(process, *file, base_address)) { | ||
| 214 | return {ResultStatus::ErrorLoadingNRO, {}}; | 217 | return {ResultStatus::ErrorLoadingNRO, {}}; |
| 215 | } | 218 | } |
| 216 | 219 | ||
diff --git a/src/core/loader/nro.h b/src/core/loader/nro.h index 71811bc29..4593d48fb 100644 --- a/src/core/loader/nro.h +++ b/src/core/loader/nro.h | |||
| @@ -47,7 +47,7 @@ public: | |||
| 47 | bool IsRomFSUpdatable() const override; | 47 | bool IsRomFSUpdatable() const override; |
| 48 | 48 | ||
| 49 | private: | 49 | private: |
| 50 | bool LoadNro(Kernel::Process& process, const FileSys::VfsFile& file, VAddr load_base); | 50 | bool LoadNro(Kernel::Process& process, const FileSys::VfsFile& file); |
| 51 | 51 | ||
| 52 | std::vector<u8> icon_data; | 52 | std::vector<u8> icon_data; |
| 53 | std::unique_ptr<FileSys::NACP> nacp; | 53 | std::unique_ptr<FileSys::NACP> nacp; |