diff --git a/libraries/libstratosphere/include/stratosphere/ldr/ldr_types.hpp b/libraries/libstratosphere/include/stratosphere/ldr/ldr_types.hpp
index 18302d285..328957aae 100644
--- a/libraries/libstratosphere/include/stratosphere/ldr/ldr_types.hpp
+++ b/libraries/libstratosphere/include/stratosphere/ldr/ldr_types.hpp
@@ -176,7 +176,7 @@ namespace ams::ldr {
AcidFlag_DeprecatedUseSecureMemory = (1 << 2),
AcidFlag_PoolPartitionShift = 2,
- AcidFlag_PoolPartitionMask = (3 << AcidFlag_PoolPartitionShift),
+ AcidFlag_PoolPartitionMask = (0xF << AcidFlag_PoolPartitionShift),
};
enum PoolPartition {
@@ -198,7 +198,8 @@ namespace ams::ldr {
u32 magic;
u32 size;
u8 version;
- u8 reserved_209[3];
+ u8 unknown_209;
+ u8 reserved_20A[2];
u32 flags;
ncm::ProgramId program_id_min;
ncm::ProgramId program_id_max;
diff --git a/stratosphere/loader/source/ldr_anti_downgrade_tables.inc b/stratosphere/loader/source/ldr_anti_downgrade_tables.inc
deleted file mode 100644
index 5c17ef0b9..000000000
--- a/stratosphere/loader/source/ldr_anti_downgrade_tables.inc
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
- * Copyright (c) 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 .
- */
-struct MinimumProgramVersion {
- ncm::ProgramId program_id;
- u32 version;
-};
-
-constexpr u32 MakeSystemVersion(u32 major, u32 minor, u32 micro) {
- return (major << 26) | (minor << 20) | (micro << 16);
-}
-
-constexpr MinimumProgramVersion g_MinimumProgramVersions810[] = {
- {ncm::SystemProgramId::Settings, 1},
- {ncm::SystemProgramId::Bus, 1},
- {ncm::SystemProgramId::Audio, 1},
- {ncm::SystemProgramId::NvServices, 1},
- {ncm::SystemProgramId::Ns, 1},
- {ncm::SystemProgramId::Ssl, 1},
- {ncm::SystemProgramId::Es, 1},
- {ncm::SystemProgramId::Creport, 1},
- {ncm::SystemProgramId::Ro, 1},
-};
-constexpr size_t g_MinimumProgramVersionsCount810 = util::size(g_MinimumProgramVersions810);
-
-constexpr MinimumProgramVersion g_MinimumProgramVersions900[] = {
- /* All non-Development System Modules. */
- {ncm::SystemProgramId::Usb, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Tma, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Boot2, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Settings, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Bus, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Bluetooth, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Bcat, MakeSystemVersion(9, 0, 0)},
- /* {ncm::SystemProgramId::Dmnt, MakeSystemVersion(9, 0, 0)}, */
- {ncm::SystemProgramId::Friends, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Nifm, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Ptm, MakeSystemVersion(9, 0, 0)},
- /* {ncm::SystemProgramId::Shell, MakeSystemVersion(9, 0, 0)}, */
- {ncm::SystemProgramId::BsdSockets, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Hid, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Audio, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::LogManager, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Wlan, MakeSystemVersion(9, 0, 0)},
- /* {ncm::SystemProgramId::Cs, MakeSystemVersion(9, 0, 0)}, */
- {ncm::SystemProgramId::Ldn, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::NvServices, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Pcv, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Ppc, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::NvnFlinger, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Pcie, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Account, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Ns, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Nfc, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Psc, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::CapSrv, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Am, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Ssl, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Nim, MakeSystemVersion(9, 0, 0)},
- /* {ncm::SystemProgramId::Cec, MakeSystemVersion(9, 0, 0)}, */
- /* {ncm::SystemProgramId::Tspm, MakeSystemVersion(9, 0, 0)}, */
- /* {ncm::SystemProgramId::Spl, MakeSystemVersion(9, 0, 0)}, */
- {ncm::SystemProgramId::Lbl, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Btm, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Erpt, MakeSystemVersion(9, 0, 0)},
- /* {ncm::SystemProgramId::Time, MakeSystemVersion(9, 0, 0)}, */
- {ncm::SystemProgramId::Vi, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Pctl, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Npns, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Eupld, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Glue, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Eclct, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Es, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Fatal, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Grc, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Creport, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Ro, MakeSystemVersion(9, 0, 0)},
- /* {ncm::SystemProgramId::Profiler, MakeSystemVersion(9, 0, 0)}, */
- {ncm::SystemProgramId::Sdb, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Migration, MakeSystemVersion(9, 0, 0)},
- /* {ncm::SystemProgramId::Jit, MakeSystemVersion(9, 0, 0)}, */
- {ncm::SystemProgramId::JpegDec, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::SafeMode, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Olsc, MakeSystemVersion(9, 0, 0)},
- /* {ncm::SystemProgramId::Dt, MakeSystemVersion(9, 0, 0)}, */
- /* {ncm::SystemProgramId::Nd, MakeSystemVersion(9, 0, 0)}, */
- {ncm::SystemProgramId::Ngct, MakeSystemVersion(9, 0, 0)},
-
- /* All Web Applets. */
- {ncm::WebAppletId::Web, MakeSystemVersion(9, 0, 0)},
- {ncm::WebAppletId::Shop, MakeSystemVersion(9, 0, 0)},
- {ncm::WebAppletId::OfflineWeb, MakeSystemVersion(9, 0, 0)},
- {ncm::WebAppletId::LoginShare, MakeSystemVersion(9, 0, 0)},
- {ncm::WebAppletId::WifiWebAuth, MakeSystemVersion(9, 0, 0)},
-};
-constexpr size_t g_MinimumProgramVersionsCount900 = util::size(g_MinimumProgramVersions900);
-
-constexpr MinimumProgramVersion g_MinimumProgramVersions910[] = {
- /* All non-Development System Modules. */
- {ncm::SystemProgramId::Usb, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Tma, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Boot2, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Settings, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Bus, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Bluetooth, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Bcat, MakeSystemVersion(9, 1, 0)},
- /* {ncm::SystemProgramId::Dmnt, MakeSystemVersion(9, 0, 0)}, */
- {ncm::SystemProgramId::Friends, MakeSystemVersion(9, 1, 0)},
- {ncm::SystemProgramId::Nifm, MakeSystemVersion(9, 1, 0)},
- {ncm::SystemProgramId::Ptm, MakeSystemVersion(9, 0, 0)},
- /* {ncm::SystemProgramId::Shell, MakeSystemVersion(9, 0, 0)}, */
- {ncm::SystemProgramId::BsdSockets, MakeSystemVersion(9, 1, 0)},
- {ncm::SystemProgramId::Hid, MakeSystemVersion(9, 1, 0)},
- {ncm::SystemProgramId::Audio, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::LogManager, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Wlan, MakeSystemVersion(9, 1, 0)},
- /* {ncm::SystemProgramId::Cs, MakeSystemVersion(9, 0, 0)}, */
- {ncm::SystemProgramId::Ldn, MakeSystemVersion(9, 1, 0)},
- {ncm::SystemProgramId::NvServices, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Pcv, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Ppc, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::NvnFlinger, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Pcie, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Account, MakeSystemVersion(9, 1, 0)},
- {ncm::SystemProgramId::Ns, MakeSystemVersion(9, 1, 0)},
- {ncm::SystemProgramId::Nfc, MakeSystemVersion(9, 1, 0)},
- {ncm::SystemProgramId::Psc, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::CapSrv, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Am, MakeSystemVersion(9, 1, 0)},
- {ncm::SystemProgramId::Ssl, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Nim, MakeSystemVersion(9, 1, 0)},
- /* {ncm::SystemProgramId::Cec, MakeSystemVersion(9, 0, 0)}, */
- /* {ncm::SystemProgramId::Tspm, MakeSystemVersion(9, 0, 0)}, */
- /* {ncm::SystemProgramId::Spl, MakeSystemVersion(9, 0, 0)}, */
- {ncm::SystemProgramId::Lbl, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Btm, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Erpt, MakeSystemVersion(9, 1, 0)},
- /* {ncm::SystemProgramId::Time, MakeSystemVersion(9, 0, 0)}, */
- {ncm::SystemProgramId::Vi, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Pctl, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Npns, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Eupld, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Glue, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Eclct, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Es, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Fatal, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Grc, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Creport, MakeSystemVersion(9, 1, 0)},
- {ncm::SystemProgramId::Ro, MakeSystemVersion(9, 1, 0)},
- /* {ncm::SystemProgramId::Profiler, MakeSystemVersion(9, 0, 0)}, */
- {ncm::SystemProgramId::Sdb, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Migration, MakeSystemVersion(9, 1, 0)},
- /* {ncm::SystemProgramId::Jit, MakeSystemVersion(9, 0, 0)}, */
- {ncm::SystemProgramId::JpegDec, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::SafeMode, MakeSystemVersion(9, 0, 0)},
- {ncm::SystemProgramId::Olsc, MakeSystemVersion(9, 1, 0)},
- /* {ncm::SystemProgramId::Dt, MakeSystemVersion(9, 0, 0)}, */
- /* {ncm::SystemProgramId::Nd, MakeSystemVersion(9, 0, 0)}, */
- {ncm::SystemProgramId::Ngct, MakeSystemVersion(9, 1, 0)},
-
- /* All Web Applets. */
- {ncm::WebAppletId::Web, MakeSystemVersion(9, 1, 0)},
- {ncm::WebAppletId::Shop, MakeSystemVersion(9, 1, 0)},
- {ncm::WebAppletId::OfflineWeb, MakeSystemVersion(9, 1, 0)},
- {ncm::WebAppletId::LoginShare, MakeSystemVersion(9, 1, 0)},
- {ncm::WebAppletId::WifiWebAuth, MakeSystemVersion(9, 1, 0)},
-};
-constexpr size_t g_MinimumProgramVersionsCount910 = util::size(g_MinimumProgramVersions910);
-
-constexpr MinimumProgramVersion g_MinimumProgramVersions1000[] = {
- /* All non-Development System Modules. */
- {ncm::SystemProgramId::Usb, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Tma, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Boot2, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Settings, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Bus, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Bluetooth, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Bcat, MakeSystemVersion(10, 0, 0)},
- /* {ncm::SystemProgramId::Dmnt, MakeSystemVersion(10, 0, 0)}, */
- {ncm::SystemProgramId::Friends, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Nifm, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Ptm, MakeSystemVersion(10, 0, 0)},
- /* {ncm::SystemProgramId::Shell, MakeSystemVersion(10, 0, 0)}, */
- {ncm::SystemProgramId::BsdSockets, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Hid, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Audio, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::LogManager, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Wlan, MakeSystemVersion(10, 0, 0)},
- /* {ncm::SystemProgramId::Cs, MakeSystemVersion(10, 0, 0)}, */
- {ncm::SystemProgramId::Ldn, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::NvServices, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Pcv, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Ppc, MakeSystemVersion( 9, 0, 0)},
- {ncm::SystemProgramId::NvnFlinger, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Pcie, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Account, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Ns, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Nfc, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Psc, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::CapSrv, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Am, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Ssl, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Nim, MakeSystemVersion(10, 0, 0)},
- /* {ncm::SystemProgramId::Cec, MakeSystemVersion(10, 0, 0)}, */
- /* {ncm::SystemProgramId::Tspm, MakeSystemVersion(10, 0, 0)}, */
- /* {ncm::SystemProgramId::Spl, MakeSystemVersion(10, 0, 0)}, */
- {ncm::SystemProgramId::Lbl, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Btm, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Erpt, MakeSystemVersion(10, 0, 0)},
- /* {ncm::SystemProgramId::Time, MakeSystemVersion(10, 0, 0)}, */
- {ncm::SystemProgramId::Vi, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Pctl, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Npns, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Eupld, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Glue, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Eclct, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Es, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Fatal, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Grc, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Creport, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Ro, MakeSystemVersion(10, 0, 0)},
- /* {ncm::SystemProgramId::Profiler, MakeSystemVersion(10, 0, 0)}, */
- {ncm::SystemProgramId::Sdb, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Migration, MakeSystemVersion(10, 0, 0)},
- /* {ncm::SystemProgramId::Jit, MakeSystemVersion(10, 0, 0)}, */
- {ncm::SystemProgramId::JpegDec, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::SafeMode, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Olsc, MakeSystemVersion(10, 0, 0)},
- /* {ncm::SystemProgramId::Dt, MakeSystemVersion(10, 0, 0)}, */
- /* {ncm::SystemProgramId::Nd, MakeSystemVersion(10, 0, 0)}, */
- {ncm::SystemProgramId::Ngct, MakeSystemVersion(10, 0, 0)},
- /* {ncm::SystemProgramId::Pgl, MakeSystemVersion(10, 0, 0)}, */
-
- /* All Web Applets. */
- {ncm::WebAppletId::Web, MakeSystemVersion(10, 0, 0)},
- {ncm::WebAppletId::Shop, MakeSystemVersion(10, 0, 0)},
- {ncm::WebAppletId::OfflineWeb, MakeSystemVersion(10, 0, 0)},
- {ncm::WebAppletId::LoginShare, MakeSystemVersion(10, 0, 0)},
- {ncm::WebAppletId::WifiWebAuth, MakeSystemVersion(10, 0, 0)},
-};
-constexpr size_t g_MinimumProgramVersionsCount1000 = util::size(g_MinimumProgramVersions1000);
-
-constexpr MinimumProgramVersion g_MinimumProgramVersions1010[] = {
- /* All non-Development System Modules. */
- {ncm::SystemProgramId::Usb, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Tma, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Boot2, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Settings, MakeSystemVersion(10, 1, 0)},
- {ncm::SystemProgramId::Bus, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Bluetooth, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Bcat, MakeSystemVersion(10, 0, 0)},
- /* {ncm::SystemProgramId::Dmnt, MakeSystemVersion(10, 0, 0)}, */
- {ncm::SystemProgramId::Friends, MakeSystemVersion(10, 1, 0)},
- {ncm::SystemProgramId::Nifm, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Ptm, MakeSystemVersion(10, 0, 2)},
- /* {ncm::SystemProgramId::Shell, MakeSystemVersion(10, 0, 0)}, */
- {ncm::SystemProgramId::BsdSockets, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Hid, MakeSystemVersion(10, 1, 0)},
- {ncm::SystemProgramId::Audio, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::LogManager, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Wlan, MakeSystemVersion(10, 1, 0)},
- /* {ncm::SystemProgramId::Cs, MakeSystemVersion(10, 0, 0)}, */
- {ncm::SystemProgramId::Ldn, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::NvServices, MakeSystemVersion(10, 1, 0)},
- {ncm::SystemProgramId::Pcv, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Ppc, MakeSystemVersion( 9, 0, 0)},
- {ncm::SystemProgramId::NvnFlinger, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Pcie, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Account, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Ns, MakeSystemVersion(10, 1, 0)},
- {ncm::SystemProgramId::Nfc, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Psc, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::CapSrv, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Am, MakeSystemVersion(10, 1, 0)},
- {ncm::SystemProgramId::Ssl, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Nim, MakeSystemVersion(10, 1, 0)},
- /* {ncm::SystemProgramId::Cec, MakeSystemVersion(10, 0, 0)}, */
- /* {ncm::SystemProgramId::Tspm, MakeSystemVersion(10, 0, 0)}, */
- /* {ncm::SystemProgramId::Spl, MakeSystemVersion(10, 0, 0)}, */
- {ncm::SystemProgramId::Lbl, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Btm, MakeSystemVersion(10, 1, 0)},
- {ncm::SystemProgramId::Erpt, MakeSystemVersion(10, 0, 0)},
- /* {ncm::SystemProgramId::Time, MakeSystemVersion(10, 0, 0)}, */
- {ncm::SystemProgramId::Vi, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Pctl, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Npns, MakeSystemVersion(10, 1, 0)},
- {ncm::SystemProgramId::Eupld, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Glue, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Eclct, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Es, MakeSystemVersion(10, 1, 0)},
- {ncm::SystemProgramId::Fatal, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Grc, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Creport, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Ro, MakeSystemVersion(10, 0, 0)},
- /* {ncm::SystemProgramId::Profiler, MakeSystemVersion(10, 0, 0)}, */
- {ncm::SystemProgramId::Sdb, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Migration, MakeSystemVersion(10, 1, 0)},
- /* {ncm::SystemProgramId::Jit, MakeSystemVersion(10, 0, 0)}, */
- {ncm::SystemProgramId::JpegDec, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::SafeMode, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Olsc, MakeSystemVersion(10, 1, 0)},
- /* {ncm::SystemProgramId::Dt, MakeSystemVersion(10, 0, 0)}, */
- /* {ncm::SystemProgramId::Nd, MakeSystemVersion(10, 0, 0)}, */
- {ncm::SystemProgramId::Ngct, MakeSystemVersion(10, 0, 0)},
- /* {ncm::SystemProgramId::Pgl, MakeSystemVersion(10, 0, 0)}, */
-
- /* All Web Applets. */
- {ncm::WebAppletId::Web, MakeSystemVersion(10, 0, 0)},
- {ncm::WebAppletId::Shop, MakeSystemVersion(10, 0, 0)},
- {ncm::WebAppletId::OfflineWeb, MakeSystemVersion(10, 0, 0)},
- {ncm::WebAppletId::LoginShare, MakeSystemVersion(10, 0, 0)},
- {ncm::WebAppletId::WifiWebAuth, MakeSystemVersion(10, 0, 0)},
-};
-constexpr size_t g_MinimumProgramVersionsCount1010 = util::size(g_MinimumProgramVersions1010);
-
-constexpr MinimumProgramVersion g_MinimumProgramVersions1100[] = {
- /* All non-Development System Modules. */
- {ncm::SystemProgramId::Usb, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Tma, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Boot2, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Settings, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Bus, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Bluetooth, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Bcat, MakeSystemVersion(11, 0, 0)},
- /* {ncm::SystemProgramId::Dmnt, MakeSystemVersion(11, 0, 0)}, */
- {ncm::SystemProgramId::Friends, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Nifm, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Ptm, MakeSystemVersion(11, 0, 0)},
- /* {ncm::SystemProgramId::Shell, MakeSystemVersion(11, 0, 0)}, */
- {ncm::SystemProgramId::BsdSockets, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Hid, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Audio, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::LogManager, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Wlan, MakeSystemVersion(11, 0, 0)},
- /* {ncm::SystemProgramId::Cs, MakeSystemVersion(11, 0, 0)}, */
- {ncm::SystemProgramId::Ldn, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::NvServices, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Pcv, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Ppc, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::NvnFlinger, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Pcie, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Account, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Ns, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Nfc, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Psc, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::CapSrv, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Am, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Ssl, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Nim, MakeSystemVersion(11, 0, 0)},
- /* {ncm::SystemProgramId::Cec, MakeSystemVersion(11, 0, 0)}, */
- /* {ncm::SystemProgramId::Tspm, MakeSystemVersion(11, 0, 0)}, */
- /* {ncm::SystemProgramId::Spl, MakeSystemVersion(11, 0, 0)}, */
- {ncm::SystemProgramId::Lbl, MakeSystemVersion(10, 0, 0)},
- {ncm::SystemProgramId::Btm, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Erpt, MakeSystemVersion(11, 0, 0)},
- /* {ncm::SystemProgramId::Time, MakeSystemVersion(11, 0, 0)}, */
- {ncm::SystemProgramId::Vi, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Pctl, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Npns, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Eupld, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Glue, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Eclct, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Es, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Fatal, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Grc, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Creport, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Ro, MakeSystemVersion(11, 0, 0)},
- /* {ncm::SystemProgramId::Profiler, MakeSystemVersion(11, 0, 0)}, */
- {ncm::SystemProgramId::Sdb, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Migration, MakeSystemVersion(11, 0, 0)},
- /* {ncm::SystemProgramId::Jit, MakeSystemVersion(11, 0, 0)}, */
- {ncm::SystemProgramId::JpegDec, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::SafeMode, MakeSystemVersion(11, 0, 0)},
- {ncm::SystemProgramId::Olsc, MakeSystemVersion(11, 0, 0)},
- /* {ncm::SystemProgramId::Dt, MakeSystemVersion(11, 0, 0)}, */
- /* {ncm::SystemProgramId::Nd, MakeSystemVersion(11, 0, 0)}, */
- {ncm::SystemProgramId::Ngct, MakeSystemVersion(11, 0, 0)},
- /* {ncm::SystemProgramId::Pgl, MakeSystemVersion(11, 0, 0)}, */
-
- /* All Web Applets. */
- {ncm::WebAppletId::Web, MakeSystemVersion(11, 0, 0)},
- {ncm::WebAppletId::Shop, MakeSystemVersion(11, 0, 0)},
- {ncm::WebAppletId::OfflineWeb, MakeSystemVersion(11, 0, 0)},
- {ncm::WebAppletId::LoginShare, MakeSystemVersion(11, 0, 0)},
- {ncm::WebAppletId::WifiWebAuth, MakeSystemVersion(11, 0, 0)},
-};
-constexpr size_t g_MinimumProgramVersionsCount1100 = util::size(g_MinimumProgramVersions1100);
diff --git a/stratosphere/loader/source/ldr_capabilities.cpp b/stratosphere/loader/source/ldr_capabilities.cpp
index 62892aaaf..c1693c7b4 100644
--- a/stratosphere/loader/source/ldr_capabilities.cpp
+++ b/stratosphere/loader/source/ldr_capabilities.cpp
@@ -186,7 +186,7 @@ namespace ams::ldr {
);
enum class MemoryRegionType : u32 {
- None = 0,
+ NoMapping = 0,
KernelTraceBuffer = 1,
OnMemoryBootImage = 2,
DTB = 3,
@@ -200,17 +200,31 @@ namespace ams::ldr {
DEFINE_CAPABILITY_FIELD(Region2, ReadOnly1, 6, MemoryRegionType);
DEFINE_CAPABILITY_FIELD(ReadOnly2, Region2, 1, bool);
- bool IsValid(const util::BitPack32 *kac, size_t kac_count) const {
- for (size_t i = 0; i < kac_count; i++) {
- if (GetCapabilityId(kac[i]) == Id) {
- const auto restriction = Decode(kac[i]);
+ static bool IsValidRegionType(const util::BitPack32 *kac, size_t kac_count, MemoryRegionType region_type, bool is_read_only) {
+ if (region_type != MemoryRegionType::NoMapping) {
+ for (size_t i = 0; i < kac_count; i++) {
+ if (GetCapabilityId(kac[i]) == Id) {
+ const auto restriction = Decode(kac[i]);
- if (this->GetValue() == restriction.GetValue()) {
- return true;
+ if ((restriction.GetRegion0() == region_type && (is_read_only || !restriction.GetReadOnly0())) ||
+ (restriction.GetRegion1() == region_type && (is_read_only || !restriction.GetReadOnly1())) ||
+ (restriction.GetRegion2() == region_type && (is_read_only || !restriction.GetReadOnly2())))
+ {
+ return true;
+ }
}
}
+
+ return false;
+ } else {
+ return true;
}
- return false;
+ }
+
+ bool IsValid(const util::BitPack32 *kac, size_t kac_count) const {
+ return IsValidRegionType(kac, kac_count, this->GetRegion0(), this->GetReadOnly0()) &&
+ IsValidRegionType(kac, kac_count, this->GetRegion1(), this->GetReadOnly1()) &&
+ IsValidRegionType(kac, kac_count, this->GetRegion2(), this->GetReadOnly2());
}
);
diff --git a/stratosphere/loader/source/ldr_meta.cpp b/stratosphere/loader/source/ldr_meta.cpp
index 587962002..8d1e5c31a 100644
--- a/stratosphere/loader/source/ldr_meta.cpp
+++ b/stratosphere/loader/source/ldr_meta.cpp
@@ -89,6 +89,13 @@ namespace ams::ldr {
R_UNLESS((acid->flags & Acid::AcidFlag_Production) != 0, ldr::ResultInvalidMeta());
}
+ /* Validate that the acid version is correct. */
+ constexpr u8 MinimumValueForAcid209 = 14; /* TODO: What is the actual meaning of this value? */
+ if (acid->unknown_209 < MinimumValueForAcid209) {
+ R_UNLESS(acid->version == 0, ldr::ResultInvalidMeta());
+ R_UNLESS(acid->unknown_209 == 0, ldr::ResultInvalidMeta());
+ }
+
/* Validate Fac, Sac, Kac. */
R_TRY(ValidateSubregion(sizeof(Acid), size, acid->fac_offset, acid->fac_size));
R_TRY(ValidateSubregion(sizeof(Acid), size, acid->sac_offset, acid->sac_size));
diff --git a/stratosphere/loader/source/ldr_process_creation.cpp b/stratosphere/loader/source/ldr_process_creation.cpp
index bf0f3fe79..8b0632aa9 100644
--- a/stratosphere/loader/source/ldr_process_creation.cpp
+++ b/stratosphere/loader/source/ldr_process_creation.cpp
@@ -81,9 +81,6 @@ namespace ams::ldr {
bool g_has_nso[Nso_Count];
NsoHeader g_nso_headers[Nso_Count];
- /* Anti-downgrade. */
- #include "ldr_anti_downgrade_tables.inc"
-
Result ValidateProgramVersion(ncm::ProgramId program_id, u32 version) {
/* No version verification is done before 8.1.0. */
R_SUCCEED_IF(hos::GetVersion() < hos::Version_8_1_0);
@@ -91,40 +88,9 @@ namespace ams::ldr {
/* No verification is done if development. */
R_SUCCEED_IF(IsDevelopmentForAntiDowngradeCheck());
- /* Do version-dependent validation, if compiled to do so. */
-#ifdef LDR_VALIDATE_PROCESS_VERSION
- const MinimumProgramVersion *entries = nullptr;
- size_t num_entries = 0;
-
- const auto hos_version = hos::GetVersion();
- if (hos_version >= hos::Version_11_0_0) {
- entries = g_MinimumProgramVersions1100;
- num_entries = g_MinimumProgramVersionsCount1100;
- } else if (hos_version >= hos::Version_10_1_0) {
- entries = g_MinimumProgramVersions1010;
- num_entries = g_MinimumProgramVersionsCount1010;
- } else if (hos_version >= hos::Version_10_0_0) {
- entries = g_MinimumProgramVersions1000;
- num_entries = g_MinimumProgramVersionsCount1000;
- } else if (hos_version >= hos::Version_9_1_0) {
- entries = g_MinimumProgramVersions910;
- num_entries = g_MinimumProgramVersionsCount910;
- } else if (hos_version >= hos::Version_9_0_0) {
- entries = g_MinimumProgramVersions900;
- num_entries = g_MinimumProgramVersionsCount900;
- } else if (hos_version >= hos::Version_8_1_0) {
- entries = g_MinimumProgramVersions810;
- num_entries = g_MinimumProgramVersionsCount810;
- }
-
- for (size_t i = 0; i < num_entries; i++) {
- if (entries[i].program_id == program_id) {
- R_UNLESS(entries[i].version <= version, ldr::ResultInvalidVersion());
- }
- }
-#else
+ /* TODO: Anti-downgrade checking does not make very much sense for us. Should we do anything? */
AMS_UNUSED(program_id, version);
-#endif
+
R_SUCCEED();
}
@@ -216,6 +182,60 @@ namespace ams::ldr {
R_SUCCEED();
}
+ constexpr const ncm::ProgramId UnqualifiedApprovalProgramIds[] = {
+ { 0x010003F003A34000 }, /* Pokemon: Let's Go, Pikachu! */
+ { 0x0100152000022000 }, /* Mario Kart 8 Deluxe */
+ { 0x0100165003504000 }, /* Nintendo Labo Toy-Con 04: VR Kit */
+ { 0x0100187003A36000 }, /* Pokemon: Let's Go, Eevee! */
+ { 0x01002E5008C56000 }, /* Pokemon Sword [Live Tournament] */
+ { 0x01002FF008C24000 }, /* Ring Fit Adventure */
+ { 0x010049900F546001 }, /* Super Mario 3D All-Stars: Super Mario 64 */
+ { 0x010057D00ECE4000 }, /* Nintendo Switch Online (Nintendo 64) [for Japan] */
+ { 0x01006F8002326000 }, /* Animal Crossing: New Horizons */
+ { 0x01006FB00F50E000 }, /* [???] */
+ { 0x010070300F50C000 }, /* [???] */
+ { 0x010075100E8EC000 }, /* 马力欧卡丁车8 豪华版 [Mario Kart 8 Deluxe for China] */
+ { 0x01008DB008C2C000 }, /* Pokemon Shield */
+ { 0x01009AD008C4C000 }, /* Pokemon: Let's Go, Pikachu! [Kiosk] */
+ { 0x0100A66003384000 }, /* Hulu */
+ { 0x0100ABF008968000 }, /* Pokemon Sword */
+ { 0x0100C9A00ECE6000 }, /* Nintendo Switch Online (Nintendo 64) [for America] */
+ { 0x0100ED100BA3A000 }, /* Mario Kart Live: Home Circuit */
+ { 0x0100F38011CFE000 }, /* Animal Crossing: New Horizons Island Transfer Tool */
+ { 0x0100F6B011028000 }, /* 健身环大冒险 [Ring Fit Adventure for China] */
+ };
+
+ /* Check that the unqualified approval programs are sorted. */
+ static_assert([]() -> bool {
+ for (size_t i = 0; i < util::size(UnqualifiedApprovalProgramIds) - 1; ++i) {
+ if (UnqualifiedApprovalProgramIds[i].value >= UnqualifiedApprovalProgramIds[i + 1].value) {
+ return false;
+ }
+ }
+
+ return true;
+ }());
+
+ bool IsUnqualifiedApprovalProgramId(ncm::ProgramId program_id) {
+ /* Check if the program id is one with unqualified approval. */
+ return std::binary_search(std::begin(UnqualifiedApprovalProgramIds), std::end(UnqualifiedApprovalProgramIds), program_id);
+ }
+
+ bool IsUnqualifiedApproval(const Meta *meta) {
+ /* If the meta has unqualified approval flag, it's unqualified approval. */
+ if (meta->acid->flags & ldr::Acid::AcidFlag_UnqualifiedApproval) {
+ return true;
+ }
+
+ /* If the unqualified approval flag is not set, the program must be an application. */
+ if (!IsApplication(meta)) {
+ return false;
+ }
+
+ /* The program id must be a force unqualified approval program id. */
+ return IsUnqualifiedApprovalProgramId(meta->acid->program_id_min) && meta->acid->program_id_min == meta->acid->program_id_max;
+ }
+
Result ValidateMeta(const Meta *meta, const ncm::ProgramLocation &loc, const fs::CodeVerificationData &code_verification_data) {
/* Validate version. */
R_TRY(ValidateProgramVersion(loc.program_id, meta->npdm->version));
@@ -228,7 +248,7 @@ namespace ams::ldr {
R_TRY(TestCapability(static_cast(meta->acid_kac), meta->acid->kac_size / sizeof(util::BitPack32), static_cast(meta->aci_kac), meta->aci->kac_size / sizeof(util::BitPack32)));
/* If we have data to validate, validate it. */
- if (code_verification_data.has_data && meta->check_verification_data) {
+ if (meta->check_verification_data) {
const u8 *sig = code_verification_data.signature;
const size_t sig_size = sizeof(code_verification_data.signature);
const u8 *mod = static_cast(meta->modulus);
@@ -239,7 +259,15 @@ namespace ams::ldr {
const size_t hsh_size = sizeof(code_verification_data.target_hash);
const bool is_signature_valid = crypto::VerifyRsa2048PssSha256WithHash(sig, sig_size, mod, mod_size, exp, exp_size, hsh, hsh_size);
- R_UNLESS(is_signature_valid, ldr::ResultInvalidNcaSignature());
+ /* If the signature check fails, we need to check if this is allowable. */
+ if (!is_signature_valid) {
+ /* We have to enforce signature checks on prod and when we have a signature to check on dev. */
+ R_UNLESS(IsDevelopmentForAcidProductionCheck(), ldr::ResultInvalidNcaSignature());
+ R_UNLESS(!code_verification_data.has_data, ldr::ResultInvalidNcaSignature());
+
+ /* There was no signature to check on dev. Check if this is acceptable. */
+ R_UNLESS(IsUnqualifiedApproval(meta), ldr::ResultInvalidNcaSignature());
+ }
}
/* All good. */
@@ -298,6 +326,8 @@ namespace ams::ldr {
/* 5.0.0+ Set Pool Partition. */
if (hos::GetVersion() >= hos::Version_5_0_0) {
+ /* TODO: Nintendo no longer accepts Applet when pool partition == application. Would this break hbl/anything else in the hb ecosystem? */
+ /* TODO: Nintendo uses a helper bool MakeSvcPoolPartitionFlag(u32 *out, Acid::PoolPartition partition); */
switch (GetPoolPartition(meta)) {
case Acid::PoolPartition_Application:
if (IsApplet(meta)) {