diff options
Diffstat (limited to 'src/core/loader')
-rw-r--r-- | src/core/loader/elf.cpp | 3 | ||||
-rw-r--r-- | src/core/loader/loader.h | 4 | ||||
-rw-r--r-- | src/core/loader/nro.cpp | 7 | ||||
-rw-r--r-- | src/core/loader/nso.cpp | 7 | ||||
-rw-r--r-- | src/core/loader/smdh.cpp | 51 | ||||
-rw-r--r-- | src/core/loader/smdh.h | 81 |
6 files changed, 10 insertions, 143 deletions
diff --git a/src/core/loader/elf.cpp b/src/core/loader/elf.cpp index 9969a8c39..9ba913dbe 100644 --- a/src/core/loader/elf.cpp +++ b/src/core/loader/elf.cpp @@ -5,6 +5,7 @@ #include <cstring> #include <memory> #include <string> +#include "common/common_funcs.h" #include "common/common_types.h" #include "common/file_util.h" #include "common/logging/log.h" @@ -376,7 +377,7 @@ FileType AppLoader_ELF::IdentifyType(FileUtil::IOFile& file) { if (1 != file.ReadArray<u16>(&machine, 1)) return FileType::Error; - if (MakeMagic('\x7f', 'E', 'L', 'F') == magic && ELF_MACHINE_ARM == machine) + if (Common::MakeMagic('\x7f', 'E', 'L', 'F') == magic && ELF_MACHINE_ARM == machine) return FileType::ELF; return FileType::Error; diff --git a/src/core/loader/loader.h b/src/core/loader/loader.h index ac4e7acc2..dd6bb4e64 100644 --- a/src/core/loader/loader.h +++ b/src/core/loader/loader.h @@ -75,10 +75,6 @@ enum class ResultStatus { ErrorEncrypted, }; -constexpr u32 MakeMagic(char a, char b, char c, char d) { - return a | b << 8 | c << 16 | d << 24; -} - /// Interface for loading an application class AppLoader : NonCopyable { public: diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp index 24c2c55a9..b37c3a092 100644 --- a/src/core/loader/nro.cpp +++ b/src/core/loader/nro.cpp @@ -4,6 +4,7 @@ #include <vector> +#include "common/common_funcs.h" #include "common/logging/log.h" #include "common/swap.h" #include "core/hle/kernel/process.h" @@ -51,7 +52,7 @@ FileType AppLoader_NRO::IdentifyType(FileUtil::IOFile& file) { if (sizeof(NroHeader) != file.ReadBytes(&nro_header, sizeof(NroHeader))) { return FileType::Error; } - if (nro_header.magic == MakeMagic('N', 'R', 'O', '0')) { + if (nro_header.magic == Common::MakeMagic('N', 'R', 'O', '0')) { return FileType::NRO; } return FileType::Error; @@ -87,7 +88,7 @@ bool AppLoader_NRO::LoadNro(const std::string& path, VAddr load_base) { if (sizeof(NroHeader) != file.ReadBytes(&nro_header, sizeof(NroHeader))) { return {}; } - if (nro_header.magic != MakeMagic('N', 'R', 'O', '0')) { + if (nro_header.magic != Common::MakeMagic('N', 'R', 'O', '0')) { return {}; } @@ -109,7 +110,7 @@ bool AppLoader_NRO::LoadNro(const std::string& path, VAddr load_base) { u32 bss_size{Memory::PAGE_SIZE}; // Default .bss to page size if MOD0 section doesn't exist std::memcpy(&mod_header, program_image.data() + nro_header.module_header_offset, sizeof(ModHeader)); - const bool has_mod_header{mod_header.magic == MakeMagic('M', 'O', 'D', '0')}; + const bool has_mod_header{mod_header.magic == Common::MakeMagic('M', 'O', 'D', '0')}; if (has_mod_header) { // Resize program image to include .bss section and page align each section bss_size = PageAlignSize(mod_header.bss_end_offset - mod_header.bss_start_offset); diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp index 5ebbde19a..0d16d4b8c 100644 --- a/src/core/loader/nso.cpp +++ b/src/core/loader/nso.cpp @@ -5,6 +5,7 @@ #include <vector> #include <lz4.h> +#include "common/common_funcs.h" #include "common/logging/log.h" #include "common/swap.h" #include "core/hle/kernel/process.h" @@ -50,7 +51,7 @@ FileType AppLoader_NSO::IdentifyType(FileUtil::IOFile& file) { return FileType::Error; } - if (MakeMagic('N', 'S', 'O', '0') == magic) { + if (Common::MakeMagic('N', 'S', 'O', '0') == magic) { return FileType::NSO; } @@ -96,7 +97,7 @@ VAddr AppLoader_NSO::LoadNso(const std::string& path, VAddr load_base, bool relo if (sizeof(NsoHeader) != file.ReadBytes(&nso_header, sizeof(NsoHeader))) { return {}; } - if (nso_header.magic != MakeMagic('N', 'S', 'O', '0')) { + if (nso_header.magic != Common::MakeMagic('N', 'S', 'O', '0')) { return {}; } @@ -121,7 +122,7 @@ VAddr AppLoader_NSO::LoadNso(const std::string& path, VAddr load_base, bool relo ModHeader mod_header{}; u32 bss_size{Memory::PAGE_SIZE}; // Default .bss to page size if MOD0 section doesn't exist std::memcpy(&mod_header, program_image.data() + module_offset, sizeof(ModHeader)); - const bool has_mod_header{mod_header.magic == MakeMagic('M', 'O', 'D', '0')}; + const bool has_mod_header{mod_header.magic == Common::MakeMagic('M', 'O', 'D', '0')}; if (has_mod_header) { // Resize program image to include .bss section and page align each section bss_size = PageAlignSize(mod_header.bss_end_offset - mod_header.bss_start_offset); diff --git a/src/core/loader/smdh.cpp b/src/core/loader/smdh.cpp deleted file mode 100644 index ccbeb7961..000000000 --- a/src/core/loader/smdh.cpp +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -#include <cstring> -#include <vector> -#include "common/common_types.h" -#include "core/loader/loader.h" -#include "core/loader/smdh.h" -#include "video_core/utils.h" - -namespace Loader { - -bool IsValidSMDH(const std::vector<u8>& smdh_data) { - if (smdh_data.size() < sizeof(Loader::SMDH)) - return false; - - u32 magic; - memcpy(&magic, smdh_data.data(), sizeof(u32)); - - return Loader::MakeMagic('S', 'M', 'D', 'H') == magic; -} - -std::vector<u16> SMDH::GetIcon(bool large) const { - u32 size; - const u8* icon_data; - - if (large) { - size = 48; - icon_data = large_icon.data(); - } else { - size = 24; - icon_data = small_icon.data(); - } - - std::vector<u16> icon(size * size); - for (u32 x = 0; x < size; ++x) { - for (u32 y = 0; y < size; ++y) { - u32 coarse_y = y & ~7; - const u8* pixel = icon_data + VideoCore::GetMortonOffset(x, y, 2) + coarse_y * size * 2; - icon[x + size * y] = (pixel[1] << 8) + pixel[0]; - } - } - return icon; -} - -std::array<u16, 0x40> SMDH::GetShortTitle(Loader::SMDH::TitleLanguage language) const { - return titles[static_cast<int>(language)].short_title; -} - -} // namespace diff --git a/src/core/loader/smdh.h b/src/core/loader/smdh.h deleted file mode 100644 index ac7726c8f..000000000 --- a/src/core/loader/smdh.h +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -#pragma once - -#include <array> -#include <vector> -#include "common/common_funcs.h" -#include "common/common_types.h" -#include "common/swap.h" - -namespace Loader { - -/** - * Tests if data is a valid SMDH by its length and magic number. - * @param smdh_data data buffer to test - * @return bool test result - */ -bool IsValidSMDH(const std::vector<u8>& smdh_data); - -/// SMDH data structure that contains titles, icons etc. See https://www.3dbrew.org/wiki/SMDH -struct SMDH { - u32_le magic; - u16_le version; - INSERT_PADDING_BYTES(2); - - struct Title { - std::array<u16, 0x40> short_title; - std::array<u16, 0x80> long_title; - std::array<u16, 0x40> publisher; - }; - std::array<Title, 16> titles; - - std::array<u8, 16> ratings; - u32_le region_lockout; - u32_le match_maker_id; - u64_le match_maker_bit_id; - u32_le flags; - u16_le eula_version; - INSERT_PADDING_BYTES(2); - float_le banner_animation_frame; - u32_le cec_id; - INSERT_PADDING_BYTES(8); - - std::array<u8, 0x480> small_icon; - std::array<u8, 0x1200> large_icon; - - /// indicates the language used for each title entry - enum class TitleLanguage { - Japanese = 0, - English = 1, - French = 2, - German = 3, - Italian = 4, - Spanish = 5, - SimplifiedChinese = 6, - Korean = 7, - Dutch = 8, - Portuguese = 9, - Russian = 10, - TraditionalChinese = 11 - }; - - /** - * Gets game icon from SMDH - * @param large If true, returns large icon (48x48), otherwise returns small icon (24x24) - * @return vector of RGB565 data - */ - std::vector<u16> GetIcon(bool large) const; - - /** - * Gets the short game title from SMDH - * @param language title language - * @return UTF-16 array of the short title - */ - std::array<u16, 0x40> GetShortTitle(Loader::SMDH::TitleLanguage language) const; -}; -static_assert(sizeof(SMDH) == 0x36C0, "SMDH structure size is wrong"); - -} // namespace |