SaltyNX Switch: Difference between revisions
More actions
Created page with "{{Infobox Switch Homebrews |title=SaltyNX |image=saltynxswitch.png |description=Background process for the Nintendo Switch for file/code modification |author=masagrator |lastupdated=2023/04/02 |type=Other Apps |version=0.5.2 |license=Mixed |download=https://dlhb.gamebrew.org/switchhomebrews/saltynxswitch.7z |website=https://gbatemp.net/threads/saltynx-discussion-thread.579051/ |source=https://github.com/masagrator/SaltyNX |donation=https://ko-fi.com/masagrator }} {{#seo:..." |
1.8.1 |
||
| (62 intermediate revisions by 2 users not shown) | |||
| Line 4: | Line 4: | ||
|description=Background process for the Nintendo Switch for file/code modification | |description=Background process for the Nintendo Switch for file/code modification | ||
|author=masagrator | |author=masagrator | ||
|lastupdated= | |lastupdated=2026/05/12 | ||
|type= | |type=Plugins | ||
|version= | |version=1.8.1 | ||
|license=Mixed | |license=Mixed | ||
|download=https://dlhb.gamebrew.org/switchhomebrews/saltynxswitch.7z | |download=https://dlhb.gamebrew.org/switchhomebrews/saltynxswitch.7z | ||
| Line 13: | Line 13: | ||
|donation=https://ko-fi.com/masagrator | |donation=https://ko-fi.com/masagrator | ||
}} | }} | ||
SaltyNX is a process running in the background that allows for code injection and modification. It is utilized by various tools such as ReverseNX-Tool, [[ReverseNX-RT Switch|ReverseNX-RT]], and [[Status Monitor Overlay Switch|Status Monitor Overlay]] in conjunction with [[NX-FPS Switch|NX-FPS]], [[UnityGraphics Switch|UnityGraphics]], and several Smash mods. | |||
SaltyNX is a process running in the background that allows for code injection and modification. It is utilized by various tools such as ReverseNX-Tool, [[ReverseNX-RT Switch|ReverseNX-RT]], and Status Monitor in conjunction with [[NX-FPS Switch|NX-FPS]], UnityGraphics, and several Smash mods. | |||
This is a based on shinyquagsire23's [https://github.com/shinyquagsire23/SaltyNX SaltyNX] with includes many QoL improvements and beside plugins support also supports patches. | |||
Since 0.7.0 version NX-FPS and ReverseNX-RT are an intergral part of SaltyNX Core. This allows us to run them in 64-bit games not compatible with plugins. Since 1.0.0 32-bit games are supported (external plugins are not supported for them). | |||
'''Caution:''' | |||
* | *It is required to have FW installed at least 10.0.0 version | ||
* | *No technical support for anything else than stock Atmosphere. | ||
* | *Using it in online games such as Splatoon 3 can lead to ban as it injects custom code, be aware of that. | ||
== Installation == | |||
'''Notes:''' If you have [[NX-FPS Switch|NX-FPS]] and an older version of [[ReverseNX-RT Switch|ReverseNX-RT]] installed, make sure you delete NX-FPS.elf and ReverseNX-RT.elf ffrom SaltySD/plugins folder. | |||
= | How to install: | ||
* Atmosphere >=0.10.1 - Put folders from archive to root of your sdcard. | |||
* Atmosphere <=0.9.4 and any other CFW - Rename <code>contents</code> folder to <code>titles</code>. | |||
* SX OS - Remember to rename <code>atmosphere</code> folder to <code>sxos</code>. | |||
* Remember to restart Switch. | |||
* In case of any issues after updating already existing SaltyNX setup, remove whole SaltySD folder and put fresh one from release. | |||
Patches pattern: | |||
* | * filename is a function symbol with filetype <code>.asm64</code> for 64-bit games, <code>.asm32</code> for 32-bit games, | ||
* | * inside file write with hex editor instructions that you want to put into this function, | ||
* | * put this file either to <code>SaltySD/patches</code> to make it work for every game, or to <code>SaltySD/patches/*titleid*</code> to make it work for specific game. | ||
* | * Examples of such patches can be find [https://github.com/masagrator/SaltyNX-Patches HERE]. | ||
For additional functions you need [[SaltyNX-Tool Switch|SaltyNX-Tool]]. | |||
==Compatibility== | |||
It is required to have FW installed at least 10.0.0 version. | |||
No technical support for: Atmosphere forks, SX OS, Kosmos, ReinX. | |||
==Known issues== | |||
* Cheats using HEAP+offset address instead of MAIN+offset address chain may not work properly. | |||
==Known | |||
* Cheats using | |||
==Changelog== | ==Changelog== | ||
'''1.8.1''' | |||
* Reduce amount of FS sessions to 1 to fix an issue with session manager's session exhaustion | |||
'''1.8.0''' | |||
* IPC redesign | |||
** completely remove old libnx code from sysmodule | |||
*** main reason for using it was to retrieve sdmc handle that can still work after passing to Core, with how current libnx works it is not possible to do that | |||
*** but this was causing rare issues with homebrew where FS would "forget" about process when trying to write to/read from sdcard, resulting in random process hanging. This happened only when multiple processes tried to do this at the same time. This change should technically fix the issue. | |||
*** function for retrieving sdmc handle from sysmodule is now stubbed | |||
** Add new IPC functions that are just wrappers around libc I/O functions that are exposed by Core (so plugins shouldn't be affected by this change as long as they didn't try to retrieve sdmc handle manually - which was not officially supported) | |||
** Rewrite most of IPC functions so they work only when request comes from Application with injected Core | |||
** Logging was redesigned for those calls | |||
** Since now most of I/O heavy lifting was moved to sysmodule, Cores got smaller | |||
* Remove most of c++ unwinding and abort stuff to reduce sysmodule size | |||
** This way - after redesigning IPC - sysmodule RAM usage is bigger only by 12 kB | |||
'''1.7.5''' | |||
* Core: | |||
** 32-bit Core now has properly implemented support for generating Armv8-a 32-bit code instead of being forced to armv6k, thanks to that we can use less instructions to achieve the same thing | |||
** 32-bit Core now properly recognizes alignment of SharedMemory so compiler properly optimizes instructions accessing it instead of taking worst case approach | |||
** NX-FPS: | |||
*** Remove most of repetetive code | |||
*** Cache more frequently values returned by weakly linked function calls | |||
*** Avoid using float divisions in functions that are called multiple times in one frame | |||
* Sysmodule: | |||
** Apply proper fix instead of workaround for SM | |||
** Fix an overflow in internal display pixel clock calculation which resulted in wrong reported refresh rate for overclocked displays (was not an issue in stock SaltyNX because overclocking internal displays is unsupported) | |||
'''1.7.4''' | |||
* Expose dock DP lane count via IPC (necessary to introduce some changes in FPSLocker). | |||
* Don't block max refresh rate to 75 Hz in case of detecting HBR mode in 3rd party dock with active 4 DP lanes. | |||
'''1.7.3''' | |||
* Properly fix an issue with GetAllModuleInfo function introduced in 20.x SDK instead of using workaround (Thanks to [https://github.com/nvnprogram @nvnprogram] for solution). This function is mainly used by Unity 6 games. | |||
** Since I was asked to add this adnotation as the same function is used to detect if Splatoon 3 has injected modules. | |||
* Warning | |||
** Using SaltyNX in online games can lead to ban. | |||
* Not that I got any report personally, but it's very obvious from how it works it's a ban bait in online games, especially first party. | |||
'''1.7.2''' | |||
* Fixed an issue with Unreal Engine games not setting properly on boot Fake Docked mode saved with ReverseNX-RT. | |||
** Issue comes from engine strict order in processing notifications, OperationMode must be processed before PerformanceMode. | |||
'''1.7.1''' | |||
* Fix elf plugins support broken in 1.7.0 release | |||
** This also fixed issues with loading elf plugins to all retail games that were added as exceptions, so now those games are fully compatible with SaltyNX instead of partially compatible: | |||
*** Alien: Isolation | |||
*** Company of Heroes Collection | |||
*** EA SPORTS FC 24 | |||
*** GRID: Autosport | |||
*** Immortals Fenyx Rising | |||
*** Luigi's Mansion 3 | |||
*** Mario Strikers: Battle League | |||
*** Olympic Games Tokyo 2020 – The Official Video Game | |||
*** Plants vs. Zombies: Battle for Neighborville | |||
*** Stubbs the Zombie in Rebel Without a Pulse | |||
*** The Lara Croft Collection | |||
'''1.7.0''' | |||
* Reduced sysmodule RAM usage from 748 kB to 428 kB without removing any functionality (this is like the hard limit without doing some optimization shenanigans or reducing functionality, ram usage is now completely independent from Core's size) | |||
* Reduce Cores sizes by 20% | |||
'''1.6.2''' | |||
* Fix focus detection for games with multiple programs (f.e. The Long Dark with DLC) | |||
** When switching to new program, SaltyNX while game was running was reporting it as out of focus so "60Hz in HOME Menu" function was broken. | |||
* Add support for reading resolutions from Vulkan's Scissor functions (Similar to nvn, reported as Viewport) | |||
** It fixes an issue with some games not reporting resolutions, f.e. Blades of Time | |||
'''1.6.1''' | |||
* Fix an issue with some games not reporting file read speed (f.e. Saints Row The Third) | |||
** Replaced a function pointer for reading file that is used when GlobalFileDataCache is enabled. | |||
* Use cloned pdmqry session as I am using function calls that don't need active session to work. | |||
** This way there is still the same amount of free sessions available. | |||
'''1.6.0''' | |||
* Added compatibility for Atmosphere 1.10.0+. | |||
** Older SaltyNX releases can have random issues when using with Atmosphere 1.10.0 and newer. | |||
** This release is backwards compatible so you can use it with older Atmosphere too. | |||
* Streamlined compiling Core and Bootstrap so 32-bit and 64-bit share now the same source code with few ifdefs | |||
** Because this is a big change, it may have introduced some bug I am not aware of. | |||
'''1.5.9''' | |||
* Change method for retrieving focus of Application. | |||
** It doesn't change anything in Core so perfect compatibility is maintained. | |||
** Now CPU usage doesn't spike drastically while some games are running, causing sysmodule to be randomly unresponsive - if user decides to enable <code>60 HZ in HOME Menu</code> in FPSLocker. | |||
'''1.5.8''' | |||
* Remove exposing focus state. | |||
* Was causing compatibility issues with some games like Super Mario Galaxy or Trails in the Sky 1st. | |||
* "60 Hz in HOME Menu" from FPSLocker goes back to using old method. | |||
'''1.5.7''' | |||
* Check focus state only when notification is received instead on every frame. | |||
'''1.5.6''' | |||
* Change method of how game's focus state is retrieved. | |||
** This allows us to ditch old code for finding focus state of game, fixing an issue with rampaging CPU core in some games when they were out of focus IF user enabled "60 Hz in HOME Menu" option in FPSLocker. | |||
** Now Core also exposes game's current focus state so other developers can use it (This doesn't inform if game was paused or not, this is solely retrieving its focus state - look at libnx <code>AppletFocusState</code> enum in applet.h for more informations). | |||
* Change method of forcing game into pause (FPSLocker's <code>Halt unfocused game</code>), now Core only manages how game should handle focus state, leaving to kernel maintaining game in pause state which should have better compatibility than previous method. | |||
'''1.5.5''' | |||
* Stop reporting resolutions that have height higher than 1440 pixels. | |||
'''1.5.4''' | |||
* Add support for reading resolutions from <code>nvnCommandBufferSetScissor</code> and <code>nvnCommandBufferSetScissors</code>, resolutions are pushed as Viewport. Any resolution passed to Scissor(s) is ignored that was the same as last resolution pushed via <code>nvnCommandBufferSetViewport</code> and <code>nvnCommandBufferSetViewports</code>. This fixes an issue with reading resolution in games on Pokemon Engine which are using Scissors for dynamic resolution. | |||
* Core32 now is using hard float ABI, making it faster and smaller. | |||
* Add to toolbox.json version of sysmodule so <code>Sysmodules 1.4.0</code>+ overlay can show properly sysmodule's version. | |||
'''1.5.3''' | |||
* Fixed a bug in 64-bit Core with FPSLocker patches that were using negative offsets in addresses (fixes an issue with WARRIORS OROCHI 4 / 無双OROCHI3 patches). | |||
'''1.5.2''' | |||
* Add support for changing in real time amount of buffers in compatible NVN games (Requires FPSLocker 3.0.1+). | |||
'''1.5.1-beta2''' | |||
* Bring back original max brightness for Switch OLED when refresh rate is set below 60 Hz. | |||
* Change colors for Switch OLED's 50 Hz at low range of brightness to better match 60 Hz colors. | |||
'''1.5.1-beta1''' | |||
* This release focuses on fixing compatibility issues with games in Exceptions. | |||
* Because it changes how some crucial functions are working, it needs to be tested if it doesn't break any game that was working before. | |||
* Games that were not compatible up to 1.5.0 but are now with 1.5.1 Beta: | |||
** Death Road to Canada | |||
** Donkey Kong Country: Tropical Freeze | |||
** Stubbs the Zombie in Rebel Without a Pulse (game has hardcoded sizes, requires exefs patch to reduce 1.5GB general buffer by 2MB - added patches for versions 1.0.0 and 1.0.3) | |||
** Olympic Games Tokyo 2020 – The Official Video Game™ (game has hardcoded sizes, requires exefs patch to reduce ~1.4GB general buffer by 2MB - added patches for versions 1.0.0 and 1.0.2 <code>EUR</code> + 1.0.9 <code>Asia</code>) | |||
** Splatoon 3 | |||
'''1.5.0''' | |||
* Add support for next generation of FPSLocker patches introduced in FPSLocker 3.0.0 release. | |||
* Fix compatibility with Unity 6 games (Hollow Knight Silksong, Disney Dreamlight Valley 1.18.0). | |||
* NX-FPS: report resolutions only with width higher than 160 px. | |||
* FPSLocker patch is now applied every frame in handheld instead of every second. This can cause crashes with some old patches on game's boot, it can be solved by removing patch in FPSLocker, downloading new config with FPSLocker 3.0.0+ and creating from it new patch. | |||
* With each new release "Debug_files.zip" will be included for easier debugging of specific release version. | |||
'''1.4.8''' | |||
* Fix a bug introduced in 1.4.3 release with underclocked OLED not readjusting colors after waking from sleep. | |||
'''1.4.7''' | |||
* Fixed a bug in vulkan layer, causing crash in <code>Until Then</code> game. | |||
'''1.4.6''' | |||
* Share how many frames were generated by game (this fixes an issue with Status Monitor "FPS Graph" wrongly detecting paused games for brief moments, update Status Monitor to get proper support) | |||
'''1.4.5''' | |||
* Fix reporting doubled FPS value in Crypt of the NecroDancer. | |||
* Shadow update 07.08.2025 22:05 GMT: Apply more general fix for this issue instead of per game. | |||
'''1.4.4''' | |||
* Fix an issue where GetDefaultDisplayResolution could return 0x0 in some cases, leading to game crash. | |||
'''1.4.3''' | |||
* Add option to always force 60 Hz when in HOME Menu while Display Sync is turned on (requires FPSLocker 2.3.1+). | |||
* Add support for overriding Default Display Resolution (Requires ReverseNX-RT 2.3.0+). | |||
* Fix an issue for V1 and V2 models which in docked mode would report 0Hz if user was not using display sync | |||
* Fix ReverseNX-RT not working in CelDamage HD. | |||
* Shadow update 05.08.2025 07:16 GMT: Fixed an issue where disabling system control in ReverseNX-RT didn't update custom DDR in game. | |||
'''1.4.2''' | |||
* Fix an issue with Red Dead Redemption not detecting properly if it's in docked mode or handheld for NX-FPS internal use, causing FPS lock issues in docked mode. | |||
* Optimize dumping resolutions. | |||
'''1.4.1a''' | |||
* Fix an issue where handheld will retain expected refresh rate from docked mode if handheld mode has no FPS Target set in FPSLocker while it's in docked mode. | |||
'''1.4.1''' | |||
* Enable hardware floating-point instructions in Core32 for better performance in 32-bit games, but still use the soft-float calling conventions for compatibility reasons. | |||
'''1.4.0''' | |||
* Read separately FPS targets for docked and handheld from FPSLocker save (requires FPSLocker 2.3.0+). | |||
* Add SaltyNX version to logs of sysmodule and Cores. | |||
* Fix an issue with sysmodule not injecting Core anymore to next games if Core initialization failed which resulted in game crash before Core had a chance to close connection. | |||
* Improve NX-FPS's PFPS stat reporting. | |||
* Read separate docked overclocking settings for 720p (requires FPSLocker 2.3.0+). | |||
* Now game read speed in Core is opt-out instead of opt-in (to get game read speed use Status Monitor Overlay 1.2.0+). | |||
* Fix some FPSLocker patches not working with 32-bit games. | |||
'''1.3.1''' | |||
* Separate display sync for handheld and docked (Requires FPSLocker 2.2.1+ for proper support). | |||
* Fix memory leak related to reading external display's config (it was crashing system). | |||
* Give an option to measure game files read speed if filestats.flag exists. | |||
'''1.3.0''' | |||
* Add support for overclocking compatible external display's refresh rate up to 120 Hz. | |||
* Add support for downclocking OLED internal display refresh rate down to 45 Hz. | |||
* Add support for downclocking Retro Remake SUPER5 refresh rate down to 40 Hz (with initial support for other Retro Remake displays). | |||
* Fix an issue with not clearing shared memory after application is closed, resulting in tools such as Status Monitor and FPSLocker reporting false values. | |||
* Requires FPSLocker 2.2.0 and newer to properly utilize new functions. Its readme also has more informations about specific issues related to new functions. | |||
* Shadow update 12.07.2025 17:09 GMT: Fixed an issue with improperly reporting link rate in some situations. | |||
* Shadow update 13.07.2025 05:01 GMT: Fixed an issue with crash when trying to open config file that is already opened by another process. | |||
'''1.2.7''' | |||
*Fix crash in some units when going to sleep mode (bug introduced in 1.2.6). | |||
'''1.2.6''' | |||
* Read Docked settings from ini file instead of EDID dump (this is a needed step to introduce proper docked display overclocking in future). | |||
** Requires FPSLocker 2.1.5+ for support, old settings will be overriden by raw EDID dump | |||
* Move to reading EDID with already fixed libnx. | |||
'''1.2.5''' | |||
*Add option to force game into custom made suspend when in Home Menu (requires FPSLocker 2.1.3+). | |||
'''1.2.3''' | |||
* Reduce size of Core32 by 15% and Core by 35% which allows us to make sysmodule take 64kB less RAM. | |||
* Allow changing amount of buffers in Vulkan games (requires FPSLocker 1.2.2+). | |||
* Fix an issue with some games overreporting frames (120 instead of 60), such as Hades. | |||
* Fix an issue where very few Erista units had constant image stutters and loading times increased since 1.2.0 release. | |||
'''1.2.2''' | |||
* Fixed an old bug where games with big .bss segment were booting significantly longer than other games (For example games using Regista or LucaSystem engine were booting 30-40 seconds. With this fix it's now less than 5 seconds). | |||
* Sysmodule log now prints info how much time have passed since sysmodule booted. | |||
* Minor sysmodule optimizations | |||
'''1.2.0''' | |||
* Add support for changing refresh rates in docked mode from 40 up to 60 Hz. | |||
* Sysmodule now supports newest libnx. | |||
* Core is now completely independent from new libnx versions. | |||
* Math formula for changing refresh rate in handheld mode was drastically improved. | |||
* In NX-FPS now various functions related to pushing frames to display share common function for counting FPS, which results in avoiding situations where different APIs could have different issues. | |||
* Refresh rate is written to NX-FPS -> displaySync pointer whenever game runs with display sync turned on. | |||
* Now SaltyNX disabled in SaltyNX-Tool won't cause anymore issues with dmnt.gen2 when attaching with monitor wait application. | |||
* Thanks to all people who were testing this for the last 3 weeks. | |||
'''1.1.1''' | |||
* ReverseNX-RT | |||
** Fix issue with The Legend of Zelda: Echoes of Wisdom compatibility. | |||
** Fix issue with Unravel Two compatibility. | |||
'''1.1.0''' | |||
* Sysmodule: | |||
** Migrated compilation from libnx_min to official libnx. | |||
** Fixed an issue with running game's BuildID not read when dmnt.gen2 is active. | |||
* Core and Core32: | |||
** Added support for reading ReverseNX-RT settings. Requires using ReverseNX-RT 2.1.0+ (ReverseNX-Tool will no longer be updated). | |||
** ReverseNX-RT: now GetDefaultDisplayResolution will return 1920x1080 for forced docked mode only when user is in fact in handheld mode. | |||
* Edit: 21.11.2024 19:45 GMT - shadow update, because I used wrong Core with previous zip. | |||
'''1.0.6''' | |||
* Fix a bug introduced in 1.0.0 release that blocked FPSLocker patches from working in games utilizing Vulkan. | |||
* Fix a bug where if 32-bit game was using skyline plugin next to SaltyNX Core, Core was patching SVCs inside skyline plugin instead of nnSDK (this doesn't prevent crash in mods like CTGPDX, from this release it's purely skyline plugin's fault that must be fixed by their devs. More: [https://github.com/masagrator/SaltyNX/issues/60#issuecomment-2468668997 #60 (comment)]) | |||
'''1.0.4a2''' | |||
*Fixed a bug with exceptions.txt not working properly introduced in 1.0.4 release. | |||
'''1.0.4a''' | |||
*Fix bug introduced in 1.0.4 release where cheats were not moved back to original folder after successful injection of bootstrap. | |||
'''1.0.4''' | |||
* Increase GetThreadList timeout to 30 seconds instead of initial 10 seconds. | |||
* Small code refactor. | |||
'''1.0.3''' | |||
* Small code refactor to help me easier implement new stuff to Shared Memory. | |||
* Sysmodule is now writing regularly to shared memory display refresh rate so tools such as Status Monitor Overlay can better update stuff that rely on it without constantly connecting to sysmodule. | |||
* Fix a mistake where SaltyNX Core32 didn't have code for refresh rate/interval from 1.0.1 release. | |||
'''1.0.2''' | |||
*Fix (hopefully this time for good) random issue with 64-bit games crashing when logging is disabled. | |||
'''1.0.1''' | |||
*When FPSLocker patch tries to force 30 FPS lock, instead of using actual FPS lock it's now temporarily forcing interval to 2 and setting display refresh rate to 60 Hz to avoid stutterings. | |||
'''1.0.0''' | |||
* Add support for 32-bit games (this includes NX-FPS and ReverseNX, it excludes external plugins). | |||
* Fix issue with asm patches memory overflowing. | |||
* Fix bug in FPS lock not working properly in EGL and Vulkan games. | |||
'''0.1.0''' | |||
* Reduced sysmodule RAM usage by 28%. | |||
** Part of it was done by moving bootstrap code to separate file, so from now on "saltysd_bootstrap.elf" is included in SaltySD folder and is obligatory to have. | |||
* Fixed ReverseNX compatibility with Card-en-Ciel. | |||
'''0.9.4''' | |||
*Fix issue with cheats not loading at game's boot (applies only when SaltyNX injects Core). | |||
'''0.9.3''' | |||
*Disable ReverseNX-RT in The Legend of Zelda: Echoes of Wisdom, fixing game crashing when exiting. | |||
'''0.9.2''' | |||
*Fix resolution grabbing compability with Skyrim by changing accepted ratios from <1.3, 1.9) to <1.2, 1.9). | |||
'''0.9.1''' | |||
* Extended grabbed resolutions accepted ratios from <1.7, 1.9) to <1.3, 1.9). Fixes dynamic resolution detection issue with games using Id Tech engine like DOOM 2016, Doom Eternal, Wolfenstein 2. | |||
'''0.9.0''' | |||
* Add support for new iteration of Vulkan (fixes issues with Star Wars Bounty Hunter detection). | |||
* Add support for dumping resolutions from games using NVN. | |||
'''0.8.1''' | |||
* Updated display refresh rate change function which now sets it perfectly instead of "very close" (thanks to Cooler3D for sharing how to fix it). | |||
* Fix improperly implemented gatekeeping OLED model from using Display Sync via IPC | |||
* '''REMEMBER TO REMOVE NX-FPS.elf and ReverseNX-RT.elf FROM SaltySD/plugins FOLDER, otherwise there will be dragons!''' | |||
'''0.8.0''' | |||
* Common: | |||
** Moved from gnu++20 to gnu++23. | |||
* Sysmodule: | |||
** Added IPC allowing changing display refresh rate. | |||
** Added support for Display Sync option in Display setting available from FPSLocker 2.0.0. | |||
* Core / NX-FPS: | |||
** Added support for new generation of FPSLocker patches that added additional entries for 40, 45, 50 + 55 Hz and allows forcing FPS lock. | |||
** Now if any FPSLocker FPS target matches supported display refresh rate, NX-FPS FPS lock is automatically disabled to avoid stutterings (except if FPSLocker patch enforces FPS lock). | |||
* Fixed FPS Lock not being applied after disabling Display Sync. | |||
'''0.7.4''' | |||
*Reapply custom NVN interval in case if game avoids using NVN API to set it (fixes an issue with Call of Juarez: Gunslinger reapplying 30 FPS lock). | |||
'''0.7.3''' | |||
*Fix shared memory not being cleaned up upon going into hbmenu in title override (this caused ReverseNX-RT overlay to show that ReverseNX was active while it was not). | |||
'''0.7.2''' | |||
* Fix compability issues with updated rtld's ModuleObject struct (fixes crash in Tomb Raider I-III Remastered). | |||
* Add Donkey Kong Country: Tropical Freeze to exceptions (heap issues from second level). | |||
* Eliminate some potential deadlocks in sysmodule. | |||
* Updated in sysmodule retrieving BID from games with updated RTLD (such as Tomb Raider I-III Remastered). | |||
* Removed some deadlocks from sysmodule. | |||
* REMEMBER TO REMOVE NX-FPS.elf and ReverseNX-RT.elf FROM SaltySD/plugins FOLDER, otherwise there will be dragons! | |||
'''0.7.1''' | |||
* Apply hacky solution for not working replace imports in retail games using RELR. | |||
* Reduce size of Core by half. | |||
'''0.7.0''' | |||
* Support replacing imports in NROs (f.e. EA SPORTS FC 24). | |||
* Integrate NX-FPS and ReverseNX-RT plugins into Core source code, allows importing them to 64-bit games that have issues with plugins. In case of using plugins that replace imports for the same functions as those two are using, plugins have priority except for nn::ro::LoadModule. | |||
*Note | |||
** REMEMBER TO REMOVE NX-FPS.elf and ReverseNX-RT.elf FROM SaltySD/plugins FOLDER, otherwise there will be dragons! | |||
** Also remember about updating FPSLocker and ReverseNX-RT overlays! | |||
'''0.6.1''' | |||
*Fix compability issues with Atmosphere 1.5.5 by adding 128kB to fake heap. | |||
'''0.6.0''' | |||
* Reduce size of sysmodule executable by 2/3 and memory footprint of sysmodule by ~45%. | |||
* Add new flag for exceptions.txt - R. It will abort loading SaltyNX to game if game has romfs mod installed. This is to prevent collisions in case of Atmosphere taking memory from game when game has big number of romfs files and could prevent SaltyNX from injecting into game's memory. For now such a game doesn't exist, but Zelda Tears of The Kingdom is pretty close. This is futureproofing for possibility. | |||
'''0.5.2''' | '''0.5.2''' | ||
*Fix RTLD detection for getBID() in older games like LA Noire. | *Fix RTLD detection for getBID() in older games like LA Noire. | ||
'''0.5.1''' | '''0.5.1''' | ||
* Add function SaltySD_GetBID() to use with plugins to retrieve buildID of running game | * Add function SaltySD_GetBID() to use with plugins to retrieve buildID of running game. | ||
* Fix bug that was causing SharedMemory to not clean up upon detection of game that is 32-bit or in exceptions.txt (fixes bug in homebrew reading SharedMemory, f.e. Status Monitor Overlay, FPSLocker and ReverseNX-RT). Thanks to ~cucholix for finding this bug and testing fix. | * Fix bug that was causing SharedMemory to not clean up upon detection of game that is 32-bit or in exceptions.txt (fixes bug in homebrew reading SharedMemory, f.e. Status Monitor Overlay, FPSLocker and ReverseNX-RT). Thanks to ~cucholix for finding this bug and testing fix. | ||
'''0.5.0''' | '''0.5.0''' | ||
| Line 185: | Line 331: | ||
* SaltyNX is reserving 4096 byte block to use with any app. Default purpose is to allow exchanging data in real time between homebrew and plugins without using dmnt:cht/svcDebug | * SaltyNX is reserving 4096 byte block to use with any app. Default purpose is to allow exchanging data in real time between homebrew and plugins without using dmnt:cht/svcDebug | ||
'''0.4.0a-hotfix''' | '''0.4.0a-hotfix''' | ||
* Fixed sm compability issues with Atmosphere 0.19.0+ | * Fixed sm compability issues with Atmosphere 0.19.0+. | ||
* Thanks to [https://github.com/SciresM SciresM] for providing this fix - [https://github.com/masagrator/SaltyNX/commit/2e0bd1d4e23ae36574128eda24fe540c366d61e6 2e0bd1d]! | * Thanks to [https://github.com/SciresM SciresM] for providing this fix - [https://github.com/masagrator/SaltyNX/commit/2e0bd1d4e23ae36574128eda24fe540c366d61e6 2e0bd1d]! | ||
'''0.4.0a''' | '''0.4.0a''' | ||
* Resolves issue with nonconsistent heap reserving. | * Resolves issue with nonconsistent heap reserving. | ||
* FIFA 18-21 and Darksiders 2 are now working properly. | * FIFA 18-21 and Darksiders 2 are now working properly. | ||
* EDIT: It doesn't work correctly with M.16.2 (0.16.2 EXPERIMENTAL). Works on standard 0.16.2 | * EDIT: It doesn't work correctly with M.16.2 (0.16.2 EXPERIMENTAL). Works on standard 0.16.2. | ||
'''0.3.2a''' | '''0.3.2a''' | ||
*Fix loading plugins from titleid folders ef8ff67 | *Fix loading plugins from titleid folders ef8ff67. | ||
**It should now fix bug introduced from 0.3.0a with crashing plugins in Smash Bros and other games while using title specific plugins. | |||
* | *Include another exception - abort loading plugins if: <code>titleid & 0x1F00 != 0</code> | ||
'''0.3.1a''' | '''0.3.1a''' | ||
* Fixed rare case of crashing game when trying to load hbloader in title replacement mode by disabling bootstrap in this case | * Fixed rare case of crashing game when trying to load hbloader in title replacement mode by disabling bootstrap in this case. | ||
* 2MB fix reverted, as this was crashing Zelda BoTW | * 2MB fix reverted, as this was crashing Zelda BoTW. | ||
'''0.3.0a''' | '''0.3.0a''' | ||
*Add support for patches (more in readme) | *Add support for patches (more in readme). | ||
** Thanks to this it's possible to omit crashes with code injection if it doesn't need heap to work. | ** Thanks to this it's possible to omit crashes with code injection if it doesn't need heap to work. | ||
'''0.2.1a''' | '''0.2.1a''' | ||
*Reduced RAM usage by 320kB. | *Reduced RAM usage by 320kB. | ||
'''0.2a''' | '''0.2a''' | ||
* Ditched Spawner | * Ditched Spawner. | ||
* Rewrited Proc to be independent and now it's booted directly from CFW as sysmodule | * Rewrited Proc to be independent and now it's booted directly from CFW as sysmodule. | ||
** Thanks to this I could lower memory usage by 60 kB | ** Thanks to this I could lower memory usage by 60 kB. | ||
* Added option to disable log writing (writing is enabled by default) | * Added option to disable log writing (writing is enabled by default). | ||
* Added toolbox.json to bring correct support for sysmodules managers | * Added toolbox.json to bring correct support for sysmodules managers. | ||
* Because of ditching Spawner, KIP is not possible to use anymore. That's why we have now only one package using exefs. | * Because of ditching Spawner, KIP is not possible to use anymore. That's why we have now only one package using exefs. | ||
* saltysd_proc.elf from SaltySD folder is not used anymore, you can delete it. | * saltysd_proc.elf from SaltySD folder is not used anymore, you can delete it. | ||
'''0.2''' | '''0.2''' | ||
* Update solving compability issues with FW 10.0.0 for people using NSP.zip | * Update solving compability issues with FW 10.0.0 for people using NSP.zip. | ||
* Issue is not existing for KIP, so you don't need to update anything if you are using it (appstore is using NSP.zip) | * Issue is not existing for KIP, so you don't need to update anything if you are using it (appstore is using NSP.zip). | ||
* Delete folder 0100000000534C56 from contents/titles before updating. | * Delete folder 0100000000534C56 from contents/titles before updating. | ||
'''0.1a''' | '''0.1a''' | ||
| Line 223: | Line 368: | ||
'''0.1a''' | '''0.1a''' | ||
* First Release. | * First Release. | ||
==Credits== | |||
Thanks to: | |||
* Cooler3D. | |||
== External links == | == External links == | ||
* | * GitHub - https://github.com/masagrator/SaltyNX | ||
* | * GitHub - https://github.com/masagrator/SaltyNX-Tool | ||
* GBAtemp - https://gbatemp.net/threads/saltynx-discussion-thread.579051/ | |||
Latest revision as of 09:39, 15 May 2026
| SaltyNX | |
|---|---|
| General | |
| Author | masagrator |
| Type | Plugins |
| Version | 1.8.1 |
| License | Mixed |
| Last Updated | 2026/05/12 |
| Links | |
| Download | |
| Website | |
| Source | |
| Support Author | |
SaltyNX is a process running in the background that allows for code injection and modification. It is utilized by various tools such as ReverseNX-Tool, ReverseNX-RT, and Status Monitor Overlay in conjunction with NX-FPS, UnityGraphics, and several Smash mods.
This is a based on shinyquagsire23's SaltyNX with includes many QoL improvements and beside plugins support also supports patches.
Since 0.7.0 version NX-FPS and ReverseNX-RT are an intergral part of SaltyNX Core. This allows us to run them in 64-bit games not compatible with plugins. Since 1.0.0 32-bit games are supported (external plugins are not supported for them).
Caution:
- It is required to have FW installed at least 10.0.0 version
- No technical support for anything else than stock Atmosphere.
- Using it in online games such as Splatoon 3 can lead to ban as it injects custom code, be aware of that.
Installation
Notes: If you have NX-FPS and an older version of ReverseNX-RT installed, make sure you delete NX-FPS.elf and ReverseNX-RT.elf ffrom SaltySD/plugins folder.
How to install:
- Atmosphere >=0.10.1 - Put folders from archive to root of your sdcard.
- Atmosphere <=0.9.4 and any other CFW - Rename
contentsfolder totitles. - SX OS - Remember to rename
atmospherefolder tosxos. - Remember to restart Switch.
- In case of any issues after updating already existing SaltyNX setup, remove whole SaltySD folder and put fresh one from release.
Patches pattern:
- filename is a function symbol with filetype
.asm64for 64-bit games,.asm32for 32-bit games, - inside file write with hex editor instructions that you want to put into this function,
- put this file either to
SaltySD/patchesto make it work for every game, or toSaltySD/patches/*titleid*to make it work for specific game. - Examples of such patches can be find HERE.
For additional functions you need SaltyNX-Tool.
Compatibility
It is required to have FW installed at least 10.0.0 version.
No technical support for: Atmosphere forks, SX OS, Kosmos, ReinX.
Known issues
- Cheats using HEAP+offset address instead of MAIN+offset address chain may not work properly.
Changelog
1.8.1
- Reduce amount of FS sessions to 1 to fix an issue with session manager's session exhaustion
1.8.0
- IPC redesign
- completely remove old libnx code from sysmodule
- main reason for using it was to retrieve sdmc handle that can still work after passing to Core, with how current libnx works it is not possible to do that
- but this was causing rare issues with homebrew where FS would "forget" about process when trying to write to/read from sdcard, resulting in random process hanging. This happened only when multiple processes tried to do this at the same time. This change should technically fix the issue.
- function for retrieving sdmc handle from sysmodule is now stubbed
- Add new IPC functions that are just wrappers around libc I/O functions that are exposed by Core (so plugins shouldn't be affected by this change as long as they didn't try to retrieve sdmc handle manually - which was not officially supported)
- Rewrite most of IPC functions so they work only when request comes from Application with injected Core
- Logging was redesigned for those calls
- Since now most of I/O heavy lifting was moved to sysmodule, Cores got smaller
- completely remove old libnx code from sysmodule
- Remove most of c++ unwinding and abort stuff to reduce sysmodule size
- This way - after redesigning IPC - sysmodule RAM usage is bigger only by 12 kB
1.7.5
- Core:
- 32-bit Core now has properly implemented support for generating Armv8-a 32-bit code instead of being forced to armv6k, thanks to that we can use less instructions to achieve the same thing
- 32-bit Core now properly recognizes alignment of SharedMemory so compiler properly optimizes instructions accessing it instead of taking worst case approach
- NX-FPS:
- Remove most of repetetive code
- Cache more frequently values returned by weakly linked function calls
- Avoid using float divisions in functions that are called multiple times in one frame
- Sysmodule:
- Apply proper fix instead of workaround for SM
- Fix an overflow in internal display pixel clock calculation which resulted in wrong reported refresh rate for overclocked displays (was not an issue in stock SaltyNX because overclocking internal displays is unsupported)
1.7.4
- Expose dock DP lane count via IPC (necessary to introduce some changes in FPSLocker).
- Don't block max refresh rate to 75 Hz in case of detecting HBR mode in 3rd party dock with active 4 DP lanes.
1.7.3
- Properly fix an issue with GetAllModuleInfo function introduced in 20.x SDK instead of using workaround (Thanks to @nvnprogram for solution). This function is mainly used by Unity 6 games.
- Since I was asked to add this adnotation as the same function is used to detect if Splatoon 3 has injected modules.
- Warning
- Using SaltyNX in online games can lead to ban.
- Not that I got any report personally, but it's very obvious from how it works it's a ban bait in online games, especially first party.
1.7.2
- Fixed an issue with Unreal Engine games not setting properly on boot Fake Docked mode saved with ReverseNX-RT.
- Issue comes from engine strict order in processing notifications, OperationMode must be processed before PerformanceMode.
1.7.1
- Fix elf plugins support broken in 1.7.0 release
- This also fixed issues with loading elf plugins to all retail games that were added as exceptions, so now those games are fully compatible with SaltyNX instead of partially compatible:
- Alien: Isolation
- Company of Heroes Collection
- EA SPORTS FC 24
- GRID: Autosport
- Immortals Fenyx Rising
- Luigi's Mansion 3
- Mario Strikers: Battle League
- Olympic Games Tokyo 2020 – The Official Video Game
- Plants vs. Zombies: Battle for Neighborville
- Stubbs the Zombie in Rebel Without a Pulse
- The Lara Croft Collection
- This also fixed issues with loading elf plugins to all retail games that were added as exceptions, so now those games are fully compatible with SaltyNX instead of partially compatible:
1.7.0
- Reduced sysmodule RAM usage from 748 kB to 428 kB without removing any functionality (this is like the hard limit without doing some optimization shenanigans or reducing functionality, ram usage is now completely independent from Core's size)
- Reduce Cores sizes by 20%
1.6.2
- Fix focus detection for games with multiple programs (f.e. The Long Dark with DLC)
- When switching to new program, SaltyNX while game was running was reporting it as out of focus so "60Hz in HOME Menu" function was broken.
- Add support for reading resolutions from Vulkan's Scissor functions (Similar to nvn, reported as Viewport)
- It fixes an issue with some games not reporting resolutions, f.e. Blades of Time
1.6.1
- Fix an issue with some games not reporting file read speed (f.e. Saints Row The Third)
- Replaced a function pointer for reading file that is used when GlobalFileDataCache is enabled.
- Use cloned pdmqry session as I am using function calls that don't need active session to work.
- This way there is still the same amount of free sessions available.
1.6.0
- Added compatibility for Atmosphere 1.10.0+.
- Older SaltyNX releases can have random issues when using with Atmosphere 1.10.0 and newer.
- This release is backwards compatible so you can use it with older Atmosphere too.
- Streamlined compiling Core and Bootstrap so 32-bit and 64-bit share now the same source code with few ifdefs
- Because this is a big change, it may have introduced some bug I am not aware of.
1.5.9
- Change method for retrieving focus of Application.
- It doesn't change anything in Core so perfect compatibility is maintained.
- Now CPU usage doesn't spike drastically while some games are running, causing sysmodule to be randomly unresponsive - if user decides to enableÂ
60 HZ in HOME Menu in FPSLocker.
1.5.8
- Remove exposing focus state.
- Was causing compatibility issues with some games like Super Mario Galaxy or Trails in the Sky 1st.
- "60 Hz in HOME Menu" from FPSLocker goes back to using old method.
1.5.7
- Check focus state only when notification is received instead on every frame.
1.5.6
- Change method of how game's focus state is retrieved.
- This allows us to ditch old code for finding focus state of game, fixing an issue with rampaging CPU core in some games when they were out of focus IF user enabled "60 Hz in HOME Menu" option in FPSLocker.
- Now Core also exposes game's current focus state so other developers can use it (This doesn't inform if game was paused or not, this is solely retrieving its focus state - look at libnxÂ
AppletFocusState enum in applet.h for more informations).
- Change method of forcing game into pause (FPSLocker'sÂ
Halt unfocused game), now Core only manages how game should handle focus state, leaving to kernel maintaining game in pause state which should have better compatibility than previous method.
1.5.5
- Stop reporting resolutions that have height higher than 1440 pixels.
1.5.4
- Add support for reading resolutions from
nvnCommandBufferSetScissorandnvnCommandBufferSetScissors, resolutions are pushed as Viewport. Any resolution passed to Scissor(s) is ignored that was the same as last resolution pushed vianvnCommandBufferSetViewportandnvnCommandBufferSetViewports. This fixes an issue with reading resolution in games on Pokemon Engine which are using Scissors for dynamic resolution. - Core32 now is using hard float ABI, making it faster and smaller.
- Add to toolbox.json version of sysmodule so
Sysmodules 1.4.0+ overlay can show properly sysmodule's version.
1.5.3
- Fixed a bug in 64-bit Core with FPSLocker patches that were using negative offsets in addresses (fixes an issue with WARRIORS OROCHI 4 / 無双OROCHI3 patches).
1.5.2
- Add support for changing in real time amount of buffers in compatible NVN games (Requires FPSLocker 3.0.1+).
1.5.1-beta2
- Bring back original max brightness for Switch OLED when refresh rate is set below 60 Hz.
- Change colors for Switch OLED's 50 Hz at low range of brightness to better match 60 Hz colors.
1.5.1-beta1
- This release focuses on fixing compatibility issues with games in Exceptions.
- Because it changes how some crucial functions are working, it needs to be tested if it doesn't break any game that was working before.
- Games that were not compatible up to 1.5.0 but are now with 1.5.1 Beta:
- Death Road to Canada
- Donkey Kong Country: Tropical Freeze
- Stubbs the Zombie in Rebel Without a Pulse (game has hardcoded sizes, requires exefs patch to reduce 1.5GB general buffer by 2MB - added patches for versions 1.0.0 and 1.0.3)
- Olympic Games Tokyo 2020 – The Official Video Game™ (game has hardcoded sizes, requires exefs patch to reduce ~1.4GB general buffer by 2MB - added patches for versions 1.0.0 and 1.0.2
EUR+ 1.0.9Asia) - Splatoon 3
1.5.0
- Add support for next generation of FPSLocker patches introduced in FPSLocker 3.0.0 release.
- Fix compatibility with Unity 6 games (Hollow Knight Silksong, Disney Dreamlight Valley 1.18.0).
- NX-FPS: report resolutions only with width higher than 160 px.
- FPSLocker patch is now applied every frame in handheld instead of every second. This can cause crashes with some old patches on game's boot, it can be solved by removing patch in FPSLocker, downloading new config with FPSLocker 3.0.0+ and creating from it new patch.
- With each new release "Debug_files.zip" will be included for easier debugging of specific release version.
1.4.8
- Fix a bug introduced in 1.4.3 release with underclocked OLED not readjusting colors after waking from sleep.
1.4.7
- Fixed a bug in vulkan layer, causing crash in
Until Thengame.
1.4.6
- Share how many frames were generated by game (this fixes an issue with Status Monitor "FPS Graph" wrongly detecting paused games for brief moments, update Status Monitor to get proper support)
1.4.5
- Fix reporting doubled FPS value in Crypt of the NecroDancer.
- Shadow update 07.08.2025 22:05 GMT: Apply more general fix for this issue instead of per game.
1.4.4
- Fix an issue where GetDefaultDisplayResolution could return 0x0 in some cases, leading to game crash.
1.4.3
- Add option to always force 60 Hz when in HOME Menu while Display Sync is turned on (requires FPSLocker 2.3.1+).
- Add support for overriding Default Display Resolution (Requires ReverseNX-RT 2.3.0+).
- Fix an issue for V1 and V2 models which in docked mode would report 0Hz if user was not using display sync
- Fix ReverseNX-RT not working in CelDamage HD.
- Shadow update 05.08.2025 07:16 GMT: Fixed an issue where disabling system control in ReverseNX-RT didn't update custom DDR in game.
1.4.2
- Fix an issue with Red Dead Redemption not detecting properly if it's in docked mode or handheld for NX-FPS internal use, causing FPS lock issues in docked mode.
- Optimize dumping resolutions.
1.4.1a
- Fix an issue where handheld will retain expected refresh rate from docked mode if handheld mode has no FPS Target set in FPSLocker while it's in docked mode.
1.4.1
- Enable hardware floating-point instructions in Core32 for better performance in 32-bit games, but still use the soft-float calling conventions for compatibility reasons.
1.4.0
- Read separately FPS targets for docked and handheld from FPSLocker save (requires FPSLocker 2.3.0+).
- Add SaltyNX version to logs of sysmodule and Cores.
- Fix an issue with sysmodule not injecting Core anymore to next games if Core initialization failed which resulted in game crash before Core had a chance to close connection.
- Improve NX-FPS's PFPS stat reporting.
- Read separate docked overclocking settings for 720p (requires FPSLocker 2.3.0+).
- Now game read speed in Core is opt-out instead of opt-in (to get game read speed use Status Monitor Overlay 1.2.0+).
- Fix some FPSLocker patches not working with 32-bit games.
1.3.1
- Separate display sync for handheld and docked (Requires FPSLocker 2.2.1+ for proper support).
- Fix memory leak related to reading external display's config (it was crashing system).
- Give an option to measure game files read speed if filestats.flag exists.
1.3.0
- Add support for overclocking compatible external display's refresh rate up to 120 Hz.
- Add support for downclocking OLED internal display refresh rate down to 45 Hz.
- Add support for downclocking Retro Remake SUPER5 refresh rate down to 40 Hz (with initial support for other Retro Remake displays).
- Fix an issue with not clearing shared memory after application is closed, resulting in tools such as Status Monitor and FPSLocker reporting false values.
- Requires FPSLocker 2.2.0 and newer to properly utilize new functions. Its readme also has more informations about specific issues related to new functions.
- Shadow update 12.07.2025 17:09 GMT: Fixed an issue with improperly reporting link rate in some situations.
- Shadow update 13.07.2025 05:01 GMT: Fixed an issue with crash when trying to open config file that is already opened by another process.
1.2.7
- Fix crash in some units when going to sleep mode (bug introduced in 1.2.6).
1.2.6
- Read Docked settings from ini file instead of EDID dump (this is a needed step to introduce proper docked display overclocking in future).
- Requires FPSLocker 2.1.5+ for support, old settings will be overriden by raw EDID dump
- Move to reading EDID with already fixed libnx.
1.2.5
- Add option to force game into custom made suspend when in Home Menu (requires FPSLocker 2.1.3+).
1.2.3
- Reduce size of Core32 by 15% and Core by 35% which allows us to make sysmodule take 64kB less RAM.
- Allow changing amount of buffers in Vulkan games (requires FPSLocker 1.2.2+).
- Fix an issue with some games overreporting frames (120 instead of 60), such as Hades.
- Fix an issue where very few Erista units had constant image stutters and loading times increased since 1.2.0 release.
1.2.2
- Fixed an old bug where games with big .bss segment were booting significantly longer than other games (For example games using Regista or LucaSystem engine were booting 30-40 seconds. With this fix it's now less than 5 seconds).
- Sysmodule log now prints info how much time have passed since sysmodule booted.
- Minor sysmodule optimizations
1.2.0
- Add support for changing refresh rates in docked mode from 40 up to 60 Hz.
- Sysmodule now supports newest libnx.
- Core is now completely independent from new libnx versions.
- Math formula for changing refresh rate in handheld mode was drastically improved.
- In NX-FPS now various functions related to pushing frames to display share common function for counting FPS, which results in avoiding situations where different APIs could have different issues.
- Refresh rate is written to NX-FPS -> displaySync pointer whenever game runs with display sync turned on.
- Now SaltyNX disabled in SaltyNX-Tool won't cause anymore issues with dmnt.gen2 when attaching with monitor wait application.
- Thanks to all people who were testing this for the last 3 weeks.
1.1.1
- ReverseNX-RT
- Fix issue with The Legend of Zelda: Echoes of Wisdom compatibility.
- Fix issue with Unravel Two compatibility.
1.1.0
- Sysmodule:
- Migrated compilation from libnx_min to official libnx.
- Fixed an issue with running game's BuildID not read when dmnt.gen2 is active.
- Core and Core32:
- Added support for reading ReverseNX-RT settings. Requires using ReverseNX-RT 2.1.0+ (ReverseNX-Tool will no longer be updated).
- ReverseNX-RT: now GetDefaultDisplayResolution will return 1920x1080 for forced docked mode only when user is in fact in handheld mode.
- Edit: 21.11.2024 19:45 GMT - shadow update, because I used wrong Core with previous zip.
1.0.6
- Fix a bug introduced in 1.0.0 release that blocked FPSLocker patches from working in games utilizing Vulkan.
- Fix a bug where if 32-bit game was using skyline plugin next to SaltyNX Core, Core was patching SVCs inside skyline plugin instead of nnSDK (this doesn't prevent crash in mods like CTGPDX, from this release it's purely skyline plugin's fault that must be fixed by their devs. More: #60 (comment))
1.0.4a2
- Fixed a bug with exceptions.txt not working properly introduced in 1.0.4 release.
1.0.4a
- Fix bug introduced in 1.0.4 release where cheats were not moved back to original folder after successful injection of bootstrap.
1.0.4
- Increase GetThreadList timeout to 30 seconds instead of initial 10 seconds.
- Small code refactor.
1.0.3
- Small code refactor to help me easier implement new stuff to Shared Memory.
- Sysmodule is now writing regularly to shared memory display refresh rate so tools such as Status Monitor Overlay can better update stuff that rely on it without constantly connecting to sysmodule.
- Fix a mistake where SaltyNX Core32 didn't have code for refresh rate/interval from 1.0.1 release.
1.0.2
- Fix (hopefully this time for good) random issue with 64-bit games crashing when logging is disabled.
1.0.1
- When FPSLocker patch tries to force 30 FPS lock, instead of using actual FPS lock it's now temporarily forcing interval to 2 and setting display refresh rate to 60 Hz to avoid stutterings.
1.0.0
- Add support for 32-bit games (this includes NX-FPS and ReverseNX, it excludes external plugins).
- Fix issue with asm patches memory overflowing.
- Fix bug in FPS lock not working properly in EGL and Vulkan games.
0.1.0
- Reduced sysmodule RAM usage by 28%.
- Part of it was done by moving bootstrap code to separate file, so from now on "saltysd_bootstrap.elf" is included in SaltySD folder and is obligatory to have.
- Fixed ReverseNX compatibility with Card-en-Ciel.
0.9.4
- Fix issue with cheats not loading at game's boot (applies only when SaltyNX injects Core).
0.9.3
- Disable ReverseNX-RT in The Legend of Zelda: Echoes of Wisdom, fixing game crashing when exiting.
0.9.2
- Fix resolution grabbing compability with Skyrim by changing accepted ratios from <1.3, 1.9) to <1.2, 1.9).
0.9.1
- Extended grabbed resolutions accepted ratios from <1.7, 1.9) to <1.3, 1.9). Fixes dynamic resolution detection issue with games using Id Tech engine like DOOM 2016, Doom Eternal, Wolfenstein 2.
0.9.0
- Add support for new iteration of Vulkan (fixes issues with Star Wars Bounty Hunter detection).
- Add support for dumping resolutions from games using NVN.
0.8.1
- Updated display refresh rate change function which now sets it perfectly instead of "very close" (thanks to Cooler3D for sharing how to fix it).
- Fix improperly implemented gatekeeping OLED model from using Display Sync via IPC
- REMEMBER TO REMOVE NX-FPS.elf and ReverseNX-RT.elf FROM SaltySD/plugins FOLDER, otherwise there will be dragons!
0.8.0
- Common:
- Moved from gnu++20 to gnu++23.
- Sysmodule:
- Added IPC allowing changing display refresh rate.
- Added support for Display Sync option in Display setting available from FPSLocker 2.0.0.
- Core / NX-FPS:
- Added support for new generation of FPSLocker patches that added additional entries for 40, 45, 50 + 55 Hz and allows forcing FPS lock.
- Now if any FPSLocker FPS target matches supported display refresh rate, NX-FPS FPS lock is automatically disabled to avoid stutterings (except if FPSLocker patch enforces FPS lock).
- Fixed FPS Lock not being applied after disabling Display Sync.
0.7.4
- Reapply custom NVN interval in case if game avoids using NVN API to set it (fixes an issue with Call of Juarez: Gunslinger reapplying 30 FPS lock).
0.7.3
- Fix shared memory not being cleaned up upon going into hbmenu in title override (this caused ReverseNX-RT overlay to show that ReverseNX was active while it was not).
0.7.2
- Fix compability issues with updated rtld's ModuleObject struct (fixes crash in Tomb Raider I-III Remastered).
- Add Donkey Kong Country: Tropical Freeze to exceptions (heap issues from second level).
- Eliminate some potential deadlocks in sysmodule.
- Updated in sysmodule retrieving BID from games with updated RTLD (such as Tomb Raider I-III Remastered).
- Removed some deadlocks from sysmodule.
- REMEMBER TO REMOVE NX-FPS.elf and ReverseNX-RT.elf FROM SaltySD/plugins FOLDER, otherwise there will be dragons!
0.7.1
- Apply hacky solution for not working replace imports in retail games using RELR.
- Reduce size of Core by half.
0.7.0
- Support replacing imports in NROs (f.e. EA SPORTS FC 24).
- Integrate NX-FPS and ReverseNX-RT plugins into Core source code, allows importing them to 64-bit games that have issues with plugins. In case of using plugins that replace imports for the same functions as those two are using, plugins have priority except for nn::ro::LoadModule.
- Note
- REMEMBER TO REMOVE NX-FPS.elf and ReverseNX-RT.elf FROM SaltySD/plugins FOLDER, otherwise there will be dragons!
- Also remember about updating FPSLocker and ReverseNX-RT overlays!
0.6.1
- Fix compability issues with Atmosphere 1.5.5 by adding 128kB to fake heap.
0.6.0
- Reduce size of sysmodule executable by 2/3 and memory footprint of sysmodule by ~45%.
- Add new flag for exceptions.txt - R. It will abort loading SaltyNX to game if game has romfs mod installed. This is to prevent collisions in case of Atmosphere taking memory from game when game has big number of romfs files and could prevent SaltyNX from injecting into game's memory. For now such a game doesn't exist, but Zelda Tears of The Kingdom is pretty close. This is futureproofing for possibility.
0.5.2
- Fix RTLD detection for getBID() in older games like LA Noire.
0.5.1
- Add function SaltySD_GetBID() to use with plugins to retrieve buildID of running game.
- Fix bug that was causing SharedMemory to not clean up upon detection of game that is 32-bit or in exceptions.txt (fixes bug in homebrew reading SharedMemory, f.e. Status Monitor Overlay, FPSLocker and ReverseNX-RT). Thanks to ~cucholix for finding this bug and testing fix.
0.5.0
- Add SharedMemory 4096B block to use with plugins.
- SaltyNX is reserving 4096 byte block to use with any app. Default purpose is to allow exchanging data in real time between homebrew and plugins without using dmnt:cht/svcDebug
0.4.0a-hotfix
- Fixed sm compability issues with Atmosphere 0.19.0+.
- Thanks to SciresM for providing this fix - 2e0bd1d!
0.4.0a
- Resolves issue with nonconsistent heap reserving.
- FIFA 18-21 and Darksiders 2 are now working properly.
- EDIT: It doesn't work correctly with M.16.2 (0.16.2 EXPERIMENTAL). Works on standard 0.16.2.
0.3.2a
- Fix loading plugins from titleid folders ef8ff67.
- It should now fix bug introduced from 0.3.0a with crashing plugins in Smash Bros and other games while using title specific plugins.
- Include another exception - abort loading plugins if:
titleid & 0x1F00 != 0
0.3.1a
- Fixed rare case of crashing game when trying to load hbloader in title replacement mode by disabling bootstrap in this case.
- 2MB fix reverted, as this was crashing Zelda BoTW.
0.3.0a
- Add support for patches (more in readme).
- Thanks to this it's possible to omit crashes with code injection if it doesn't need heap to work.
0.2.1a
- Reduced RAM usage by 320kB.
0.2a
- Ditched Spawner.
- Rewrited Proc to be independent and now it's booted directly from CFW as sysmodule.
- Thanks to this I could lower memory usage by 60 kB.
- Added option to disable log writing (writing is enabled by default).
- Added toolbox.json to bring correct support for sysmodules managers.
- Because of ditching Spawner, KIP is not possible to use anymore. That's why we have now only one package using exefs.
- saltysd_proc.elf from SaltySD folder is not used anymore, you can delete it.
0.2
- Update solving compability issues with FW 10.0.0 for people using NSP.zip.
- Issue is not existing for KIP, so you don't need to update anything if you are using it (appstore is using NSP.zip).
- Delete folder 0100000000534C56 from contents/titles before updating.
0.1a 0.1.2a
- Implement hack to resolve issues with cheats in Atmosphere.
0.1.1a
- Now aborting bootstrapping if titleid is higher than 0x01FFFFFFFFFFE000.
0.1a
- First Release.
Credits
Thanks to:
- Cooler3D.