summaryrefslogtreecommitdiff
path: root/src/core/hle
diff options
context:
space:
mode:
authorGravatar Zach Hilman2019-03-10 16:51:42 -0400
committerGravatar Zach Hilman2019-03-10 16:51:42 -0400
commited82bb968a2ec785485345aa202143df57c0f8fe (patch)
tree3db6e12366aadee572fadd80920c9dcf3568d445 /src/core/hle
parentMerge pull request #2217 from ReinUsesLisp/rasterizer-logger (diff)
downloadyuzu-ed82bb968a2ec785485345aa202143df57c0f8fe.tar.gz
yuzu-ed82bb968a2ec785485345aa202143df57c0f8fe.tar.xz
yuzu-ed82bb968a2ec785485345aa202143df57c0f8fe.zip
set_sys: Implement GetFirmwareVersion(2) for libnx hosversion
Uses the synthesized system archive 9 (SystemVersion) and reports v5.1.0-0.0
Diffstat (limited to 'src/core/hle')
-rw-r--r--src/core/hle/service/set/set_sys.cpp63
-rw-r--r--src/core/hle/service/set/set_sys.h2
2 files changed, 63 insertions, 2 deletions
diff --git a/src/core/hle/service/set/set_sys.cpp b/src/core/hle/service/set/set_sys.cpp
index c9b4da5b0..ddab0e36f 100644
--- a/src/core/hle/service/set/set_sys.cpp
+++ b/src/core/hle/service/set/set_sys.cpp
@@ -3,12 +3,71 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "common/logging/log.h" 5#include "common/logging/log.h"
6#include "core/file_sys/system_archive/system_version.h"
6#include "core/hle/ipc_helpers.h" 7#include "core/hle/ipc_helpers.h"
7#include "core/hle/kernel/client_port.h" 8#include "core/hle/kernel/client_port.h"
9#include "core/hle/service/filesystem/filesystem.h"
8#include "core/hle/service/set/set_sys.h" 10#include "core/hle/service/set/set_sys.h"
9 11
10namespace Service::Set { 12namespace Service::Set {
11 13
14void SET_SYS::GetFirmwareVersion(Kernel::HLERequestContext& ctx) {
15 LOG_DEBUG(Service_SET, "called");
16
17 ASSERT(ctx.GetWriteBufferSize() == 0x100,
18 "FirmwareVersion output buffer must be 0x100 bytes in size!");
19
20 // Instead of using the normal procedure of checking for the real system archive and if it
21 // doesn't exist, synthesizing one, I feel that that would lead to strange bugs because a used
22 // is using a really old or really new SystemVersion title. The synthesized one ensures
23 // consistence (currently reports as 5.1.0-0.0)
24 const auto archive = FileSys::SystemArchive::SystemVersion();
25
26 const auto early_exit_failure = [&ctx](const std::string& desc) {
27 LOG_ERROR(Service_SET, "General failure while attempting to resolve firmware version ({}).",
28 desc.c_str());
29 IPC::ResponseBuilder rb{ctx, 2};
30 rb.Push(ResultCode(-1));
31 };
32
33 if (archive == nullptr) {
34 early_exit_failure("The system version archive couldn't be synthesized.");
35 return;
36 }
37
38 const auto ver_file = archive->GetFile("file");
39 if (ver_file == nullptr) {
40 early_exit_failure("The system version archive didn't contain the file 'file'.");
41 return;
42 }
43
44 auto data = ver_file->ReadAllBytes();
45 if (data.size() != 0x100) {
46 early_exit_failure("The system version file 'file' was not the correct size.");
47 return;
48 }
49
50 // If the command is GetFirmwareVersion (as opposed to GetFirmwareVersion2), hardware will zero
51 // out the REVISION_MAJOR and REVISION_MICRO fields, which are u8s at offsets 0x4 and 0x5,
52 // respectively. This if statement will only execute when the true intended command is
53 // GetFirmwareVersion, and allows removing duplicate code for the implementation of
54 // GetFirmwareVersion2.
55 if (ctx.GetCommand() == 3) {
56 data[0x4] = 0x0;
57 data[0x5] = 0x0;
58 }
59
60 ctx.WriteBuffer(data);
61
62 IPC::ResponseBuilder rb{ctx, 2};
63 rb.Push(RESULT_SUCCESS);
64}
65
66void SET_SYS::GetFirmwareVersion2(Kernel::HLERequestContext& ctx) {
67 LOG_WARNING(Service_SET, "called - delegating to GetFirmwareVersion");
68 GetFirmwareVersion(ctx);
69}
70
12void SET_SYS::GetColorSetId(Kernel::HLERequestContext& ctx) { 71void SET_SYS::GetColorSetId(Kernel::HLERequestContext& ctx) {
13 LOG_DEBUG(Service_SET, "called"); 72 LOG_DEBUG(Service_SET, "called");
14 73
@@ -33,8 +92,8 @@ SET_SYS::SET_SYS() : ServiceFramework("set:sys") {
33 {0, nullptr, "SetLanguageCode"}, 92 {0, nullptr, "SetLanguageCode"},
34 {1, nullptr, "SetNetworkSettings"}, 93 {1, nullptr, "SetNetworkSettings"},
35 {2, nullptr, "GetNetworkSettings"}, 94 {2, nullptr, "GetNetworkSettings"},
36 {3, nullptr, "GetFirmwareVersion"}, 95 {3, &SET_SYS::GetFirmwareVersion, "GetFirmwareVersion"},
37 {4, nullptr, "GetFirmwareVersion2"}, 96 {4, &SET_SYS::GetFirmwareVersion2, "GetFirmwareVersion2"},
38 {5, nullptr, "GetFirmwareVersionDigest"}, 97 {5, nullptr, "GetFirmwareVersionDigest"},
39 {7, nullptr, "GetLockScreenFlag"}, 98 {7, nullptr, "GetLockScreenFlag"},
40 {8, nullptr, "SetLockScreenFlag"}, 99 {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