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