diff --git a/docs/changelog.md b/docs/changelog.md index 0e47ac0d8..1581382f6 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,4 +1,11 @@ # Changelog +## 1.10.2 ++ Basic support was added for 21.2.0. ++ General system stability improvements to enhance the user's experience. +## 1.10.1 ++ Basic support was added for 21.1.0. ++ A bug was fixed that caused some games (e.g. Tomb Raider definitive edition) to fail to launch. ++ General system stability improvements to enhance the user's experience. ## 1.10.0 + Basic support was added for 21.0.0. + The console should boot and atmosphère should be fully functional. diff --git a/emummc/README.md b/emummc/README.md index a69168b45..ba438c68c 100644 --- a/emummc/README.md +++ b/emummc/README.md @@ -2,7 +2,7 @@ *A SDMMC driver replacement for Nintendo's Filesystem Services, by **m4xw*** ### Supported Horizon Versions -**1.0.0 - 21.0.0** +**1.0.0 - 21.2.0** ## Features * Arbitrary SDMMC backend selection diff --git a/emummc/source/FS/FS_offsets.c b/emummc/source/FS/FS_offsets.c index a84770903..3d1e8505b 100644 --- a/emummc/source/FS/FS_offsets.c +++ b/emummc/source/FS/FS_offsets.c @@ -81,6 +81,8 @@ #include "offsets/2010_exfat.h" #include "offsets/2100.h" #include "offsets/2100_exfat.h" +#include "offsets/2120.h" +#include "offsets/2120_exfat.h" #include "../utils/fatal.h" #define GET_OFFSET_STRUCT_NAME(vers) g_offsets##vers @@ -173,6 +175,8 @@ DEFINE_OFFSET_STRUCT(_2010); DEFINE_OFFSET_STRUCT(_2010_EXFAT); DEFINE_OFFSET_STRUCT(_2100); DEFINE_OFFSET_STRUCT(_2100_EXFAT); +DEFINE_OFFSET_STRUCT(_2120); +DEFINE_OFFSET_STRUCT(_2120_EXFAT); const fs_offsets_t *get_fs_offsets(enum FS_VER version) { switch (version) { @@ -306,6 +310,10 @@ const fs_offsets_t *get_fs_offsets(enum FS_VER version) { return &(GET_OFFSET_STRUCT_NAME(_2100)); case FS_VER_21_0_0_EXFAT: return &(GET_OFFSET_STRUCT_NAME(_2100_EXFAT)); + case FS_VER_21_2_0: + return &(GET_OFFSET_STRUCT_NAME(_2120)); + case FS_VER_21_2_0_EXFAT: + return &(GET_OFFSET_STRUCT_NAME(_2120_EXFAT)); default: fatal_abort(Fatal_UnknownVersion); } diff --git a/emummc/source/FS/FS_versions.h b/emummc/source/FS/FS_versions.h index c1d21797d..da27f7209 100644 --- a/emummc/source/FS/FS_versions.h +++ b/emummc/source/FS/FS_versions.h @@ -119,6 +119,9 @@ enum FS_VER FS_VER_21_0_0, FS_VER_21_0_0_EXFAT, + FS_VER_21_2_0, + FS_VER_21_2_0_EXFAT, + FS_VER_MAX, }; diff --git a/emummc/source/FS/offsets/2120.h b/emummc/source/FS/offsets/2120.h new file mode 100644 index 000000000..45ff7b0e5 --- /dev/null +++ b/emummc/source/FS/offsets/2120.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2019 m4xw + * Copyright (c) 2019 Atmosphere-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 . + */ +#ifndef __FS_2120_H__ +#define __FS_2120_H__ + +// Accessor vtable getters +#define FS_OFFSET_2120_SDMMC_ACCESSOR_GC 0x1AC970 +#define FS_OFFSET_2120_SDMMC_ACCESSOR_SD 0x1AE980 +#define FS_OFFSET_2120_SDMMC_ACCESSOR_NAND 0x1ACFA0 + +// Hooks +#define FS_OFFSET_2120_SDMMC_WRAPPER_READ 0x1A8850 +#define FS_OFFSET_2120_SDMMC_WRAPPER_WRITE 0x1A88B0 +#define FS_OFFSET_2120_RTLD 0x2E1C0 +#define FS_OFFSET_2120_RTLD_DESTINATION ((uintptr_t)(INT64_C(-0x4C))) + +#define FS_OFFSET_2120_CLKRST_SET_MIN_V_CLK_RATE 0x1CB9B0 + +// Misc funcs +#define FS_OFFSET_2120_LOCK_MUTEX 0x1A17D0 +#define FS_OFFSET_2120_UNLOCK_MUTEX 0x1A1830 + +#define FS_OFFSET_2120_SDMMC_WRAPPER_CONTROLLER_OPEN 0x1A8810 +#define FS_OFFSET_2120_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x1A8830 + +// Misc Data +#define FS_OFFSET_2120_SD_MUTEX 0xFEE408 +#define FS_OFFSET_2120_NAND_MUTEX 0xFE9CF0 +#define FS_OFFSET_2120_ACTIVE_PARTITION 0xFE9D30 +#define FS_OFFSET_2120_SDMMC_DAS_HANDLE 0xFCBB18 + +// NOPs +#define FS_OFFSET_2120_SD_DAS_INIT 0x2B5C8 + +// Nintendo Paths +#define FS_OFFSET_2120_NINTENDO_PATHS \ +{ \ + {.opcode_reg = 3, .adrp_offset = 0x000718CC, .add_rel_offset = 0x00000004}, \ + {.opcode_reg = 3, .adrp_offset = 0x000824F4, .add_rel_offset = 0x00000004}, \ + {.opcode_reg = 4, .adrp_offset = 0x0008AF18, .add_rel_offset = 0x00000004}, \ + {.opcode_reg = 4, .adrp_offset = 0x000A0B8C, .add_rel_offset = 0x00000004}, \ + {.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \ +} + +#endif // __FS_2120_H__ diff --git a/emummc/source/FS/offsets/2120_exfat.h b/emummc/source/FS/offsets/2120_exfat.h new file mode 100644 index 000000000..a89ab158d --- /dev/null +++ b/emummc/source/FS/offsets/2120_exfat.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2019 m4xw + * Copyright (c) 2019 Atmosphere-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 . + */ +#ifndef __FS_2120_EXFAT_EXFAT_H__ +#define __FS_2120_EXFAT_EXFAT_H__ + +// Accessor vtable getters +#define FS_OFFSET_2120_EXFAT_SDMMC_ACCESSOR_GC 0x1B7AD0 +#define FS_OFFSET_2120_EXFAT_SDMMC_ACCESSOR_SD 0x1B9AE0 +#define FS_OFFSET_2120_EXFAT_SDMMC_ACCESSOR_NAND 0x1B8100 + +// Hooks +#define FS_OFFSET_2120_EXFAT_SDMMC_WRAPPER_READ 0x1B39B0 +#define FS_OFFSET_2120_EXFAT_SDMMC_WRAPPER_WRITE 0x1B3A10 +#define FS_OFFSET_2120_EXFAT_RTLD 0x2E1C0 +#define FS_OFFSET_2120_EXFAT_RTLD_DESTINATION ((uintptr_t)(INT64_C(-0x4C))) + +#define FS_OFFSET_2120_EXFAT_CLKRST_SET_MIN_V_CLK_RATE 0x1D6B10 + +// Misc funcs +#define FS_OFFSET_2120_EXFAT_LOCK_MUTEX 0x1AC930 +#define FS_OFFSET_2120_EXFAT_UNLOCK_MUTEX 0x1AC990 + +#define FS_OFFSET_2120_EXFAT_SDMMC_WRAPPER_CONTROLLER_OPEN 0x1B3970 +#define FS_OFFSET_2120_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x1B3990 + +// Misc Data +#define FS_OFFSET_2120_EXFAT_SD_MUTEX 0xFFF408 +#define FS_OFFSET_2120_EXFAT_NAND_MUTEX 0xFFACF0 +#define FS_OFFSET_2120_EXFAT_ACTIVE_PARTITION 0xFFAD30 +#define FS_OFFSET_2120_EXFAT_SDMMC_DAS_HANDLE 0xFD8B18 + +// NOPs +#define FS_OFFSET_2120_EXFAT_SD_DAS_INIT 0x2B5C8 + +// Nintendo Paths +#define FS_OFFSET_2120_EXFAT_NINTENDO_PATHS \ +{ \ + {.opcode_reg = 3, .adrp_offset = 0x000718CC, .add_rel_offset = 0x00000004}, \ + {.opcode_reg = 3, .adrp_offset = 0x000824F4, .add_rel_offset = 0x00000004}, \ + {.opcode_reg = 4, .adrp_offset = 0x0008AF18, .add_rel_offset = 0x00000004}, \ + {.opcode_reg = 4, .adrp_offset = 0x000A0B8C, .add_rel_offset = 0x00000004}, \ + {.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \ +} + +#endif // __FS_2120_EXFAT_EXFAT_H__ diff --git a/fusee/program/source/fusee_stratosphere.cpp b/fusee/program/source/fusee_stratosphere.cpp index cd6952886..b5221927d 100644 --- a/fusee/program/source/fusee_stratosphere.cpp +++ b/fusee/program/source/fusee_stratosphere.cpp @@ -189,6 +189,9 @@ namespace ams::nxboot { FsVersion_21_0_0, FsVersion_21_0_0_Exfat, + FsVersion_21_2_0, + FsVersion_21_2_0_Exfat, + FsVersion_Count, }; @@ -290,6 +293,9 @@ namespace ams::nxboot { { 0xEE, 0x4B, 0x30, 0x12, 0xA6, 0x84, 0x02, 0x25 }, /* FsVersion_21_0_0 */ { 0x6E, 0x2B, 0xD9, 0xBA, 0xA3, 0xB9, 0x10, 0xF1 }, /* FsVersion_21_0_0_Exfat */ + + { 0xAF, 0x1D, 0xBD, 0xC7, 0x82, 0x98, 0x3C, 0xBD }, /* FsVersion_21_2_0 */ + { 0x56, 0x25, 0x17, 0xA1, 0x92, 0xC3, 0xC8, 0xF0 }, /* FsVersion_21_2_0_Exfat */ }; const InitialProcessBinaryHeader *FindInitialProcessBinary(const pkg2::Package2Header *header, const u8 *data, ams::TargetFirmware target_firmware) { @@ -692,11 +698,13 @@ namespace ams::nxboot { AddPatch(fs_meta, 0x187B70, NogcPatch1, sizeof(NogcPatch1)); break; case FsVersion_21_0_0: + case FsVersion_21_2_0: AddPatch(fs_meta, 0x1AC9ED, NogcPatch0, sizeof(NogcPatch0)); AddPatch(fs_meta, 0x1ACA05 , NogcPatch0, sizeof(NogcPatch0)); AddPatch(fs_meta, 0x17FBE0, NogcPatch1, sizeof(NogcPatch1)); break; case FsVersion_21_0_0_Exfat: + case FsVersion_21_2_0_Exfat: AddPatch(fs_meta, 0x1B7B4D, NogcPatch0, sizeof(NogcPatch0)); AddPatch(fs_meta, 0x1B7B65, NogcPatch0, sizeof(NogcPatch0)); AddPatch(fs_meta, 0x18AD40, NogcPatch1, sizeof(NogcPatch1)); diff --git a/libraries/libstratosphere/include/stratosphere/hos/hos_types.hpp b/libraries/libstratosphere/include/stratosphere/hos/hos_types.hpp index 06c0cf33b..13e1f96a8 100644 --- a/libraries/libstratosphere/include/stratosphere/hos/hos_types.hpp +++ b/libraries/libstratosphere/include/stratosphere/hos/hos_types.hpp @@ -99,6 +99,7 @@ namespace ams::hos { Version_21_0_0 = ::ams::TargetFirmware_21_0_0, Version_21_0_1 = ::ams::TargetFirmware_21_0_1, Version_21_1_0 = ::ams::TargetFirmware_21_1_0, + Version_21_2_0 = ::ams::TargetFirmware_21_2_0, Version_Current = ::ams::TargetFirmware_Current, diff --git a/libraries/libvapours/include/vapours/ams/ams_api_version.h b/libraries/libvapours/include/vapours/ams/ams_api_version.h index 041990163..facb03cfe 100644 --- a/libraries/libvapours/include/vapours/ams/ams_api_version.h +++ b/libraries/libvapours/include/vapours/ams/ams_api_version.h @@ -17,10 +17,10 @@ #define ATMOSPHERE_RELEASE_VERSION_MAJOR 1 #define ATMOSPHERE_RELEASE_VERSION_MINOR 10 -#define ATMOSPHERE_RELEASE_VERSION_MICRO 1 +#define ATMOSPHERE_RELEASE_VERSION_MICRO 2 #define ATMOSPHERE_RELEASE_VERSION ATMOSPHERE_RELEASE_VERSION_MAJOR, ATMOSPHERE_RELEASE_VERSION_MINOR, ATMOSPHERE_RELEASE_VERSION_MICRO #define ATMOSPHERE_SUPPORTED_HOS_VERSION_MAJOR 21 -#define ATMOSPHERE_SUPPORTED_HOS_VERSION_MINOR 1 +#define ATMOSPHERE_SUPPORTED_HOS_VERSION_MINOR 2 #define ATMOSPHERE_SUPPORTED_HOS_VERSION_MICRO 0 diff --git a/libraries/libvapours/include/vapours/ams/ams_target_firmware.h b/libraries/libvapours/include/vapours/ams/ams_target_firmware.h index f2d953f9b..55a2bbc2d 100644 --- a/libraries/libvapours/include/vapours/ams/ams_target_firmware.h +++ b/libraries/libvapours/include/vapours/ams/ams_target_firmware.h @@ -97,8 +97,9 @@ #define ATMOSPHERE_TARGET_FIRMWARE_21_0_0 ATMOSPHERE_TARGET_FIRMWARE(21, 0, 0) #define ATMOSPHERE_TARGET_FIRMWARE_21_0_1 ATMOSPHERE_TARGET_FIRMWARE(21, 0, 1) #define ATMOSPHERE_TARGET_FIRMWARE_21_1_0 ATMOSPHERE_TARGET_FIRMWARE(21, 1, 0) +#define ATMOSPHERE_TARGET_FIRMWARE_21_2_0 ATMOSPHERE_TARGET_FIRMWARE(21, 2, 0) -#define ATMOSPHERE_TARGET_FIRMWARE_CURRENT ATMOSPHERE_TARGET_FIRMWARE_21_1_0 +#define ATMOSPHERE_TARGET_FIRMWARE_CURRENT ATMOSPHERE_TARGET_FIRMWARE_21_2_0 #define ATMOSPHERE_TARGET_FIRMWARE_MIN ATMOSPHERE_TARGET_FIRMWARE(0, 0, 0) #define ATMOSPHERE_TARGET_FIRMWARE_MAX ATMOSPHERE_TARGET_FIRMWARE_CURRENT @@ -188,6 +189,7 @@ namespace ams { TargetFirmware_21_0_0 = ATMOSPHERE_TARGET_FIRMWARE_21_0_0, TargetFirmware_21_0_1 = ATMOSPHERE_TARGET_FIRMWARE_21_0_1, TargetFirmware_21_1_0 = ATMOSPHERE_TARGET_FIRMWARE_21_1_0, + TargetFirmware_21_2_0 = ATMOSPHERE_TARGET_FIRMWARE_21_2_0, TargetFirmware_Current = ATMOSPHERE_TARGET_FIRMWARE_CURRENT,