diff --git a/Makefile b/Makefile index 63448b6d..7fe39351 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ include $(DEVKITPRO)/libnx/switch_rules # INCLUDES is a list of directories containing header files #--------------------------------------------------------------------------------- TARGET := $(notdir $(CURDIR)) -SOURCES := source source/ams source/hos source/result source/os source/os/impl source/dd source/sf source/sf/cmif source/sf/hipc source/dmnt source/spl source/spl/smc source/updater source/patcher source/map source/rnd source/util source/sm source/cfg source/pm source/hid source/ldr source/kvdb source/boot2 +SOURCES := source source/ams source/hos source/result source/os source/os/impl source/dd source/sf source/sf/cmif source/sf/hipc source/dmnt source/spl source/spl/smc source/updater source/patcher source/map source/rnd source/util source/sm source/cfg source/pm source/hid source/ldr source/kvdb source/settings source/boot2 DATA := data INCLUDES := include diff --git a/include/atmosphere/results/results_common.hpp b/include/atmosphere/results/results_common.hpp index b0b50d43..3166e473 100644 --- a/include/atmosphere/results/results_common.hpp +++ b/include/atmosphere/results/results_common.hpp @@ -271,6 +271,9 @@ namespace ams::result::impl { #define R_CONVERT_ALL(convert_type) \ R_CATCH_ALL() { return static_cast<::ams::Result>(convert_type); } +#define R_CATCH_RETHROW(catch_type) \ + R_CONVERT(catch_type, R_CURRENT_RESULT) + #define R_END_TRY_CATCH \ else if (R_FAILED(R_CURRENT_RESULT)) { \ return R_CURRENT_RESULT; \ diff --git a/include/atmosphere/results/settings_results.hpp b/include/atmosphere/results/settings_results.hpp index 6f015cdf..fed3ff33 100644 --- a/include/atmosphere/results/settings_results.hpp +++ b/include/atmosphere/results/settings_results.hpp @@ -21,11 +21,11 @@ namespace ams::settings { R_DEFINE_NAMESPACE_RESULT_MODULE(105); - R_DEFINE_ERROR_RESULT(ItemNotFound, 11); + R_DEFINE_ERROR_RESULT(SettingsItemNotFound, 11); R_DEFINE_ERROR_RANGE(InternalError, 100, 149); - R_DEFINE_ERROR_RESULT(ItemKeyAllocationFailed, 101); - R_DEFINE_ERROR_RESULT(ItemValueAllocationFailed, 102); + R_DEFINE_ERROR_RESULT(SettingsItemKeyAllocationFailed, 101); + R_DEFINE_ERROR_RESULT(SettingsItemValueAllocationFailed, 102); R_DEFINE_ERROR_RANGE(InvalidArgument, 200, 399); R_DEFINE_ERROR_RESULT(SettingsNameNull, 201); diff --git a/include/stratosphere/settings.hpp b/include/stratosphere/settings.hpp index 2751a061..66b9bf02 100644 --- a/include/stratosphere/settings.hpp +++ b/include/stratosphere/settings.hpp @@ -17,3 +17,5 @@ #pragma once #include "settings/settings_types.hpp" +#include "settings/settings_fwdbg_types.hpp" +#include "settings/settings_fwdbg_api.hpp" diff --git a/include/stratosphere/settings/settings_fwdbg_api.hpp b/include/stratosphere/settings/settings_fwdbg_api.hpp new file mode 100644 index 00000000..22f11835 --- /dev/null +++ b/include/stratosphere/settings/settings_fwdbg_api.hpp @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2018-2019 Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once +#include +#include "settings_fwdbg_types.hpp" + +namespace ams::settings::fwdbg { + + bool IsDebugModeEnabled(); + + size_t GetSettingsItemValueSize(const char *name, const char *key); + size_t GetSettingsItemValue(void *dst, size_t dst_size, const char *name, const char *key); + +} diff --git a/include/stratosphere/settings/settings_fwdbg_types.hpp b/include/stratosphere/settings/settings_fwdbg_types.hpp new file mode 100644 index 00000000..0440d5a3 --- /dev/null +++ b/include/stratosphere/settings/settings_fwdbg_types.hpp @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2018-2019 Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once +#include +#include "../sf/sf_buffer_tags.hpp" + +namespace ams::settings::fwdbg { + + constexpr size_t SettingsNameLengthMax = 0x40; + constexpr size_t SettingsItemKeyLengthMax = 0x40; + + struct SettingsName : sf::LargeData { + char value[util::AlignUp(SettingsNameLengthMax + 1, alignof(u64))]; + }; + + static_assert(std::is_pod::value && sizeof(SettingsName) > SettingsNameLengthMax); + + struct SettingsItemKey : sf::LargeData { + char value[util::AlignUp(SettingsItemKeyLengthMax + 1, alignof(u64))]; + }; + + static_assert(std::is_pod::value && sizeof(SettingsItemKey) > SettingsItemKeyLengthMax); + +} diff --git a/source/boot2/boot2_api.cpp b/source/boot2/boot2_api.cpp index 63e57b84..e1a35146 100644 --- a/source/boot2/boot2_api.cpp +++ b/source/boot2/boot2_api.cpp @@ -176,8 +176,7 @@ namespace ams::boot2 { /* Contact set:sys, retrieve boot!force_maintenance. */ { u8 force_maintenance = 1; - u64 size_out; - setsysGetSettingsItemValue("boot", "force_maintenance", &force_maintenance, sizeof(force_maintenance), &size_out); + settings::fwdbg::GetSettingsItemValue(&force_maintenance, sizeof(force_maintenance), "boot", "force_maintenance"); if (force_maintenance != 0) { return true; } diff --git a/source/settings/settings_fwdbg_api.cpp b/source/settings/settings_fwdbg_api.cpp new file mode 100644 index 00000000..c63b087f --- /dev/null +++ b/source/settings/settings_fwdbg_api.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2018-2019 Atmosphère-NX + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#include + +namespace ams::settings::fwdbg { + + /* TODO: Implement when libnx wrapper is added. */ + bool IsDebugModeEnabled(); + + size_t WEAK GetSettingsItemValueSize(const char *name, const char *key) { + u64 size = 0; + R_ASSERT(setsysGetSettingsItemValueSize(name, key, &size)); + return size; + } + + size_t WEAK GetSettingsItemValue(void *dst, size_t dst_size, const char *name, const char *key) { + u64 size = 0; + R_ASSERT(setsysGetSettingsItemValue(name, key, dst, dst_size, &size)); + return size; + } + +} diff --git a/source/sf/cmif/sf_cmif_service_dispatch.cpp b/source/sf/cmif/sf_cmif_service_dispatch.cpp index 41e61f37..40b72691 100644 --- a/source/sf/cmif/sf_cmif_service_dispatch.cpp +++ b/source/sf/cmif/sf_cmif_service_dispatch.cpp @@ -45,7 +45,7 @@ namespace ams::sf::cmif { /* Forward forwardable results, otherwise ensure we can send result to user. */ R_TRY_CATCH(command_result) { - R_CATCH(sf::impl::ResultRequestContextChanged) { return R_CURRENT_RESULT; } + R_CATCH_RETHROW(sf::impl::ResultRequestContextChanged) R_CATCH_ALL() { AMS_ASSERT(out_header != nullptr); } } R_END_TRY_CATCH; @@ -92,7 +92,7 @@ namespace ams::sf::cmif { R_CATCH(sm::mitm::ResultShouldForwardToSession) { return ctx.session->ForwardRequest(ctx); } - R_CATCH(sf::impl::ResultRequestContextChanged) { return R_CURRENT_RESULT; } + R_CATCH_RETHROW(sf::impl::ResultRequestContextChanged) R_CATCH_ALL() { AMS_ASSERT(out_header != nullptr); } } R_END_TRY_CATCH; diff --git a/source/util/ini.h b/source/util/ini.h index f45ba40b..047235e8 100644 --- a/source/util/ini.h +++ b/source/util/ini.h @@ -102,7 +102,7 @@ int ini_parse_string(const char* string, ini_handler handler, void* user); /* Maximum line length for any line in INI file (stack or heap). Note that this must be 3 more than the longest line (due to '\r', '\n', and '\0'). */ #ifndef INI_MAX_LINE -#define INI_MAX_LINE 200 +#define INI_MAX_LINE 0x480 #endif /* Nonzero to allow heap line buffer to grow via realloc(), zero for a