From f5052b4bca380f4e23c9fb603e03c022129617ae Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Sun, 17 Apr 2022 20:11:05 -0700 Subject: [PATCH] loader: update for changes in 14.0.0 --- .../include/stratosphere/ldr/ldr_types.hpp | 5 +- .../source/ldr_anti_downgrade_tables.inc | 399 ------------------ .../loader/source/ldr_capabilities.cpp | 30 +- stratosphere/loader/source/ldr_meta.cpp | 7 + .../loader/source/ldr_process_creation.cpp | 106 +++-- 5 files changed, 100 insertions(+), 447 deletions(-) delete mode 100644 stratosphere/loader/source/ldr_anti_downgrade_tables.inc 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)) {