diff options
Diffstat (limited to '')
| -rw-r--r-- | src/core/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/core/file_sys/errors.h | 3 | ||||
| -rw-r--r-- | src/core/file_sys/system_archive/system_archive.cpp | 3 | ||||
| -rw-r--r-- | src/core/file_sys/system_archive/system_version.cpp | 52 | ||||
| -rw-r--r-- | src/core/file_sys/system_archive/system_version.h | 16 | ||||
| -rw-r--r-- | src/core/hle/service/set/set_sys.cpp | 79 | ||||
| -rw-r--r-- | src/core/hle/service/set/set_sys.h | 2 |
7 files changed, 154 insertions, 3 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index bbbe60896..f156bca40 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt | |||
| @@ -70,6 +70,8 @@ add_library(core STATIC | |||
| 70 | file_sys/system_archive/ng_word.h | 70 | file_sys/system_archive/ng_word.h |
| 71 | file_sys/system_archive/system_archive.cpp | 71 | file_sys/system_archive/system_archive.cpp |
| 72 | file_sys/system_archive/system_archive.h | 72 | file_sys/system_archive/system_archive.h |
| 73 | file_sys/system_archive/system_version.cpp | ||
| 74 | file_sys/system_archive/system_version.h | ||
| 73 | file_sys/vfs.cpp | 75 | file_sys/vfs.cpp |
| 74 | file_sys/vfs.h | 76 | file_sys/vfs.h |
| 75 | file_sys/vfs_concat.cpp | 77 | file_sys/vfs_concat.cpp |
diff --git a/src/core/file_sys/errors.h b/src/core/file_sys/errors.h index e4a4ee4ab..bb4654366 100644 --- a/src/core/file_sys/errors.h +++ b/src/core/file_sys/errors.h | |||
| @@ -11,6 +11,9 @@ namespace FileSys { | |||
| 11 | constexpr ResultCode ERROR_PATH_NOT_FOUND{ErrorModule::FS, 1}; | 11 | constexpr ResultCode ERROR_PATH_NOT_FOUND{ErrorModule::FS, 1}; |
| 12 | constexpr ResultCode ERROR_ENTITY_NOT_FOUND{ErrorModule::FS, 1002}; | 12 | constexpr ResultCode ERROR_ENTITY_NOT_FOUND{ErrorModule::FS, 1002}; |
| 13 | constexpr ResultCode ERROR_SD_CARD_NOT_FOUND{ErrorModule::FS, 2001}; | 13 | constexpr ResultCode ERROR_SD_CARD_NOT_FOUND{ErrorModule::FS, 2001}; |
| 14 | constexpr ResultCode ERROR_OUT_OF_BOUNDS{ErrorModule::FS, 3005}; | ||
| 15 | constexpr ResultCode ERROR_FAILED_MOUNT_ARCHIVE{ErrorModule::FS, 3223}; | ||
| 16 | constexpr ResultCode ERROR_INVALID_ARGUMENT{ErrorModule::FS, 6001}; | ||
| 14 | constexpr ResultCode ERROR_INVALID_OFFSET{ErrorModule::FS, 6061}; | 17 | constexpr ResultCode ERROR_INVALID_OFFSET{ErrorModule::FS, 6061}; |
| 15 | constexpr ResultCode ERROR_INVALID_SIZE{ErrorModule::FS, 6062}; | 18 | constexpr ResultCode ERROR_INVALID_SIZE{ErrorModule::FS, 6062}; |
| 16 | 19 | ||
diff --git a/src/core/file_sys/system_archive/system_archive.cpp b/src/core/file_sys/system_archive/system_archive.cpp index e3e79f40a..c9722ed77 100644 --- a/src/core/file_sys/system_archive/system_archive.cpp +++ b/src/core/file_sys/system_archive/system_archive.cpp | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | #include "core/file_sys/romfs.h" | 6 | #include "core/file_sys/romfs.h" |
| 7 | #include "core/file_sys/system_archive/ng_word.h" | 7 | #include "core/file_sys/system_archive/ng_word.h" |
| 8 | #include "core/file_sys/system_archive/system_archive.h" | 8 | #include "core/file_sys/system_archive/system_archive.h" |
| 9 | #include "core/file_sys/system_archive/system_version.h" | ||
| 9 | 10 | ||
| 10 | namespace FileSys::SystemArchive { | 11 | namespace FileSys::SystemArchive { |
| 11 | 12 | ||
| @@ -30,7 +31,7 @@ constexpr std::array<SystemArchiveDescriptor, SYSTEM_ARCHIVE_COUNT> SYSTEM_ARCHI | |||
| 30 | {0x0100000000000806, "NgWord", &NgWord1}, | 31 | {0x0100000000000806, "NgWord", &NgWord1}, |
| 31 | {0x0100000000000807, "SsidList", nullptr}, | 32 | {0x0100000000000807, "SsidList", nullptr}, |
| 32 | {0x0100000000000808, "Dictionary", nullptr}, | 33 | {0x0100000000000808, "Dictionary", nullptr}, |
| 33 | {0x0100000000000809, "SystemVersion", nullptr}, | 34 | {0x0100000000000809, "SystemVersion", &SystemVersion}, |
| 34 | {0x010000000000080A, "AvatarImage", nullptr}, | 35 | {0x010000000000080A, "AvatarImage", nullptr}, |
| 35 | {0x010000000000080B, "LocalNews", nullptr}, | 36 | {0x010000000000080B, "LocalNews", nullptr}, |
| 36 | {0x010000000000080C, "Eula", nullptr}, | 37 | {0x010000000000080C, "Eula", nullptr}, |
diff --git a/src/core/file_sys/system_archive/system_version.cpp b/src/core/file_sys/system_archive/system_version.cpp new file mode 100644 index 000000000..6e22f97b0 --- /dev/null +++ b/src/core/file_sys/system_archive/system_version.cpp | |||
| @@ -0,0 +1,52 @@ | |||
| 1 | // Copyright 2019 yuzu emulator team | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include "core/file_sys/system_archive/system_version.h" | ||
| 6 | #include "core/file_sys/vfs_vector.h" | ||
| 7 | |||
| 8 | namespace FileSys::SystemArchive { | ||
| 9 | |||
| 10 | namespace SystemVersionData { | ||
| 11 | |||
| 12 | // This section should reflect the best system version to describe yuzu's HLE api. | ||
| 13 | // TODO(DarkLordZach): Update when HLE gets better. | ||
| 14 | |||
| 15 | constexpr u8 VERSION_MAJOR = 5; | ||
| 16 | constexpr u8 VERSION_MINOR = 1; | ||
| 17 | constexpr u8 VERSION_MICRO = 0; | ||
| 18 | |||
| 19 | constexpr u8 REVISION_MAJOR = 3; | ||
| 20 | constexpr u8 REVISION_MINOR = 0; | ||
| 21 | |||
| 22 | constexpr char PLATFORM_STRING[] = "NX"; | ||
| 23 | constexpr char VERSION_HASH[] = "23f9df53e25709d756e0c76effcb2473bd3447dd"; | ||
| 24 | constexpr char DISPLAY_VERSION[] = "5.1.0"; | ||
| 25 | constexpr char DISPLAY_TITLE[] = "NintendoSDK Firmware for NX 5.1.0-3.0"; | ||
| 26 | |||
| 27 | } // namespace SystemVersionData | ||
| 28 | |||
| 29 | std::string GetLongDisplayVersion() { | ||
| 30 | return SystemVersionData::DISPLAY_TITLE; | ||
| 31 | } | ||
| 32 | |||
| 33 | VirtualDir SystemVersion() { | ||
| 34 | VirtualFile file = std::make_shared<VectorVfsFile>(std::vector<u8>(0x100), "file"); | ||
| 35 | file->WriteObject(SystemVersionData::VERSION_MAJOR, 0); | ||
| 36 | file->WriteObject(SystemVersionData::VERSION_MINOR, 1); | ||
| 37 | file->WriteObject(SystemVersionData::VERSION_MICRO, 2); | ||
| 38 | file->WriteObject(SystemVersionData::REVISION_MAJOR, 4); | ||
| 39 | file->WriteObject(SystemVersionData::REVISION_MINOR, 5); | ||
| 40 | file->WriteArray(SystemVersionData::PLATFORM_STRING, | ||
| 41 | std::min<u64>(sizeof(SystemVersionData::PLATFORM_STRING), 0x20ULL), 0x8); | ||
| 42 | file->WriteArray(SystemVersionData::VERSION_HASH, | ||
| 43 | std::min<u64>(sizeof(SystemVersionData::VERSION_HASH), 0x40ULL), 0x28); | ||
| 44 | file->WriteArray(SystemVersionData::DISPLAY_VERSION, | ||
| 45 | std::min<u64>(sizeof(SystemVersionData::DISPLAY_VERSION), 0x18ULL), 0x68); | ||
| 46 | file->WriteArray(SystemVersionData::DISPLAY_TITLE, | ||
| 47 | std::min<u64>(sizeof(SystemVersionData::DISPLAY_TITLE), 0x80ULL), 0x80); | ||
| 48 | return std::make_shared<VectorVfsDirectory>(std::vector<VirtualFile>{file}, | ||
| 49 | std::vector<VirtualDir>{}, "data"); | ||
| 50 | } | ||
| 51 | |||
| 52 | } // namespace FileSys::SystemArchive | ||
diff --git a/src/core/file_sys/system_archive/system_version.h b/src/core/file_sys/system_archive/system_version.h new file mode 100644 index 000000000..deed79b26 --- /dev/null +++ b/src/core/file_sys/system_archive/system_version.h | |||
| @@ -0,0 +1,16 @@ | |||
| 1 | // Copyright 2019 yuzu emulator team | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include <string> | ||
| 8 | #include "core/file_sys/vfs_types.h" | ||
| 9 | |||
| 10 | namespace FileSys::SystemArchive { | ||
| 11 | |||
| 12 | std::string GetLongDisplayVersion(); | ||
| 13 | |||
| 14 | VirtualDir SystemVersion(); | ||
| 15 | |||
| 16 | } // namespace FileSys::SystemArchive | ||
diff --git a/src/core/hle/service/set/set_sys.cpp b/src/core/hle/service/set/set_sys.cpp index c9b4da5b0..ecee554bf 100644 --- a/src/core/hle/service/set/set_sys.cpp +++ b/src/core/hle/service/set/set_sys.cpp | |||
| @@ -2,13 +2,88 @@ | |||
| 2 | // Licensed under GPLv2 or any later version | 2 | // Licensed under GPLv2 or any later version |
| 3 | // Refer to the license.txt file included. | 3 | // Refer to the license.txt file included. |
| 4 | 4 | ||
| 5 | #include "common/assert.h" | ||
| 5 | #include "common/logging/log.h" | 6 | #include "common/logging/log.h" |
| 7 | #include "core/file_sys/errors.h" | ||
| 8 | #include "core/file_sys/system_archive/system_version.h" | ||
| 6 | #include "core/hle/ipc_helpers.h" | 9 | #include "core/hle/ipc_helpers.h" |
| 7 | #include "core/hle/kernel/client_port.h" | 10 | #include "core/hle/kernel/client_port.h" |
| 11 | #include "core/hle/service/filesystem/filesystem.h" | ||
| 8 | #include "core/hle/service/set/set_sys.h" | 12 | #include "core/hle/service/set/set_sys.h" |
| 9 | 13 | ||
| 10 | namespace Service::Set { | 14 | namespace Service::Set { |
| 11 | 15 | ||
| 16 | namespace { | ||
| 17 | constexpr u64 SYSTEM_VERSION_FILE_MINOR_REVISION_OFFSET = 0x05; | ||
| 18 | |||
| 19 | enum class GetFirmwareVersionType { | ||
| 20 | Version1, | ||
| 21 | Version2, | ||
| 22 | }; | ||
| 23 | |||
| 24 | void GetFirmwareVersionImpl(Kernel::HLERequestContext& ctx, GetFirmwareVersionType type) { | ||
| 25 | LOG_WARNING(Service_SET, "called - Using hardcoded firmware version '{}'", | ||
| 26 | FileSys::SystemArchive::GetLongDisplayVersion()); | ||
| 27 | |||
| 28 | ASSERT_MSG(ctx.GetWriteBufferSize() == 0x100, | ||
| 29 | "FirmwareVersion output buffer must be 0x100 bytes in size!"); | ||
| 30 | |||
| 31 | // Instead of using the normal procedure of checking for the real system archive and if it | ||
| 32 | // doesn't exist, synthesizing one, I feel that that would lead to strange bugs because a | ||
| 33 | // used is using a really old or really new SystemVersion title. The synthesized one ensures | ||
| 34 | // consistence (currently reports as 5.1.0-0.0) | ||
| 35 | const auto archive = FileSys::SystemArchive::SystemVersion(); | ||
| 36 | |||
| 37 | const auto early_exit_failure = [&ctx](const std::string& desc, ResultCode code) { | ||
| 38 | LOG_ERROR(Service_SET, "General failure while attempting to resolve firmware version ({}).", | ||
| 39 | desc.c_str()); | ||
| 40 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 41 | rb.Push(code); | ||
| 42 | }; | ||
| 43 | |||
| 44 | if (archive == nullptr) { | ||
| 45 | early_exit_failure("The system version archive couldn't be synthesized.", | ||
| 46 | FileSys::ERROR_FAILED_MOUNT_ARCHIVE); | ||
| 47 | return; | ||
| 48 | } | ||
| 49 | |||
| 50 | const auto ver_file = archive->GetFile("file"); | ||
| 51 | if (ver_file == nullptr) { | ||
| 52 | early_exit_failure("The system version archive didn't contain the file 'file'.", | ||
| 53 | FileSys::ERROR_INVALID_ARGUMENT); | ||
| 54 | return; | ||
| 55 | } | ||
| 56 | |||
| 57 | auto data = ver_file->ReadAllBytes(); | ||
| 58 | if (data.size() != 0x100) { | ||
| 59 | early_exit_failure("The system version file 'file' was not the correct size.", | ||
| 60 | FileSys::ERROR_OUT_OF_BOUNDS); | ||
| 61 | return; | ||
| 62 | } | ||
| 63 | |||
| 64 | // If the command is GetFirmwareVersion (as opposed to GetFirmwareVersion2), hardware will | ||
| 65 | // zero out the REVISION_MINOR field. | ||
| 66 | if (type == GetFirmwareVersionType::Version1) { | ||
| 67 | data[SYSTEM_VERSION_FILE_MINOR_REVISION_OFFSET] = 0; | ||
| 68 | } | ||
| 69 | |||
| 70 | ctx.WriteBuffer(data); | ||
| 71 | |||
| 72 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 73 | rb.Push(RESULT_SUCCESS); | ||
| 74 | } | ||
| 75 | } // Anonymous namespace | ||
| 76 | |||
| 77 | void SET_SYS::GetFirmwareVersion(Kernel::HLERequestContext& ctx) { | ||
| 78 | LOG_DEBUG(Service_SET, "called"); | ||
| 79 | GetFirmwareVersionImpl(ctx, GetFirmwareVersionType::Version1); | ||
| 80 | } | ||
| 81 | |||
| 82 | void SET_SYS::GetFirmwareVersion2(Kernel::HLERequestContext& ctx) { | ||
| 83 | LOG_DEBUG(Service_SET, "called"); | ||
| 84 | GetFirmwareVersionImpl(ctx, GetFirmwareVersionType::Version2); | ||
| 85 | } | ||
| 86 | |||
| 12 | void SET_SYS::GetColorSetId(Kernel::HLERequestContext& ctx) { | 87 | void SET_SYS::GetColorSetId(Kernel::HLERequestContext& ctx) { |
| 13 | LOG_DEBUG(Service_SET, "called"); | 88 | LOG_DEBUG(Service_SET, "called"); |
| 14 | 89 | ||
| @@ -33,8 +108,8 @@ SET_SYS::SET_SYS() : ServiceFramework("set:sys") { | |||
| 33 | {0, nullptr, "SetLanguageCode"}, | 108 | {0, nullptr, "SetLanguageCode"}, |
| 34 | {1, nullptr, "SetNetworkSettings"}, | 109 | {1, nullptr, "SetNetworkSettings"}, |
| 35 | {2, nullptr, "GetNetworkSettings"}, | 110 | {2, nullptr, "GetNetworkSettings"}, |
| 36 | {3, nullptr, "GetFirmwareVersion"}, | 111 | {3, &SET_SYS::GetFirmwareVersion, "GetFirmwareVersion"}, |
| 37 | {4, nullptr, "GetFirmwareVersion2"}, | 112 | {4, &SET_SYS::GetFirmwareVersion2, "GetFirmwareVersion2"}, |
| 38 | {5, nullptr, "GetFirmwareVersionDigest"}, | 113 | {5, nullptr, "GetFirmwareVersionDigest"}, |
| 39 | {7, nullptr, "GetLockScreenFlag"}, | 114 | {7, nullptr, "GetLockScreenFlag"}, |
| 40 | {8, nullptr, "SetLockScreenFlag"}, | 115 | {8, nullptr, "SetLockScreenFlag"}, |
diff --git a/src/core/hle/service/set/set_sys.h b/src/core/hle/service/set/set_sys.h index f602f3c77..13ee2cf46 100644 --- a/src/core/hle/service/set/set_sys.h +++ b/src/core/hle/service/set/set_sys.h | |||
| @@ -20,6 +20,8 @@ private: | |||
| 20 | BasicBlack = 1, | 20 | BasicBlack = 1, |
| 21 | }; | 21 | }; |
| 22 | 22 | ||
| 23 | void GetFirmwareVersion(Kernel::HLERequestContext& ctx); | ||
| 24 | void GetFirmwareVersion2(Kernel::HLERequestContext& ctx); | ||
| 23 | void GetColorSetId(Kernel::HLERequestContext& ctx); | 25 | void GetColorSetId(Kernel::HLERequestContext& ctx); |
| 24 | void SetColorSetId(Kernel::HLERequestContext& ctx); | 26 | void SetColorSetId(Kernel::HLERequestContext& ctx); |
| 25 | 27 | ||