summaryrefslogtreecommitdiff
path: root/src/core/hle
diff options
context:
space:
mode:
authorZephyron <zephyron@citron-emu.org>2025-01-30 22:10:08 +1000
committerZephyron <zephyron@citron-emu.org>2025-01-30 22:10:08 +1000
commit6ab82e8eeb3972745de76432c57dcaf29f3a45d3 (patch)
tree18ab06ad35f58a9f91f5c0f8aeb8eeca2df4721c /src/core/hle
parent733721f0a1914a526e5f09b341512a53e7d89d04 (diff)
service: Implement rebootless system update stubs and types
Adds initial support for rebootless system update related functionality: - Add system archive title IDs for ApplicationBlackList, RebootlessSystemUpdateVersion, and ContentActionTable - Add NS service result codes for system update operations - Implement stubs for ISystemUpdateControl::SetupToReceiveSystemUpdate and RequestCheckLatestUpdateIncludesRebootlessUpdate - Add RebootlessSystemUpdateVersion settings type and implement GetRebootlessSystemUpdateVersion in SET service - Fix GetSettingsItemValueImpl template implementation This provides basic infrastructure for handling system updates, particularly the rebootless update feature, though actual update functionality remains stubbed.
Diffstat (limited to 'src/core/hle')
-rw-r--r--src/core/hle/result.h17
-rw-r--r--src/core/hle/service/ns/system_update_control.cpp18
-rw-r--r--src/core/hle/service/ns/system_update_control.h5
-rw-r--r--src/core/hle/service/set/settings_types.h8
-rw-r--r--src/core/hle/service/set/system_settings_server.cpp16
-rw-r--r--src/core/hle/service/set/system_settings_server.h9
6 files changed, 64 insertions, 9 deletions
diff --git a/src/core/hle/result.h b/src/core/hle/result.h
index b0a32d74b..ae1942645 100644
--- a/src/core/hle/result.h
+++ b/src/core/hle/result.h
@@ -292,6 +292,23 @@ private:
u32 description_end;
};
+namespace ResultNs {
+
+ constexpr ResultRange InvalidSystemUpdateData{ErrorModule::NS, 101, 200};
+ constexpr ResultRange RebootlessSystemUpdateNotSupported{ErrorModule::NS, 201, 300};
+ constexpr ResultRange SystemUpdateNotFound{ErrorModule::NS, 301, 400};
+ constexpr ResultRange RebootlessSystemUpdateVersionMismatch{ErrorModule::NS, 401, 500};
+
+ constexpr ResultRange SystemUpdateInProgress{ErrorModule::NS, 501, 600};
+ constexpr ResultRange SystemUpdateInterrupted{ErrorModule::NS, 601, 700};
+ constexpr ResultRange InvalidRebootlessVersion{ErrorModule::NS, 701, 800};
+ constexpr ResultRange ContentVerificationFailed{ErrorModule::NS, 801, 900};
+ constexpr ResultRange UpdateApplicationBlackListed{ErrorModule::NS, 901, 1000};
+ constexpr ResultRange ContentActionTableError{ErrorModule::NS, 1001, 1100};
+ constexpr ResultRange SetupReceiveUpdateFailed{ErrorModule::NS, 1101, 1200};
+
+} // namespace ResultNs
+
#define R_SUCCEEDED(res) (static_cast<Result>(res).IsSuccess())
#define R_FAILED(res) (static_cast<Result>(res).IsFailure())
diff --git a/src/core/hle/service/ns/system_update_control.cpp b/src/core/hle/service/ns/system_update_control.cpp
index f5f5cfd90..42e7cb219 100644
--- a/src/core/hle/service/ns/system_update_control.cpp
+++ b/src/core/hle/service/ns/system_update_control.cpp
@@ -3,6 +3,7 @@
#include "core/hle/service/cmif_serialization.h"
#include "core/hle/service/ns/system_update_control.h"
+#include "system_update_control.h"
namespace Service::NS {
@@ -31,8 +32,9 @@ ISystemUpdateControl::ISystemUpdateControl(Core::System& system_)
{18, nullptr, "ApplyReceivedUpdate"},
{19, nullptr, "GetReceivedEulaDataSize"},
{20, nullptr, "GetReceivedEulaData"},
- {21, nullptr, "SetupToReceiveSystemUpdate"},
- {22, nullptr, "RequestCheckLatestUpdateIncludesRebootlessUpdate"},
+ {21, &ISystemUpdateControl::SetupToReceiveSystemUpdate, "SetupToReceiveSystemUpdate"},
+ {22, &ISystemUpdateControl::RequestCheckLatestUpdateIncludesRebootlessUpdate,
+ "RequestCheckLatestUpdateIncludesRebootlessUpdate"},
};
// clang-format on
@@ -41,4 +43,16 @@ ISystemUpdateControl::ISystemUpdateControl(Core::System& system_)
ISystemUpdateControl::~ISystemUpdateControl() = default;
+void ISystemUpdateControl::SetupToReceiveSystemUpdate(HLERequestContext& ctx) {
+ LOG_WARNING(Service_NS, "(STUBBED) called");
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultNs::SetupReceiveUpdateFailed);
+}
+
+void ISystemUpdateControl::RequestCheckLatestUpdateIncludesRebootlessUpdate(HLERequestContext& ctx) {
+ LOG_WARNING(Service_NS, "(STUBBED) called");
+ IPC::ResponseBuilder rb{ctx, 2};
+ rb.Push(ResultNs::RebootlessSystemUpdateNotSupported);
+}
+
} // namespace Service::NS
diff --git a/src/core/hle/service/ns/system_update_control.h b/src/core/hle/service/ns/system_update_control.h
index a30a09000..5e92354ee 100644
--- a/src/core/hle/service/ns/system_update_control.h
+++ b/src/core/hle/service/ns/system_update_control.h
@@ -3,6 +3,7 @@
#pragma once
+#include "core/hle/service/cmif_types.h"
#include "core/hle/service/service.h"
namespace Service::NS {
@@ -11,6 +12,10 @@ class ISystemUpdateControl final : public ServiceFramework<ISystemUpdateControl>
public:
explicit ISystemUpdateControl(Core::System& system_);
~ISystemUpdateControl() override;
+
+private:
+ void SetupToReceiveSystemUpdate(HLERequestContext& ctx);
+ void RequestCheckLatestUpdateIncludesRebootlessUpdate(HLERequestContext& ctx);
};
} // namespace Service::NS
diff --git a/src/core/hle/service/set/settings_types.h b/src/core/hle/service/set/settings_types.h
index 92c2948b0..d767b5f34 100644
--- a/src/core/hle/service/set/settings_types.h
+++ b/src/core/hle/service/set/settings_types.h
@@ -501,4 +501,12 @@ struct TvSettings {
};
static_assert(sizeof(TvSettings) == 0x20, "TvSettings is an invalid size");
+/// This is nn::settings::system::RebootlessSystemUpdateVersion
+struct RebootlessSystemUpdateVersion {
+ u32 version;
+ char display_version[0x3C]; // Size to make total struct 0x40 bytes
+};
+static_assert(sizeof(RebootlessSystemUpdateVersion) == 0x40,
+ "RebootlessSystemUpdateVersion is an invalid size");
+
} // namespace Service::Set
diff --git a/src/core/hle/service/set/system_settings_server.cpp b/src/core/hle/service/set/system_settings_server.cpp
index 5c2a36f00..3118d6621 100644
--- a/src/core/hle/service/set/system_settings_server.cpp
+++ b/src/core/hle/service/set/system_settings_server.cpp
@@ -238,7 +238,7 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_)
{146, nullptr, "SetConsoleSixAxisSensorAngularVelocityTimeBias"},
{147, nullptr, "GetConsoleSixAxisSensorAngularAcceleration"},
{148, nullptr, "SetConsoleSixAxisSensorAngularAcceleration"},
- {149, nullptr, "GetRebootlessSystemUpdateVersion"},
+ {149, C<&ISystemSettingsServer::GetRebootlessSystemUpdateVersion>, "GetRebootlessSystemUpdateVersion"},
{150, C<&ISystemSettingsServer::GetDeviceTimeZoneLocationUpdatedTime>, "GetDeviceTimeZoneLocationUpdatedTime"},
{151, C<&ISystemSettingsServer::SetDeviceTimeZoneLocationUpdatedTime>, "SetDeviceTimeZoneLocationUpdatedTime"},
{152, C<&ISystemSettingsServer::GetUserSystemClockAutomaticCorrectionUpdatedTime>, "GetUserSystemClockAutomaticCorrectionUpdatedTime"},
@@ -906,7 +906,7 @@ Result ISystemSettingsServer::SetUserSystemClockAutomaticCorrectionEnabled(
Result ISystemSettingsServer::GetDebugModeFlag(Out<bool> is_debug_mode_enabled) {
const auto result = GetSettingsItemValueImpl<bool>(*is_debug_mode_enabled, "settings_debug",
- "is_debug_mode_enabled");
+ "is_debug_mode_enabled");
LOG_DEBUG(Service_SET, "called, is_debug_mode_enabled={}", *is_debug_mode_enabled);
R_RETURN(result);
@@ -1306,6 +1306,18 @@ Result ISystemSettingsServer::SetPanelCrcMode(s32 panel_crc_mode) {
R_SUCCEED();
}
+Result ISystemSettingsServer::GetRebootlessSystemUpdateVersion(
+ Out<RebootlessSystemUpdateVersion> out_rebootless_system_update) {
+ LOG_INFO(Service_SET, "called");
+
+ out_rebootless_system_update->version = 0;
+ std::memset(out_rebootless_system_update->display_version, 0,
+ sizeof(out_rebootless_system_update->display_version));
+ std::strcpy(out_rebootless_system_update->display_version, "0.0.0");
+
+ R_SUCCEED();
+}
+
void ISystemSettingsServer::SetupSettings() {
auto system_dir =
Common::FS::GetCitronPath(Common::FS::CitronPath::NANDDir) / "system/save/8000000000000050";
diff --git a/src/core/hle/service/set/system_settings_server.h b/src/core/hle/service/set/system_settings_server.h
index 993e5de7d..0e1e470a8 100644
--- a/src/core/hle/service/set/system_settings_server.h
+++ b/src/core/hle/service/set/system_settings_server.h
@@ -40,11 +40,9 @@ public:
template <typename T>
Result GetSettingsItemValueImpl(T& out_value, const std::string& category,
const std::string& name) {
- u64 data_size{};
- std::vector<u8> data(sizeof(T));
- R_TRY(GetSettingsItemValueImpl(data, data_size, category, name));
- std::memcpy(&out_value, data.data(), data_size);
- R_SUCCEED();
+ u64 size{};
+ R_RETURN(GetSettingsItemValueImpl(std::span{reinterpret_cast<u8*>(&out_value), sizeof(T)},
+ size, category, name));
}
public:
@@ -155,6 +153,7 @@ public:
Result GetFieldTestingFlag(Out<bool> out_field_testing_flag);
Result GetPanelCrcMode(Out<s32> out_panel_crc_mode);
Result SetPanelCrcMode(s32 panel_crc_mode);
+ Result GetRebootlessSystemUpdateVersion(Out<RebootlessSystemUpdateVersion> out_rebootless_system_update);
private:
bool LoadSettingsFile(std::filesystem::path& path, auto&& default_func);