Compare commits

...

14 Commits

Author SHA1 Message Date
lsp199308
d8a37b4b71
loader: add usb 3.0 enable patches for 20.1.0 (#2556)
* loader: add usb 3.0 enable patches for 20.1.0
2025-06-03 01:04:52 -07:00
Michael Scire
b11850b3a3 git subrepo push libraries
subrepo:
  subdir:   "libraries"
  merged:   "0f72b2ceb"
upstream:
  origin:   "https://github.com/Atmosphere-NX/Atmosphere-libs"
  branch:   "master"
  commit:   "0f72b2ceb"
git-subrepo:
  version:  "0.4.1"
  origin:   "???"
  commit:   "???"
2025-05-28 19:34:34 -07:00
Michael Scire
77603bf7e5 docs: add basic changelog for 1.9.1 2025-05-28 19:33:49 -07:00
Marcus Carter
6b01ebca9e Clarify that code type 0xC4 uses a 64-bit value in cheats.md by formatting the key values as such
Changes the formatting of the key values at `Code Type 0xC4: Begin Extended Keypress Conditional Block` in cheats.md so that it is perfectly clear that those values are 64-bit values rather than 32-bit or 28-bit like `Code Type 0x8: Begin Keypress Conditional Block`, and also for the fact that the formatting matches the rest of the document and is thus cleaner.
2025-05-28 14:47:45 -07:00
Michael Scire
17be65b4b9 git subrepo push emummc
subrepo:
  subdir:   "emummc"
  merged:   "a8e5f1a18"
upstream:
  origin:   "https://github.com/m4xw/emummc"
  branch:   "develop"
  commit:   "a8e5f1a18"
git-subrepo:
  version:  "0.4.1"
  origin:   "???"
  commit:   "???"
2025-05-28 12:29:54 -07:00
Michael Scire
409c3cf9e1 emummc: note 20.1.0 support in README 2025-05-28 12:29:17 -07:00
Michael Scire
f4e1d0bf9f kern: move spendsgir static assert 2025-05-28 12:18:51 -07:00
Michael Scire
ae65b5df0c fusee/emummc: add support for FS 20.1.0 2025-05-28 12:02:56 -07:00
Michael Scire
0a299a3d40 erpt: update IDs for 20.1.0 2025-05-28 11:48:04 -07:00
Michael Scire
801438953d kern: save/restore spendsgir in KInterruptController::Save/RestoreCoreLocal 2025-05-28 10:54:52 -07:00
Michael Scire
3fbc59cce1 kern: wait 100us after synchronizing cores before saving interrupt state on sleep 2025-05-28 10:48:42 -07:00
Michael Scire
f646d9c8f9 kern: use KLightLock for KCoreBarrierInterruptHandler 2025-05-28 10:44:31 -07:00
Michael Scire
69cc653e7f Add version enums for 20.1.0 2025-05-28 10:32:26 -07:00
Michael Scire
6da88f8f3e docs: add banner to readme 2025-05-27 22:24:41 -07:00
21 changed files with 216 additions and 48 deletions

View File

@ -4,6 +4,7 @@
![License](https://img.shields.io/badge/License-GPLv2-blue.svg) ![License](https://img.shields.io/badge/License-GPLv2-blue.svg)
[![Chat on Discord](https://img.shields.io/badge/Discord-5865f2?logo=discord&logoColor=white)](https://discordapp.com/invite/ZdqEhed) [![Chat on Discord](https://img.shields.io/badge/Discord-5865f2?logo=discord&logoColor=white)](https://discordapp.com/invite/ZdqEhed)
![Made with Notepad++](img/np++.png?raw=true)
Atmosphère is a work-in-progress customized firmware for the Nintendo Switch. Atmosphère is a work-in-progress customized firmware for the Nintendo Switch.

View File

@ -1,4 +1,7 @@
# Changelog # Changelog
## 1.9.1
+ Basic support was added for 20.1.0.
+ General system stability improvements to enhance the user's experience.
## 1.9.0 ## 1.9.0
+ Basic support was added for 20.0.0. + Basic support was added for 20.0.0.
+ The console should boot and atmosphère should be fully functional. However, not all modules have been fully updated to reflect the latest changes. + The console should boot and atmosphère should be fully functional. However, not all modules have been fully updated to reflect the latest changes.

View File

@ -423,41 +423,41 @@ Note that for multiple button combinations, the bitmasks should be OR'd together
#### Keypad Values #### Keypad Values
Note: This is the direct output of `hidKeysDown()`. Note: This is the direct output of `hidKeysDown()`.
+ 000000001: A + 00000000 00000001: A
+ 000000002: B + 00000000 00000002: B
+ 000000004: X + 00000000 00000004: X
+ 000000008: Y + 00000000 00000008: Y
+ 000000010: Left Stick Pressed + 00000000 00000010: Left Stick Pressed
+ 000000020: Right Stick Pressed + 00000000 00000020: Right Stick Pressed
+ 000000040: L + 00000000 00000040: L
+ 000000080: R + 00000000 00000080: R
+ 000000100: ZL + 00000000 00000100: ZL
+ 000000200: ZR + 00000000 00000200: ZR
+ 000000400: Plus + 00000000 00000400: Plus
+ 000000800: Minus + 00000000 00000800: Minus
+ 000001000: Left + 00000000 00001000: Left
+ 000002000: Up + 00000000 00002000: Up
+ 000004000: Right + 00000000 00004000: Right
+ 000008000: Down + 00000000 00008000: Down
+ 000010000: Left Stick Left + 00000000 00010000: Left Stick Left
+ 000020000: Left Stick Up + 00000000 00020000: Left Stick Up
+ 000040000: Left Stick Right + 00000000 00040000: Left Stick Right
+ 000080000: Left Stick Down + 00000000 00080000: Left Stick Down
+ 000100000: Right Stick Left + 00000000 00100000: Right Stick Left
+ 000200000: Right Stick Up + 00000000 00200000: Right Stick Up
+ 000400000: Right Stick Right + 00000000 00400000: Right Stick Right
+ 000800000: Right Stick Down + 00000000 00800000: Right Stick Down
+ 001000000: SL Left Joy-Con + 00000000 01000000: SL Left Joy-Con
+ 002000000: SR Left Joy-Con + 00000000 02000000: SR Left Joy-Con
+ 004000000: SL Right Joy-Con + 00000000 04000000: SL Right Joy-Con
+ 008000000: SR Right Joy-Con + 00000000 08000000: SR Right Joy-Con
+ 010000000: Top button on Poké Ball Plus (Palma) controller + 00000000 10000000: Top button on Poké Ball Plus (Palma) controller
+ 020000000: Verification + 00000000 20000000: Verification
+ 040000000: B button on Left NES/HVC controller in Handheld mode + 00000000 40000000: B button on Left NES/HVC controller in Handheld mode
+ 080000000: Left C button in N64 controller + 00000000 80000000: Left C button in N64 controller
+ 100000000: Up C button in N64 controller + 00000001 00000000: Up C button in N64 controller
+ 200000000: Right C button in N64 controller + 00000002 00000000: Right C button in N64 controller
+ 400000000: Down C button in N64 controller + 00000004 00000000: Down C button in N64 controller
### Code Type 0xF0: Double Extended-Width Instruction ### Code Type 0xF0: Double Extended-Width Instruction
Code Type 0xF0 signals to the VM to treat the upper three nybbles of the first dword as instruction type, instead of just the upper nybble. Code Type 0xF0 signals to the VM to treat the upper three nybbles of the first dword as instruction type, instead of just the upper nybble.

4
emummc/.gitrepo vendored
View File

@ -6,7 +6,7 @@
[subrepo] [subrepo]
remote = https://github.com/m4xw/emummc remote = https://github.com/m4xw/emummc
branch = develop branch = develop
commit = 7522f1f6054a71bdff5beadee0302cead1235be3 commit = a8e5f1a184aeb8ba884166a1e4f386088d4a6cf1
parent = 0e2ef545f947d24c6add254874ab493ba84bbdc9 parent = 409c3cf9e190dbb65fe76570954939cbe8a5eca0
method = merge method = merge
cmdver = 0.4.1 cmdver = 0.4.1

2
emummc/README.md vendored
View File

@ -2,7 +2,7 @@
*A SDMMC driver replacement for Nintendo's Filesystem Services, by **m4xw*** *A SDMMC driver replacement for Nintendo's Filesystem Services, by **m4xw***
### Supported Horizon Versions ### Supported Horizon Versions
**1.0.0 - 20.0.0** **1.0.0 - 20.1.0**
## Features ## Features
* Arbitrary SDMMC backend selection * Arbitrary SDMMC backend selection

View File

@ -77,6 +77,8 @@
#include "offsets/1900_exfat.h" #include "offsets/1900_exfat.h"
#include "offsets/2000.h" #include "offsets/2000.h"
#include "offsets/2000_exfat.h" #include "offsets/2000_exfat.h"
#include "offsets/2010.h"
#include "offsets/2010_exfat.h"
#include "../utils/fatal.h" #include "../utils/fatal.h"
#define GET_OFFSET_STRUCT_NAME(vers) g_offsets##vers #define GET_OFFSET_STRUCT_NAME(vers) g_offsets##vers
@ -165,6 +167,8 @@ DEFINE_OFFSET_STRUCT(_1900);
DEFINE_OFFSET_STRUCT(_1900_EXFAT); DEFINE_OFFSET_STRUCT(_1900_EXFAT);
DEFINE_OFFSET_STRUCT(_2000); DEFINE_OFFSET_STRUCT(_2000);
DEFINE_OFFSET_STRUCT(_2000_EXFAT); DEFINE_OFFSET_STRUCT(_2000_EXFAT);
DEFINE_OFFSET_STRUCT(_2010);
DEFINE_OFFSET_STRUCT(_2010_EXFAT);
const fs_offsets_t *get_fs_offsets(enum FS_VER version) { const fs_offsets_t *get_fs_offsets(enum FS_VER version) {
switch (version) { switch (version) {
@ -290,6 +294,10 @@ const fs_offsets_t *get_fs_offsets(enum FS_VER version) {
return &(GET_OFFSET_STRUCT_NAME(_2000)); return &(GET_OFFSET_STRUCT_NAME(_2000));
case FS_VER_20_0_0_EXFAT: case FS_VER_20_0_0_EXFAT:
return &(GET_OFFSET_STRUCT_NAME(_2000_EXFAT)); return &(GET_OFFSET_STRUCT_NAME(_2000_EXFAT));
case FS_VER_20_1_0:
return &(GET_OFFSET_STRUCT_NAME(_2010));
case FS_VER_20_1_0_EXFAT:
return &(GET_OFFSET_STRUCT_NAME(_2010_EXFAT));
default: default:
fatal_abort(Fatal_UnknownVersion); fatal_abort(Fatal_UnknownVersion);
} }

View File

@ -113,6 +113,9 @@ enum FS_VER
FS_VER_20_0_0, FS_VER_20_0_0,
FS_VER_20_0_0_EXFAT, FS_VER_20_0_0_EXFAT,
FS_VER_20_1_0,
FS_VER_20_1_0_EXFAT,
FS_VER_MAX, FS_VER_MAX,
}; };

59
emummc/source/FS/offsets/2010.h vendored Normal file
View File

@ -0,0 +1,59 @@
/*
* Copyright (c) 2019 m4xw <m4x@m4xw.net>
* 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 <http://www.gnu.org/licenses/>.
*/
#ifndef __FS_2010_H__
#define __FS_2010_H__
// Accessor vtable getters
#define FS_OFFSET_2010_SDMMC_ACCESSOR_GC 0x1A7DB0
#define FS_OFFSET_2010_SDMMC_ACCESSOR_SD 0x1AA130
#define FS_OFFSET_2010_SDMMC_ACCESSOR_NAND 0x1A8560
// Hooks
#define FS_OFFSET_2010_SDMMC_WRAPPER_READ 0x1A3C20
#define FS_OFFSET_2010_SDMMC_WRAPPER_WRITE 0x1A3C80
#define FS_OFFSET_2010_RTLD 0x2B594
#define FS_OFFSET_2010_RTLD_DESTINATION ((uintptr_t)(INT64_C(-0x4C)))
#define FS_OFFSET_2010_CLKRST_SET_MIN_V_CLK_RATE 0x1C6150
// Misc funcs
#define FS_OFFSET_2010_LOCK_MUTEX 0x19CD80
#define FS_OFFSET_2010_UNLOCK_MUTEX 0x19CDD0
#define FS_OFFSET_2010_SDMMC_WRAPPER_CONTROLLER_OPEN 0x1A3BE0
#define FS_OFFSET_2010_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x1A3C00
// Misc Data
#define FS_OFFSET_2010_SD_MUTEX 0xFF5408
#define FS_OFFSET_2010_NAND_MUTEX 0xFF0CF0
#define FS_OFFSET_2010_ACTIVE_PARTITION 0xFF0D30
#define FS_OFFSET_2010_SDMMC_DAS_HANDLE 0xFD2B08
// NOPs
#define FS_OFFSET_2010_SD_DAS_INIT 0x289F4
// Nintendo Paths
#define FS_OFFSET_2010_NINTENDO_PATHS \
{ \
{.opcode_reg = 3, .adrp_offset = 0x0006DB14, .add_rel_offset = 0x00000004}, \
{.opcode_reg = 3, .adrp_offset = 0x0007CE1C, .add_rel_offset = 0x00000004}, \
{.opcode_reg = 4, .adrp_offset = 0x00084A08, .add_rel_offset = 0x00000004}, \
{.opcode_reg = 4, .adrp_offset = 0x0009AE48, .add_rel_offset = 0x00000004}, \
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
}
#endif // __FS_2010_H__

59
emummc/source/FS/offsets/2010_exfat.h vendored Normal file
View File

@ -0,0 +1,59 @@
/*
* Copyright (c) 2019 m4xw <m4x@m4xw.net>
* 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 <http://www.gnu.org/licenses/>.
*/
#ifndef __FS_2010_EXFAT_H__
#define __FS_2010_EXFAT_H__
// Accessor vtable getters
#define FS_OFFSET_2010_EXFAT_SDMMC_ACCESSOR_GC 0x1B36D0
#define FS_OFFSET_2010_EXFAT_SDMMC_ACCESSOR_SD 0x1B5A50
#define FS_OFFSET_2010_EXFAT_SDMMC_ACCESSOR_NAND 0x1B3E80
// Hooks
#define FS_OFFSET_2010_EXFAT_SDMMC_WRAPPER_READ 0x1AF540
#define FS_OFFSET_2010_EXFAT_SDMMC_WRAPPER_WRITE 0x1AF5A0
#define FS_OFFSET_2010_EXFAT_RTLD 0x2B594
#define FS_OFFSET_2010_EXFAT_RTLD_DESTINATION ((uintptr_t)(INT64_C(-0x4C)))
#define FS_OFFSET_2010_EXFAT_CLKRST_SET_MIN_V_CLK_RATE 0x1D1A70
// Misc funcs
#define FS_OFFSET_2010_EXFAT_LOCK_MUTEX 0x1A86A0
#define FS_OFFSET_2010_EXFAT_UNLOCK_MUTEX 0x1A86F0
#define FS_OFFSET_2010_EXFAT_SDMMC_WRAPPER_CONTROLLER_OPEN 0x1AF500
#define FS_OFFSET_2010_EXFAT_SDMMC_WRAPPER_CONTROLLER_CLOSE 0x1AF520
// Misc Data
#define FS_OFFSET_2010_EXFAT_SD_MUTEX 0x1006408
#define FS_OFFSET_2010_EXFAT_NAND_MUTEX 0x1001CF0
#define FS_OFFSET_2010_EXFAT_ACTIVE_PARTITION 0x1001D30
#define FS_OFFSET_2010_EXFAT_SDMMC_DAS_HANDLE 0xFDFB08
// NOPs
#define FS_OFFSET_2010_EXFAT_SD_DAS_INIT 0x289F4
// Nintendo Paths
#define FS_OFFSET_2010_EXFAT_NINTENDO_PATHS \
{ \
{.opcode_reg = 3, .adrp_offset = 0x0006DB14, .add_rel_offset = 0x00000004}, \
{.opcode_reg = 3, .adrp_offset = 0x0007CE1C, .add_rel_offset = 0x00000004}, \
{.opcode_reg = 4, .adrp_offset = 0x00084A08, .add_rel_offset = 0x00000004}, \
{.opcode_reg = 4, .adrp_offset = 0x0009AE48, .add_rel_offset = 0x00000004}, \
{.opcode_reg = 0, .adrp_offset = 0, .add_rel_offset = 0}, \
}
#endif // __FS_2010_EXFAT_H__

View File

@ -183,6 +183,9 @@ namespace ams::nxboot {
FsVersion_20_0_0, FsVersion_20_0_0,
FsVersion_20_0_0_Exfat, FsVersion_20_0_0_Exfat,
FsVersion_20_1_0,
FsVersion_20_1_0_Exfat,
FsVersion_Count, FsVersion_Count,
}; };
@ -278,6 +281,9 @@ namespace ams::nxboot {
{ 0x63, 0x54, 0x96, 0x9E, 0x60, 0xA7, 0x97, 0x7B }, /* FsVersion_20_0_0 */ { 0x63, 0x54, 0x96, 0x9E, 0x60, 0xA7, 0x97, 0x7B }, /* FsVersion_20_0_0 */
{ 0x47, 0x41, 0x07, 0x10, 0x65, 0x4F, 0xA4, 0x3F }, /* FsVersion_20_0_0_Exfat */ { 0x47, 0x41, 0x07, 0x10, 0x65, 0x4F, 0xA4, 0x3F }, /* FsVersion_20_0_0_Exfat */
{ 0xED, 0x34, 0xB4, 0x50, 0x58, 0x4A, 0x5B, 0x43 }, /* FsVersion_20_1_0 */
{ 0xA5, 0x1A, 0xA4, 0x92, 0x6C, 0x41, 0x87, 0x59 }, /* FsVersion_20_1_0_Exfat */
}; };
const InitialProcessBinaryHeader *FindInitialProcessBinary(const pkg2::Package2Header *header, const u8 *data, ams::TargetFirmware target_firmware) { const InitialProcessBinaryHeader *FindInitialProcessBinary(const pkg2::Package2Header *header, const u8 *data, ams::TargetFirmware target_firmware) {
@ -668,11 +674,13 @@ namespace ams::nxboot {
AddPatch(fs_meta, 0x17A9A0, NogcPatch1, sizeof(NogcPatch1)); AddPatch(fs_meta, 0x17A9A0, NogcPatch1, sizeof(NogcPatch1));
break; break;
case FsVersion_20_0_0: case FsVersion_20_0_0:
case FsVersion_20_1_0:
AddPatch(fs_meta, 0x1A7E25, NogcPatch0, sizeof(NogcPatch0)); AddPatch(fs_meta, 0x1A7E25, NogcPatch0, sizeof(NogcPatch0));
AddPatch(fs_meta, 0x1A8025, NogcPatch0, sizeof(NogcPatch0)); AddPatch(fs_meta, 0x1A8025, NogcPatch0, sizeof(NogcPatch0));
AddPatch(fs_meta, 0x17C250, NogcPatch1, sizeof(NogcPatch1)); AddPatch(fs_meta, 0x17C250, NogcPatch1, sizeof(NogcPatch1));
break; break;
case FsVersion_20_0_0_Exfat: case FsVersion_20_0_0_Exfat:
case FsVersion_20_1_0_Exfat:
AddPatch(fs_meta, 0x1B3745, NogcPatch0, sizeof(NogcPatch0)); AddPatch(fs_meta, 0x1B3745, NogcPatch0, sizeof(NogcPatch0));
AddPatch(fs_meta, 0x1B3945, NogcPatch0, sizeof(NogcPatch0)); AddPatch(fs_meta, 0x1B3945, NogcPatch0, sizeof(NogcPatch0));
AddPatch(fs_meta, 0x187B70, NogcPatch1, sizeof(NogcPatch1)); AddPatch(fs_meta, 0x187B70, NogcPatch1, sizeof(NogcPatch1));

BIN
img/np++.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -6,7 +6,7 @@
[subrepo] [subrepo]
remote = https://github.com/Atmosphere-NX/Atmosphere-libs remote = https://github.com/Atmosphere-NX/Atmosphere-libs
branch = master branch = master
commit = 9e8cbe3faa4604e9ae162546d13a74755ce30667 commit = 0f72b2ceba36c4255763d79ec48575ceb41d2539
parent = 4d4f0ba96876d20e505c7aa11c9bf215f276dd8b parent = 77603bf7e54cc2717ec38c0c3fc98621c78ff642
method = merge method = merge
cmdver = 0.4.1 cmdver = 0.4.1

View File

@ -116,7 +116,9 @@ namespace ams::kern::arch::arm {
u32 ipriorityr[NumLocalInterrupts / 4]; u32 ipriorityr[NumLocalInterrupts / 4];
u32 itargetsr[NumLocalInterrupts / 4]; u32 itargetsr[NumLocalInterrupts / 4];
u32 icfgr[NumLocalInterrupts / 16]; u32 icfgr[NumLocalInterrupts / 16];
u32 spendsgir[4];
}; };
static_assert(sizeof(LocalState{}.spendsgir) == sizeof(GicDistributor{}.spendsgir));
struct GlobalState { struct GlobalState {
u32 isenabler[NumGlobalInterrupts / 32]; u32 isenabler[NumGlobalInterrupts / 32];

View File

@ -113,6 +113,11 @@ namespace ams::kern::arch::arm {
constexpr size_t Offset = 0; constexpr size_t Offset = 0;
state->icfgr[i] = m_gicd->icfgr[i + Offset]; state->icfgr[i] = m_gicd->icfgr[i + Offset];
} }
/* Save spendsgir. */
for (size_t i = 0; i < util::size(state->spendsgir); ++i) {
state->spendsgir[i] = m_gicd->spendsgir[i];
}
} }
void KInterruptController::SaveGlobal(GlobalState *state) const { void KInterruptController::SaveGlobal(GlobalState *state) const {
@ -168,6 +173,11 @@ namespace ams::kern::arch::arm {
m_gicd->icenabler[i + Offset] = 0xFFFFFFFF; m_gicd->icenabler[i + Offset] = 0xFFFFFFFF;
m_gicd->isenabler[i + Offset] = state->isenabler[i]; m_gicd->isenabler[i + Offset] = state->isenabler[i];
} }
/* Restore spendsgir. */
for (size_t i = 0; i < util::size(state->spendsgir); ++i) {
m_gicd->spendsgir[i] = state->spendsgir[i];
}
} }
void KInterruptController::RestoreGlobal(const GlobalState *state) const { void KInterruptController::RestoreGlobal(const GlobalState *state) const {

View File

@ -112,7 +112,7 @@ namespace ams::kern::arch::arm64::cpu {
class KCoreBarrierInterruptHandler : public KInterruptHandler { class KCoreBarrierInterruptHandler : public KInterruptHandler {
private: private:
util::Atomic<u64> m_target_cores; util::Atomic<u64> m_target_cores;
KSpinLock m_lock; KLightLock m_lock;
public: public:
constexpr KCoreBarrierInterruptHandler() : KInterruptHandler(), m_target_cores(0), m_lock() { /* ... */ } constexpr KCoreBarrierInterruptHandler() : KInterruptHandler(), m_target_cores(0), m_lock() { /* ... */ }
@ -123,11 +123,8 @@ namespace ams::kern::arch::arm64::cpu {
} }
void SynchronizeCores(u64 core_mask) { void SynchronizeCores(u64 core_mask) {
/* Disable dispatch while we synchronize. */
KScopedDisableDispatch dd;
/* Acquire exclusive access to ourselves. */ /* Acquire exclusive access to ourselves. */
KScopedSpinLock lk(m_lock); KScopedLightLock lk(m_lock);
/* If necessary, force synchronization with other cores. */ /* If necessary, force synchronization with other cores. */
if (const u64 other_cores_mask = core_mask & ~(1ul << GetCurrentCoreId()); other_cores_mask != 0) { if (const u64 other_cores_mask = core_mask & ~(1ul << GetCurrentCoreId()); other_cores_mask != 0) {

View File

@ -524,6 +524,14 @@ namespace ams::kern::board::nintendo::nx {
/* Ensure that all cores get to this point before continuing. */ /* Ensure that all cores get to this point before continuing. */
cpu::SynchronizeAllCores(); cpu::SynchronizeAllCores();
/* Wait 100us before continuing. */
{
const s64 timeout = KHardwareTimer::GetTick() + ams::svc::Tick(TimeSpan::FromMicroSeconds(100));
while (KHardwareTimer::GetTick() < timeout) {
__asm__ __volatile__("" ::: "memory");
}
}
/* Save the interrupt manager's state. */ /* Save the interrupt manager's state. */
Kernel::GetInterruptManager().Save(core_id); Kernel::GetInterruptManager().Save(core_id);

View File

@ -926,6 +926,7 @@
HANDLER(GameCardLastAwakenFailureResult, 732, GameCardDetailedErrorInfo, FieldType_NumericU32, FieldFlag_None ) \ HANDLER(GameCardLastAwakenFailureResult, 732, GameCardDetailedErrorInfo, FieldType_NumericU32, FieldFlag_None ) \
HANDLER(GameCardInsertedTimestamp, 733, GameCardDetailedErrorInfo, FieldType_NumericI64, FieldFlag_None ) \ HANDLER(GameCardInsertedTimestamp, 733, GameCardDetailedErrorInfo, FieldType_NumericI64, FieldFlag_None ) \
HANDLER(GameCardPreviousInsertedTimestamp, 734, GameCardDetailedErrorInfo, FieldType_NumericI64, FieldFlag_None ) \ HANDLER(GameCardPreviousInsertedTimestamp, 734, GameCardDetailedErrorInfo, FieldType_NumericI64, FieldFlag_None ) \
HANDLER(WlanChipResetTriggered, 735, WlanInfo, FieldType_Bool, FieldFlag_None ) \
HANDLER(TestStringNx, 1000, TestNx, FieldType_String, FieldFlag_None ) \ HANDLER(TestStringNx, 1000, TestNx, FieldType_String, FieldFlag_None ) \
HANDLER(BoostModeCurrentLimit, 1001, BatteryChargeInfo, FieldType_NumericI32, FieldFlag_None ) \ HANDLER(BoostModeCurrentLimit, 1001, BatteryChargeInfo, FieldType_NumericI32, FieldFlag_None ) \
HANDLER(ChargeConfiguration, 1002, BatteryChargeInfo, FieldType_NumericI32, FieldFlag_None ) \ HANDLER(ChargeConfiguration, 1002, BatteryChargeInfo, FieldType_NumericI32, FieldFlag_None ) \

View File

@ -89,6 +89,7 @@ namespace ams::hos {
Version_19_0_1 = ::ams::TargetFirmware_19_0_1, Version_19_0_1 = ::ams::TargetFirmware_19_0_1,
Version_20_0_0 = ::ams::TargetFirmware_20_0_0, Version_20_0_0 = ::ams::TargetFirmware_20_0_0,
Version_20_0_1 = ::ams::TargetFirmware_20_0_1, Version_20_0_1 = ::ams::TargetFirmware_20_0_1,
Version_20_1_0 = ::ams::TargetFirmware_20_1_0,
Version_Current = ::ams::TargetFirmware_Current, Version_Current = ::ams::TargetFirmware_Current,

View File

@ -17,10 +17,10 @@
#define ATMOSPHERE_RELEASE_VERSION_MAJOR 1 #define ATMOSPHERE_RELEASE_VERSION_MAJOR 1
#define ATMOSPHERE_RELEASE_VERSION_MINOR 9 #define ATMOSPHERE_RELEASE_VERSION_MINOR 9
#define ATMOSPHERE_RELEASE_VERSION_MICRO 0 #define ATMOSPHERE_RELEASE_VERSION_MICRO 1
#define ATMOSPHERE_RELEASE_VERSION ATMOSPHERE_RELEASE_VERSION_MAJOR, ATMOSPHERE_RELEASE_VERSION_MINOR, ATMOSPHERE_RELEASE_VERSION_MICRO #define ATMOSPHERE_RELEASE_VERSION ATMOSPHERE_RELEASE_VERSION_MAJOR, ATMOSPHERE_RELEASE_VERSION_MINOR, ATMOSPHERE_RELEASE_VERSION_MICRO
#define ATMOSPHERE_SUPPORTED_HOS_VERSION_MAJOR 20 #define ATMOSPHERE_SUPPORTED_HOS_VERSION_MAJOR 20
#define ATMOSPHERE_SUPPORTED_HOS_VERSION_MINOR 0 #define ATMOSPHERE_SUPPORTED_HOS_VERSION_MINOR 1
#define ATMOSPHERE_SUPPORTED_HOS_VERSION_MICRO 0 #define ATMOSPHERE_SUPPORTED_HOS_VERSION_MICRO 0

View File

@ -87,8 +87,9 @@
#define ATMOSPHERE_TARGET_FIRMWARE_19_0_1 ATMOSPHERE_TARGET_FIRMWARE(19, 0, 1) #define ATMOSPHERE_TARGET_FIRMWARE_19_0_1 ATMOSPHERE_TARGET_FIRMWARE(19, 0, 1)
#define ATMOSPHERE_TARGET_FIRMWARE_20_0_0 ATMOSPHERE_TARGET_FIRMWARE(20, 0, 0) #define ATMOSPHERE_TARGET_FIRMWARE_20_0_0 ATMOSPHERE_TARGET_FIRMWARE(20, 0, 0)
#define ATMOSPHERE_TARGET_FIRMWARE_20_0_1 ATMOSPHERE_TARGET_FIRMWARE(20, 0, 1) #define ATMOSPHERE_TARGET_FIRMWARE_20_0_1 ATMOSPHERE_TARGET_FIRMWARE(20, 0, 1)
#define ATMOSPHERE_TARGET_FIRMWARE_20_1_0 ATMOSPHERE_TARGET_FIRMWARE(20, 1, 0)
#define ATMOSPHERE_TARGET_FIRMWARE_CURRENT ATMOSPHERE_TARGET_FIRMWARE_20_0_1 #define ATMOSPHERE_TARGET_FIRMWARE_CURRENT ATMOSPHERE_TARGET_FIRMWARE_20_1_0
#define ATMOSPHERE_TARGET_FIRMWARE_MIN ATMOSPHERE_TARGET_FIRMWARE(0, 0, 0) #define ATMOSPHERE_TARGET_FIRMWARE_MIN ATMOSPHERE_TARGET_FIRMWARE(0, 0, 0)
#define ATMOSPHERE_TARGET_FIRMWARE_MAX ATMOSPHERE_TARGET_FIRMWARE_CURRENT #define ATMOSPHERE_TARGET_FIRMWARE_MAX ATMOSPHERE_TARGET_FIRMWARE_CURRENT
@ -168,6 +169,7 @@ namespace ams {
TargetFirmware_19_0_1 = ATMOSPHERE_TARGET_FIRMWARE_19_0_1, TargetFirmware_19_0_1 = ATMOSPHERE_TARGET_FIRMWARE_19_0_1,
TargetFirmware_20_0_0 = ATMOSPHERE_TARGET_FIRMWARE_20_0_0, TargetFirmware_20_0_0 = ATMOSPHERE_TARGET_FIRMWARE_20_0_0,
TargetFirmware_20_0_1 = ATMOSPHERE_TARGET_FIRMWARE_20_0_1, TargetFirmware_20_0_1 = ATMOSPHERE_TARGET_FIRMWARE_20_0_1,
TargetFirmware_20_1_0 = ATMOSPHERE_TARGET_FIRMWARE_20_1_0,
TargetFirmware_Current = ATMOSPHERE_TARGET_FIRMWARE_CURRENT, TargetFirmware_Current = ATMOSPHERE_TARGET_FIRMWARE_CURRENT,

View File

@ -74,6 +74,11 @@ constexpr inline const EmbeddedPatchEntry Usb30ForceEnablePatches_20_0_0[] = {
{ 0x7090, "\x20\x00\x80\x52\xC0\x03\x5F\xD6", 8 }, { 0x7090, "\x20\x00\x80\x52\xC0\x03\x5F\xD6", 8 },
}; };
constexpr inline const EmbeddedPatchEntry Usb30ForceEnablePatches_20_1_0[] = {
{ 0x7010, "\x20\x00\x80\x52\xC0\x03\x5F\xD6", 8 },
{ 0x7090, "\x20\x00\x80\x52\xC0\x03\x5F\xD6", 8 },
};
constexpr inline const EmbeddedPatch Usb30ForceEnablePatches[] = { constexpr inline const EmbeddedPatch Usb30ForceEnablePatches[] = {
{ ParseModuleId("C0D3F4E87E8B0FE9BBE9F1968A20767F3DC08E03"), util::size(Usb30ForceEnablePatches_9_0_0), Usb30ForceEnablePatches_9_0_0 }, { ParseModuleId("C0D3F4E87E8B0FE9BBE9F1968A20767F3DC08E03"), util::size(Usb30ForceEnablePatches_9_0_0), Usb30ForceEnablePatches_9_0_0 },
{ ParseModuleId("B9C700CA8335F8BAA0D2041D8D09F772890BA988"), util::size(Usb30ForceEnablePatches_10_0_0), Usb30ForceEnablePatches_10_0_0 }, { ParseModuleId("B9C700CA8335F8BAA0D2041D8D09F772890BA988"), util::size(Usb30ForceEnablePatches_10_0_0), Usb30ForceEnablePatches_10_0_0 },
@ -88,4 +93,5 @@ constexpr inline const EmbeddedPatch Usb30ForceEnablePatches[] = {
{ ParseModuleId("4F21AE15E814FA46515C0401BB23D4F7ADCBF3F4"), util::size(Usb30ForceEnablePatches_18_0_0), Usb30ForceEnablePatches_18_0_0 }, /* 18.0.0 */ { ParseModuleId("4F21AE15E814FA46515C0401BB23D4F7ADCBF3F4"), util::size(Usb30ForceEnablePatches_18_0_0), Usb30ForceEnablePatches_18_0_0 }, /* 18.0.0 */
{ ParseModuleId("54BB9BB32C958E02752DC5E4AE8D016BFE1F5418"), util::size(Usb30ForceEnablePatches_19_0_0), Usb30ForceEnablePatches_19_0_0 }, /* 19.0.0 */ { ParseModuleId("54BB9BB32C958E02752DC5E4AE8D016BFE1F5418"), util::size(Usb30ForceEnablePatches_19_0_0), Usb30ForceEnablePatches_19_0_0 }, /* 19.0.0 */
{ ParseModuleId("40E80E7442C0DFC985315E6F9E8C77229818AC0F"), util::size(Usb30ForceEnablePatches_20_0_0), Usb30ForceEnablePatches_20_0_0 }, /* 20.0.0 */ { ParseModuleId("40E80E7442C0DFC985315E6F9E8C77229818AC0F"), util::size(Usb30ForceEnablePatches_20_0_0), Usb30ForceEnablePatches_20_0_0 }, /* 20.0.0 */
{ ParseModuleId("A5EF8D22EDF8A384E4135270ED596C1D2D524159"), util::size(Usb30ForceEnablePatches_20_1_0), Usb30ForceEnablePatches_20_1_0 }, /* 20.1.0 - 20.1.1 */
}; };