diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/ns/ns.cpp | 30 | ||||
| -rw-r--r-- | src/core/hle/service/ns/ns.h | 3 | ||||
| -rw-r--r-- | src/core/hle/service/ptm/ts.cpp | 15 | ||||
| -rw-r--r-- | src/core/hle/service/ptm/ts.h | 1 | ||||
| -rw-r--r-- | src/core/hle/service/set/set_sys.cpp | 79 | ||||
| -rw-r--r-- | src/core/hle/service/set/set_sys.h | 2 |
6 files changed, 124 insertions, 6 deletions
diff --git a/src/core/hle/service/ns/ns.cpp b/src/core/hle/service/ns/ns.cpp index f7318c3cb..f59a1a63d 100644 --- a/src/core/hle/service/ns/ns.cpp +++ b/src/core/hle/service/ns/ns.cpp | |||
| @@ -8,6 +8,7 @@ | |||
| 8 | #include "core/file_sys/patch_manager.h" | 8 | #include "core/file_sys/patch_manager.h" |
| 9 | #include "core/file_sys/vfs.h" | 9 | #include "core/file_sys/vfs.h" |
| 10 | #include "core/hle/ipc_helpers.h" | 10 | #include "core/hle/ipc_helpers.h" |
| 11 | #include "core/hle/service/glue/glue_manager.h" | ||
| 11 | #include "core/hle/service/ns/errors.h" | 12 | #include "core/hle/service/ns/errors.h" |
| 12 | #include "core/hle/service/ns/iplatform_service_manager.h" | 13 | #include "core/hle/service/ns/iplatform_service_manager.h" |
| 13 | #include "core/hle/service/ns/language.h" | 14 | #include "core/hle/service/ns/language.h" |
| @@ -581,7 +582,7 @@ IReadOnlyApplicationControlDataInterface::IReadOnlyApplicationControlDataInterfa | |||
| 581 | : ServiceFramework{system_, "IReadOnlyApplicationControlDataInterface"} { | 582 | : ServiceFramework{system_, "IReadOnlyApplicationControlDataInterface"} { |
| 582 | // clang-format off | 583 | // clang-format off |
| 583 | static const FunctionInfo functions[] = { | 584 | static const FunctionInfo functions[] = { |
| 584 | {0, nullptr, "GetApplicationControlData"}, | 585 | {0, &IReadOnlyApplicationControlDataInterface::GetApplicationControlData, "GetApplicationControlData"}, |
| 585 | {1, nullptr, "GetApplicationDesiredLanguage"}, | 586 | {1, nullptr, "GetApplicationDesiredLanguage"}, |
| 586 | {2, nullptr, "ConvertApplicationLanguageToLanguageCode"}, | 587 | {2, nullptr, "ConvertApplicationLanguageToLanguageCode"}, |
| 587 | {3, nullptr, "ConvertLanguageCodeToApplicationLanguage"}, | 588 | {3, nullptr, "ConvertLanguageCodeToApplicationLanguage"}, |
| @@ -594,6 +595,33 @@ IReadOnlyApplicationControlDataInterface::IReadOnlyApplicationControlDataInterfa | |||
| 594 | 595 | ||
| 595 | IReadOnlyApplicationControlDataInterface::~IReadOnlyApplicationControlDataInterface() = default; | 596 | IReadOnlyApplicationControlDataInterface::~IReadOnlyApplicationControlDataInterface() = default; |
| 596 | 597 | ||
| 598 | void IReadOnlyApplicationControlDataInterface::GetApplicationControlData( | ||
| 599 | Kernel::HLERequestContext& ctx) { | ||
| 600 | enum class ApplicationControlSource : u8 { | ||
| 601 | CacheOnly, | ||
| 602 | Storage, | ||
| 603 | StorageOnly, | ||
| 604 | }; | ||
| 605 | |||
| 606 | struct RequestParameters { | ||
| 607 | ApplicationControlSource source; | ||
| 608 | u64 application_id; | ||
| 609 | }; | ||
| 610 | static_assert(sizeof(RequestParameters) == 0x10, "RequestParameters has incorrect size."); | ||
| 611 | |||
| 612 | IPC::RequestParser rp{ctx}; | ||
| 613 | const auto parameters{rp.PopRaw<RequestParameters>()}; | ||
| 614 | const auto nacp_data{system.GetARPManager().GetControlProperty(parameters.application_id)}; | ||
| 615 | const auto result = nacp_data ? ResultSuccess : ResultUnknown; | ||
| 616 | |||
| 617 | if (nacp_data) { | ||
| 618 | ctx.WriteBuffer(nacp_data->data(), nacp_data->size()); | ||
| 619 | } | ||
| 620 | |||
| 621 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 622 | rb.Push(result); | ||
| 623 | } | ||
| 624 | |||
| 597 | NS::NS(const char* name, Core::System& system_) : ServiceFramework{system_, name} { | 625 | NS::NS(const char* name, Core::System& system_) : ServiceFramework{system_, name} { |
| 598 | // clang-format off | 626 | // clang-format off |
| 599 | static const FunctionInfo functions[] = { | 627 | static const FunctionInfo functions[] = { |
diff --git a/src/core/hle/service/ns/ns.h b/src/core/hle/service/ns/ns.h index 4dc191518..9c18e935c 100644 --- a/src/core/hle/service/ns/ns.h +++ b/src/core/hle/service/ns/ns.h | |||
| @@ -78,6 +78,9 @@ class IReadOnlyApplicationControlDataInterface final | |||
| 78 | public: | 78 | public: |
| 79 | explicit IReadOnlyApplicationControlDataInterface(Core::System& system_); | 79 | explicit IReadOnlyApplicationControlDataInterface(Core::System& system_); |
| 80 | ~IReadOnlyApplicationControlDataInterface() override; | 80 | ~IReadOnlyApplicationControlDataInterface() override; |
| 81 | |||
| 82 | private: | ||
| 83 | void GetApplicationControlData(Kernel::HLERequestContext& ctx); | ||
| 81 | }; | 84 | }; |
| 82 | 85 | ||
| 83 | class NS final : public ServiceFramework<NS> { | 86 | class NS final : public ServiceFramework<NS> { |
diff --git a/src/core/hle/service/ptm/ts.cpp b/src/core/hle/service/ptm/ts.cpp index 65c3f135f..b1a0a5544 100644 --- a/src/core/hle/service/ptm/ts.cpp +++ b/src/core/hle/service/ptm/ts.cpp | |||
| @@ -15,7 +15,7 @@ TS::TS(Core::System& system_) : ServiceFramework{system_, "ts"} { | |||
| 15 | {0, nullptr, "GetTemperatureRange"}, | 15 | {0, nullptr, "GetTemperatureRange"}, |
| 16 | {1, &TS::GetTemperature, "GetTemperature"}, | 16 | {1, &TS::GetTemperature, "GetTemperature"}, |
| 17 | {2, nullptr, "SetMeasurementMode"}, | 17 | {2, nullptr, "SetMeasurementMode"}, |
| 18 | {3, nullptr, "GetTemperatureMilliC"}, | 18 | {3, &TS::GetTemperatureMilliC, "GetTemperatureMilliC"}, |
| 19 | {4, nullptr, "OpenSession"}, | 19 | {4, nullptr, "OpenSession"}, |
| 20 | }; | 20 | }; |
| 21 | // clang-format on | 21 | // clang-format on |
| @@ -29,8 +29,6 @@ void TS::GetTemperature(Kernel::HLERequestContext& ctx) { | |||
| 29 | IPC::RequestParser rp{ctx}; | 29 | IPC::RequestParser rp{ctx}; |
| 30 | const auto location{rp.PopEnum<Location>()}; | 30 | const auto location{rp.PopEnum<Location>()}; |
| 31 | 31 | ||
| 32 | LOG_WARNING(Service_HID, "(STUBBED) called. location={}", location); | ||
| 33 | |||
| 34 | const s32 temperature = location == Location::Internal ? 35 : 20; | 32 | const s32 temperature = location == Location::Internal ? 35 : 20; |
| 35 | 33 | ||
| 36 | IPC::ResponseBuilder rb{ctx, 3}; | 34 | IPC::ResponseBuilder rb{ctx, 3}; |
| @@ -38,4 +36,15 @@ void TS::GetTemperature(Kernel::HLERequestContext& ctx) { | |||
| 38 | rb.Push(temperature); | 36 | rb.Push(temperature); |
| 39 | } | 37 | } |
| 40 | 38 | ||
| 39 | void TS::GetTemperatureMilliC(Kernel::HLERequestContext& ctx) { | ||
| 40 | IPC::RequestParser rp{ctx}; | ||
| 41 | const auto location{rp.PopEnum<Location>()}; | ||
| 42 | |||
| 43 | const s32 temperature = location == Location::Internal ? 35000 : 20000; | ||
| 44 | |||
| 45 | IPC::ResponseBuilder rb{ctx, 3}; | ||
| 46 | rb.Push(ResultSuccess); | ||
| 47 | rb.Push(temperature); | ||
| 48 | } | ||
| 49 | |||
| 41 | } // namespace Service::PTM | 50 | } // namespace Service::PTM |
diff --git a/src/core/hle/service/ptm/ts.h b/src/core/hle/service/ptm/ts.h index 39a734ef7..39d51847e 100644 --- a/src/core/hle/service/ptm/ts.h +++ b/src/core/hle/service/ptm/ts.h | |||
| @@ -20,6 +20,7 @@ private: | |||
| 20 | }; | 20 | }; |
| 21 | 21 | ||
| 22 | void GetTemperature(Kernel::HLERequestContext& ctx); | 22 | void GetTemperature(Kernel::HLERequestContext& ctx); |
| 23 | void GetTemperatureMilliC(Kernel::HLERequestContext& ctx); | ||
| 23 | }; | 24 | }; |
| 24 | 25 | ||
| 25 | } // namespace Service::PTM | 26 | } // namespace Service::PTM |
diff --git a/src/core/hle/service/set/set_sys.cpp b/src/core/hle/service/set/set_sys.cpp index 2a0b812c1..d7cea6aac 100644 --- a/src/core/hle/service/set/set_sys.cpp +++ b/src/core/hle/service/set/set_sys.cpp | |||
| @@ -101,6 +101,81 @@ void SET_SYS::SetColorSetId(Kernel::HLERequestContext& ctx) { | |||
| 101 | rb.Push(ResultSuccess); | 101 | rb.Push(ResultSuccess); |
| 102 | } | 102 | } |
| 103 | 103 | ||
| 104 | // FIXME: implement support for the real system_settings.ini | ||
| 105 | |||
| 106 | template <typename T> | ||
| 107 | static std::vector<u8> ToBytes(const T& value) { | ||
| 108 | static_assert(std::is_trivially_copyable_v<T>); | ||
| 109 | |||
| 110 | const auto* begin = reinterpret_cast<const u8*>(&value); | ||
| 111 | const auto* end = begin + sizeof(T); | ||
| 112 | |||
| 113 | return std::vector<u8>(begin, end); | ||
| 114 | } | ||
| 115 | |||
| 116 | using Settings = | ||
| 117 | std::map<std::string, std::map<std::string, std::vector<u8>, std::less<>>, std::less<>>; | ||
| 118 | |||
| 119 | static Settings GetSettings() { | ||
| 120 | Settings ret; | ||
| 121 | |||
| 122 | ret["hbloader"]["applet_heap_size"] = ToBytes(u64{0x0}); | ||
| 123 | ret["hbloader"]["applet_heap_reservation_size"] = ToBytes(u64{0x8600000}); | ||
| 124 | |||
| 125 | return ret; | ||
| 126 | } | ||
| 127 | |||
| 128 | void SET_SYS::GetSettingsItemValueSize(Kernel::HLERequestContext& ctx) { | ||
| 129 | LOG_DEBUG(Service_SET, "called"); | ||
| 130 | |||
| 131 | // The category of the setting. This corresponds to the top-level keys of | ||
| 132 | // system_settings.ini. | ||
| 133 | const auto setting_category_buf{ctx.ReadBuffer(0)}; | ||
| 134 | const std::string setting_category{setting_category_buf.begin(), setting_category_buf.end()}; | ||
| 135 | |||
| 136 | // The name of the setting. This corresponds to the second-level keys of | ||
| 137 | // system_settings.ini. | ||
| 138 | const auto setting_name_buf{ctx.ReadBuffer(1)}; | ||
| 139 | const std::string setting_name{setting_name_buf.begin(), setting_name_buf.end()}; | ||
| 140 | |||
| 141 | auto settings{GetSettings()}; | ||
| 142 | u64 response_size{0}; | ||
| 143 | |||
| 144 | if (settings.contains(setting_category) && settings[setting_category].contains(setting_name)) { | ||
| 145 | response_size = settings[setting_category][setting_name].size(); | ||
| 146 | } | ||
| 147 | |||
| 148 | IPC::ResponseBuilder rb{ctx, 4}; | ||
| 149 | rb.Push(response_size == 0 ? ResultUnknown : ResultSuccess); | ||
| 150 | rb.Push(response_size); | ||
| 151 | } | ||
| 152 | |||
| 153 | void SET_SYS::GetSettingsItemValue(Kernel::HLERequestContext& ctx) { | ||
| 154 | LOG_DEBUG(Service_SET, "called"); | ||
| 155 | |||
| 156 | // The category of the setting. This corresponds to the top-level keys of | ||
| 157 | // system_settings.ini. | ||
| 158 | const auto setting_category_buf{ctx.ReadBuffer(0)}; | ||
| 159 | const std::string setting_category{setting_category_buf.begin(), setting_category_buf.end()}; | ||
| 160 | |||
| 161 | // The name of the setting. This corresponds to the second-level keys of | ||
| 162 | // system_settings.ini. | ||
| 163 | const auto setting_name_buf{ctx.ReadBuffer(1)}; | ||
| 164 | const std::string setting_name{setting_name_buf.begin(), setting_name_buf.end()}; | ||
| 165 | |||
| 166 | auto settings{GetSettings()}; | ||
| 167 | Result response{ResultUnknown}; | ||
| 168 | |||
| 169 | if (settings.contains(setting_category) && settings[setting_category].contains(setting_name)) { | ||
| 170 | auto setting_value = settings[setting_category][setting_name]; | ||
| 171 | ctx.WriteBuffer(setting_value.data(), setting_value.size()); | ||
| 172 | response = ResultSuccess; | ||
| 173 | } | ||
| 174 | |||
| 175 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 176 | rb.Push(response); | ||
| 177 | } | ||
| 178 | |||
| 104 | SET_SYS::SET_SYS(Core::System& system_) : ServiceFramework{system_, "set:sys"} { | 179 | SET_SYS::SET_SYS(Core::System& system_) : ServiceFramework{system_, "set:sys"} { |
| 105 | // clang-format off | 180 | // clang-format off |
| 106 | static const FunctionInfo functions[] = { | 181 | static const FunctionInfo functions[] = { |
| @@ -138,8 +213,8 @@ SET_SYS::SET_SYS(Core::System& system_) : ServiceFramework{system_, "set:sys"} { | |||
| 138 | {32, nullptr, "SetAccountNotificationSettings"}, | 213 | {32, nullptr, "SetAccountNotificationSettings"}, |
| 139 | {35, nullptr, "GetVibrationMasterVolume"}, | 214 | {35, nullptr, "GetVibrationMasterVolume"}, |
| 140 | {36, nullptr, "SetVibrationMasterVolume"}, | 215 | {36, nullptr, "SetVibrationMasterVolume"}, |
| 141 | {37, nullptr, "GetSettingsItemValueSize"}, | 216 | {37, &SET_SYS::GetSettingsItemValueSize, "GetSettingsItemValueSize"}, |
| 142 | {38, nullptr, "GetSettingsItemValue"}, | 217 | {38, &SET_SYS::GetSettingsItemValue, "GetSettingsItemValue"}, |
| 143 | {39, nullptr, "GetTvSettings"}, | 218 | {39, nullptr, "GetTvSettings"}, |
| 144 | {40, nullptr, "SetTvSettings"}, | 219 | {40, nullptr, "SetTvSettings"}, |
| 145 | {41, nullptr, "GetEdid"}, | 220 | {41, nullptr, "GetEdid"}, |
diff --git a/src/core/hle/service/set/set_sys.h b/src/core/hle/service/set/set_sys.h index ac97772b7..258ef8c57 100644 --- a/src/core/hle/service/set/set_sys.h +++ b/src/core/hle/service/set/set_sys.h | |||
| @@ -23,6 +23,8 @@ private: | |||
| 23 | BasicBlack = 1, | 23 | BasicBlack = 1, |
| 24 | }; | 24 | }; |
| 25 | 25 | ||
| 26 | void GetSettingsItemValueSize(Kernel::HLERequestContext& ctx); | ||
| 27 | void GetSettingsItemValue(Kernel::HLERequestContext& ctx); | ||
| 26 | void GetFirmwareVersion(Kernel::HLERequestContext& ctx); | 28 | void GetFirmwareVersion(Kernel::HLERequestContext& ctx); |
| 27 | void GetFirmwareVersion2(Kernel::HLERequestContext& ctx); | 29 | void GetFirmwareVersion2(Kernel::HLERequestContext& ctx); |
| 28 | void GetColorSetId(Kernel::HLERequestContext& ctx); | 30 | void GetColorSetId(Kernel::HLERequestContext& ctx); |