From bc2212106f755f85e55d039ffc783116b15e5df6 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Mon, 5 Jan 2015 20:09:35 +0000 Subject: Loader: Fix indentation, whitespace, and a few other such cosmetic stuff. --- src/core/loader/3dsx.cpp | 48 +++++++++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 25 deletions(-) (limited to 'src/core/loader/3dsx.cpp') diff --git a/src/core/loader/3dsx.cpp b/src/core/loader/3dsx.cpp index 4d072871a..fad544571 100644 --- a/src/core/loader/3dsx.cpp +++ b/src/core/loader/3dsx.cpp @@ -13,11 +13,9 @@ #include "3dsx.h" - namespace Loader { - -/** +/** * File layout: * - File header * - Code, rodata and data relocation table headers @@ -64,9 +62,9 @@ struct THREEDSX_Header struct THREEDSX_RelocHdr { // # of absolute relocations (that is, fix address to post-relocation memory layout) - u32 cross_segment_absolute; + u32 cross_segment_absolute; // # of cross-segment relative relocations (that is, 32bit signed offsets that need to be patched) - u32 cross_segment_relative; + u32 cross_segment_relative; // more? // Relocations are written in this order: @@ -207,28 +205,28 @@ int THREEDSXReader::Load3DSXFile(const std::string& filename, u32 base_addr) return ERROR_NONE; } - /// AppLoader_DSX constructor - AppLoader_THREEDSX::AppLoader_THREEDSX(const std::string& filename) : filename(filename) { - } +/// AppLoader_DSX constructor +AppLoader_THREEDSX::AppLoader_THREEDSX(const std::string& filename) : filename(filename) { +} - /// AppLoader_DSX destructor - AppLoader_THREEDSX::~AppLoader_THREEDSX() { - } +/// AppLoader_DSX destructor +AppLoader_THREEDSX::~AppLoader_THREEDSX() { +} - /** - * Loads a 3DSX file - * @return Success on success, otherwise Error - */ - ResultStatus AppLoader_THREEDSX::Load() { - LOG_INFO(Loader, "Loading 3DSX file %s...", filename.c_str()); - FileUtil::IOFile file(filename, "rb"); - if (file.IsOpen()) { - THREEDSXReader::Load3DSXFile(filename, 0x00100000); - Kernel::LoadExec(0x00100000); - } else { - return ResultStatus::Error; - } - return ResultStatus::Success; +/** +* Loads a 3DSX file +* @return Success on success, otherwise Error +*/ +ResultStatus AppLoader_THREEDSX::Load() { + LOG_INFO(Loader, "Loading 3DSX file %s...", filename.c_str()); + FileUtil::IOFile file(filename, "rb"); + if (file.IsOpen()) { + THREEDSXReader::Load3DSXFile(filename, 0x00100000); + Kernel::LoadExec(0x00100000); + } else { + return ResultStatus::Error; } + return ResultStatus::Success; +} } // namespace Loader -- cgit v1.2.3 From 43e699d849ac5dd7a29ff0eeb5821e2a824c091e Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Tue, 6 Jan 2015 23:36:48 +0000 Subject: =?UTF-8?q?Loader:=20Don=E2=80=99t=20duplicate=20the=20docstring?= =?UTF-8?q?=20into=20the=20cpp=20file.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/loader/3dsx.cpp | 4 ---- 1 file changed, 4 deletions(-) (limited to 'src/core/loader/3dsx.cpp') diff --git a/src/core/loader/3dsx.cpp b/src/core/loader/3dsx.cpp index fad544571..06827668f 100644 --- a/src/core/loader/3dsx.cpp +++ b/src/core/loader/3dsx.cpp @@ -213,10 +213,6 @@ AppLoader_THREEDSX::AppLoader_THREEDSX(const std::string& filename) : filename(f AppLoader_THREEDSX::~AppLoader_THREEDSX() { } -/** -* Loads a 3DSX file -* @return Success on success, otherwise Error -*/ ResultStatus AppLoader_THREEDSX::Load() { LOG_INFO(Loader, "Loading 3DSX file %s...", filename.c_str()); FileUtil::IOFile file(filename, "rb"); -- cgit v1.2.3 From 85030c6e6bfe83b6671de45b25535fe3ef713319 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Tue, 6 Jan 2015 19:49:25 +0000 Subject: Loader: Never forget to change is_loaded. --- src/core/loader/3dsx.cpp | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src/core/loader/3dsx.cpp') diff --git a/src/core/loader/3dsx.cpp b/src/core/loader/3dsx.cpp index 06827668f..15032e0ae 100644 --- a/src/core/loader/3dsx.cpp +++ b/src/core/loader/3dsx.cpp @@ -215,13 +215,20 @@ AppLoader_THREEDSX::~AppLoader_THREEDSX() { ResultStatus AppLoader_THREEDSX::Load() { LOG_INFO(Loader, "Loading 3DSX file %s...", filename.c_str()); + + if (is_loaded) + return ResultStatus::ErrorAlreadyLoaded; + FileUtil::IOFile file(filename, "rb"); + if (file.IsOpen()) { THREEDSXReader::Load3DSXFile(filename, 0x00100000); Kernel::LoadExec(0x00100000); } else { return ResultStatus::Error; } + + is_loaded = true; return ResultStatus::Success; } -- cgit v1.2.3 From 9d3bb8b7c00b953cfd87479570c25a5e607f3e61 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Tue, 6 Jan 2015 19:56:26 +0000 Subject: Loader: Remove the useless THREEDSXReader class. --- src/core/loader/3dsx.cpp | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) (limited to 'src/core/loader/3dsx.cpp') diff --git a/src/core/loader/3dsx.cpp b/src/core/loader/3dsx.cpp index 15032e0ae..54ee992fc 100644 --- a/src/core/loader/3dsx.cpp +++ b/src/core/loader/3dsx.cpp @@ -86,11 +86,6 @@ struct THREEloadinfo u32 seg_sizes[3]; }; -class THREEDSXReader { -public: - static int Load3DSXFile(const std::string& filename, u32 base_addr); -}; - static u32 TranslateAddr(u32 addr, THREEloadinfo *loadinfo, u32* offsets) { if (addr < offsets[0]) @@ -100,12 +95,11 @@ static u32 TranslateAddr(u32 addr, THREEloadinfo *loadinfo, u32* offsets) return loadinfo->seg_addrs[2] + addr - offsets[1]; } -int THREEDSXReader::Load3DSXFile(const std::string& filename, u32 base_addr) +static THREEDSX_Error Load3DSXFile(FileUtil::IOFile& file, u32 base_addr) { - FileUtil::IOFile file(filename, "rb"); - if (!file.IsOpen()) { + if (!file.IsOpen()) return ERROR_FILE; - } + THREEDSX_Header hdr; if (file.ReadBytes(&hdr, sizeof(hdr)) != sizeof(hdr)) return ERROR_READ; @@ -222,7 +216,7 @@ ResultStatus AppLoader_THREEDSX::Load() { FileUtil::IOFile file(filename, "rb"); if (file.IsOpen()) { - THREEDSXReader::Load3DSXFile(filename, 0x00100000); + Load3DSXFile(file, 0x00100000); Kernel::LoadExec(0x00100000); } else { return ResultStatus::Error; -- cgit v1.2.3 From b5237e885df72f6c37532fc8af9573966e7b07e5 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Tue, 6 Jan 2015 21:30:40 +0000 Subject: Loader: Keep a reference to the file and pass it to the correct AppLoader, instead of loading it multiple times. --- src/core/loader/3dsx.cpp | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) (limited to 'src/core/loader/3dsx.cpp') diff --git a/src/core/loader/3dsx.cpp b/src/core/loader/3dsx.cpp index 54ee992fc..873ee8b25 100644 --- a/src/core/loader/3dsx.cpp +++ b/src/core/loader/3dsx.cpp @@ -199,28 +199,15 @@ static THREEDSX_Error Load3DSXFile(FileUtil::IOFile& file, u32 base_addr) return ERROR_NONE; } -/// AppLoader_DSX constructor -AppLoader_THREEDSX::AppLoader_THREEDSX(const std::string& filename) : filename(filename) { -} - -/// AppLoader_DSX destructor -AppLoader_THREEDSX::~AppLoader_THREEDSX() { -} - ResultStatus AppLoader_THREEDSX::Load() { - LOG_INFO(Loader, "Loading 3DSX file %s...", filename.c_str()); - if (is_loaded) return ResultStatus::ErrorAlreadyLoaded; - FileUtil::IOFile file(filename, "rb"); - - if (file.IsOpen()) { - Load3DSXFile(file, 0x00100000); - Kernel::LoadExec(0x00100000); - } else { + if (!file->IsOpen()) return ResultStatus::Error; - } + + Load3DSXFile(*file, 0x00100000); + Kernel::LoadExec(0x00100000); is_loaded = true; return ResultStatus::Success; -- cgit v1.2.3 From 04622a859cc748745cbbeb0b332f930085438077 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Tue, 6 Jan 2015 22:47:43 +0000 Subject: =?UTF-8?q?Loader:=20Don=E2=80=99t=20assume=20the=20file=20hasn?= =?UTF-8?q?=E2=80=99t=20been=20read=20before.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/loader/3dsx.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/core/loader/3dsx.cpp') diff --git a/src/core/loader/3dsx.cpp b/src/core/loader/3dsx.cpp index 873ee8b25..e239808f3 100644 --- a/src/core/loader/3dsx.cpp +++ b/src/core/loader/3dsx.cpp @@ -100,6 +100,9 @@ static THREEDSX_Error Load3DSXFile(FileUtil::IOFile& file, u32 base_addr) if (!file.IsOpen()) return ERROR_FILE; + // Reset read pointer in case this file has been read before. + file.Seek(0, SEEK_SET); + THREEDSX_Header hdr; if (file.ReadBytes(&hdr, sizeof(hdr)) != sizeof(hdr)) return ERROR_READ; -- cgit v1.2.3 From 82ec17db7df53ed1c376d1cdaa9a6587719a546d Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Tue, 6 Jan 2015 23:10:13 +0000 Subject: Loader: Guess filetype from the magic, or fallback to the extension. --- src/core/loader/3dsx.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src/core/loader/3dsx.cpp') diff --git a/src/core/loader/3dsx.cpp b/src/core/loader/3dsx.cpp index e239808f3..f3e09ecd6 100644 --- a/src/core/loader/3dsx.cpp +++ b/src/core/loader/3dsx.cpp @@ -44,7 +44,6 @@ enum THREEDSX_Error { static const u32 RELOCBUFSIZE = 512; // File header -static const u32 THREEDSX_MAGIC = 0x58534433; // '3DSX' #pragma pack(1) struct THREEDSX_Header { @@ -202,6 +201,18 @@ static THREEDSX_Error Load3DSXFile(FileUtil::IOFile& file, u32 base_addr) return ERROR_NONE; } +FileType AppLoader_THREEDSX::IdentifyType(FileUtil::IOFile& file) { + u32 magic; + file.Seek(0, SEEK_SET); + if (1 != file.ReadArray(&magic, 1)) + return FileType::Error; + + if (MakeMagic('3', 'D', 'S', 'X') == magic) + return FileType::THREEDSX; + + return FileType::Error; +} + ResultStatus AppLoader_THREEDSX::Load() { if (is_loaded) return ResultStatus::ErrorAlreadyLoaded; -- cgit v1.2.3 From 84e52a944d0c5dba8c5c9c6c9a0b106f571c7041 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Wed, 7 Jan 2015 01:21:50 +0000 Subject: Loader: Clean up the 3DSX AppLoader. --- src/core/loader/3dsx.cpp | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) (limited to 'src/core/loader/3dsx.cpp') diff --git a/src/core/loader/3dsx.cpp b/src/core/loader/3dsx.cpp index f3e09ecd6..c3ac1f417 100644 --- a/src/core/loader/3dsx.cpp +++ b/src/core/loader/3dsx.cpp @@ -85,7 +85,7 @@ struct THREEloadinfo u32 seg_sizes[3]; }; -static u32 TranslateAddr(u32 addr, THREEloadinfo *loadinfo, u32* offsets) +static u32 TranslateAddr(u32 addr, const THREEloadinfo *loadinfo, u32* offsets) { if (addr < offsets[0]) return loadinfo->seg_addrs[0] + addr; @@ -130,8 +130,9 @@ static THREEDSX_Error Load3DSXFile(FileUtil::IOFile& file, u32 base_addr) // Read the relocation headers u32* relocs = (u32*)(loadinfo.seg_ptrs[2] + hdr.data_seg_size); - for (u32 current_segment = 0; current_segment < 3; current_segment++) { - if (file.ReadBytes(&relocs[current_segment*n_reloc_tables], n_reloc_tables * 4) != n_reloc_tables * 4) + for (unsigned current_segment = 0; current_segment < 3; current_segment++) { + size_t size = n_reloc_tables * 4; + if (file.ReadBytes(&relocs[current_segment * n_reloc_tables], size) != size) return ERROR_READ; } @@ -147,9 +148,9 @@ static THREEDSX_Error Load3DSXFile(FileUtil::IOFile& file, u32 base_addr) memset((char*)loadinfo.seg_ptrs[2] + hdr.data_seg_size - hdr.bss_size, 0, hdr.bss_size); // Relocate the segments - for (u32 current_segment = 0; current_segment < 3; current_segment++) { - for (u32 current_segment_reloc_table = 0; current_segment_reloc_table < n_reloc_tables; current_segment_reloc_table++) { - u32 n_relocs = relocs[current_segment*n_reloc_tables + current_segment_reloc_table]; + for (unsigned current_segment = 0; current_segment < 3; current_segment++) { + for (unsigned current_segment_reloc_table = 0; current_segment_reloc_table < n_reloc_tables; current_segment_reloc_table++) { + u32 n_relocs = relocs[current_segment * n_reloc_tables + current_segment_reloc_table]; if (current_segment_reloc_table >= 2) { // We are not using this table - ignore it because we don't know what it dose file.Seek(n_relocs*sizeof(THREEDSX_Reloc), SEEK_CUR); @@ -158,29 +159,35 @@ static THREEDSX_Error Load3DSXFile(FileUtil::IOFile& file, u32 base_addr) static THREEDSX_Reloc reloc_table[RELOCBUFSIZE]; u32* pos = (u32*)loadinfo.seg_ptrs[current_segment]; - u32* end_pos = pos + (loadinfo.seg_sizes[current_segment] / 4); + const u32* end_pos = pos + (loadinfo.seg_sizes[current_segment] / 4); while (n_relocs) { u32 remaining = std::min(RELOCBUFSIZE, n_relocs); n_relocs -= remaining; - if (file.ReadBytes(reloc_table, remaining*sizeof(THREEDSX_Reloc)) != remaining*sizeof(THREEDSX_Reloc)) + if (file.ReadBytes(reloc_table, remaining * sizeof(THREEDSX_Reloc)) != remaining * sizeof(THREEDSX_Reloc)) return ERROR_READ; - for (u32 current_inprogress = 0; current_inprogress < remaining && pos < end_pos; current_inprogress++) { - LOG_TRACE(Loader, "(t=%d,skip=%u,patch=%u)\n", - current_segment_reloc_table, (u32)reloc_table[current_inprogress].skip, (u32)reloc_table[current_inprogress].patch); - pos += reloc_table[current_inprogress].skip; - s32 num_patches = reloc_table[current_inprogress].patch; + for (unsigned current_inprogress = 0; current_inprogress < remaining && pos < end_pos; current_inprogress++) { + const auto& table = reloc_table[current_inprogress]; + LOG_TRACE(Loader, "(t=%d,skip=%u,patch=%u)\n", current_segment_reloc_table, + (u32)table.skip, (u32)table.patch); + pos += table.skip; + s32 num_patches = table.patch; while (0 < num_patches && pos < end_pos) { u32 in_addr = (char*)pos - (char*)&all_mem[0]; u32 addr = TranslateAddr(*pos, &loadinfo, offsets); LOG_TRACE(Loader, "Patching %08X <-- rel(%08X,%d) (%08X)\n", - base_addr + in_addr, addr, current_segment_reloc_table, *pos); + base_addr + in_addr, addr, current_segment_reloc_table, *pos); switch (current_segment_reloc_table) { - case 0: *pos = (addr); break; - case 1: *pos = (addr - in_addr); break; - default: break; //this should never happen + case 0: + *pos = (addr); + break; + case 1: + *pos = (addr - in_addr); + break; + default: + break; //this should never happen } pos++; num_patches--; -- cgit v1.2.3 From df0d66c7cf518638112843b0bf0a8d7950b9041c Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Wed, 7 Jan 2015 01:30:32 +0000 Subject: Loader: Clean up the ELF AppLoader. --- src/core/loader/3dsx.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/core/loader/3dsx.cpp') diff --git a/src/core/loader/3dsx.cpp b/src/core/loader/3dsx.cpp index c3ac1f417..958dd03e8 100644 --- a/src/core/loader/3dsx.cpp +++ b/src/core/loader/3dsx.cpp @@ -130,7 +130,7 @@ static THREEDSX_Error Load3DSXFile(FileUtil::IOFile& file, u32 base_addr) // Read the relocation headers u32* relocs = (u32*)(loadinfo.seg_ptrs[2] + hdr.data_seg_size); - for (unsigned current_segment = 0; current_segment < 3; current_segment++) { + for (unsigned current_segment : {0, 1, 2}) { size_t size = n_reloc_tables * 4; if (file.ReadBytes(&relocs[current_segment * n_reloc_tables], size) != size) return ERROR_READ; @@ -148,7 +148,7 @@ static THREEDSX_Error Load3DSXFile(FileUtil::IOFile& file, u32 base_addr) memset((char*)loadinfo.seg_ptrs[2] + hdr.data_seg_size - hdr.bss_size, 0, hdr.bss_size); // Relocate the segments - for (unsigned current_segment = 0; current_segment < 3; current_segment++) { + for (unsigned current_segment : {0, 1, 2}) { for (unsigned current_segment_reloc_table = 0; current_segment_reloc_table < n_reloc_tables; current_segment_reloc_table++) { u32 n_relocs = relocs[current_segment * n_reloc_tables + current_segment_reloc_table]; if (current_segment_reloc_table >= 2) { -- cgit v1.2.3