Added a "Global Custom Save Path" configuration option in the Filesystem settings.
Implemented a prioritized save-loading hierarchy: Global Path (if enabled) > Per-Game Custom Path > Default NAND.
Introduced a non-destructive migration tool that allows users to consolidate their existing saves into the new global location.
The migration tool specifically prioritizes per-game custom saves over NAND saves to ensure the most up-to-date data is preserved during consolidation.
The migration process is copy-only; no data is deleted from the source directories, ensuring absolute user data safety.
Maintained compatibility with the existing "Backup Saves to NAND" feature, ensuring saves continue to be mirrored internally if configured.
Signed-off-by: Collecting <collecting@noreply.localhost>
- Bumps HOS version from 20.1.5 to 21.0.0
- Updates the corresponding `VERSION_HASH`, `DISPLAY_VERSION`, and
`DISPLAY_TITLE` strings.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
- Add size validation before memcpy for Connect/Disconnect packets
- Allow empty data for Scan packets (Type 0) which have no payload
- Add debug logging for ScanResp packets including BSSID and results
- Fix MacAddress indexing to use .raw[] instead of [] operator
Signed-off-by: Zephyron <zephyron@citron-emu.org>
Handle error 2359-2618 (module 359, description 2618) gracefully
by logging a warning instead of crashing, similar to module 56.
This allows games like SSBU to continue execution when encountering
this error code.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
Fix crash in PinHandle when SMMU allocation fails and unmap queue is empty.
Previously, the code would log an error and continue looping indefinitely,
causing log spam and eventual crash.
- Free multiple handles from unmap queue (up to 100) before giving up
- Add maximum attempt counter to prevent infinite loops
- Return 0 gracefully when no more handles can be freed
- Add error handling in callers (Remap, MapBufferEx, MapBuffer) to check for
PinHandle failure and return NvResult::InsufficientMemory instead of using
invalid addresses
Signed-off-by: Zephyron <zephyron@citron-emu.org>
Fix crash in PinHandle when SMMU allocation fails and unmap queue is empty.
Previously, the code would log an error and continue looping indefinitely,
causing log spam and eventual crash. Now it returns 0 to fail gracefully.
Also fix incorrect handle check on line 219 - should check freeHandleDesc
instead of handle_description.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
- Add custom_save_paths map to Settings::Values
- Implement ReadCustomSavePathValues and SaveCustomSavePathValues in Config
- Update CreateSaveDataFactory to check for custom save paths
- Support per-game title ID save path overrides
Signed-off-by: Zephyron <zephyron@citron-emu.org>
- Replace socket option assertion failures with proper error returns
- Add WSAENOPROTOOPT/ENOPROTOOPT error handling
- Fix LINGER and option value size validation
- Add Network::Errno::OTHER translation
- Implement basic Nex service stub for error code 2306-0520
Fixes crashes in Minecraft and other games when encountering unsupported
socket operations or attempting to use Nintendo's online services.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
The TitleID check was broken due to using || operator which evaluated
to 1 instead of a title ID value, preventing the recovery mechanism
from working.
- Fix title_ids.h: Replace incorrect || expression with proper
LittleNightmares3Base constant (0x010066101A55A000)
- Update physical_core.cpp: Use GetBaseTitleID() to match both
base and update title ID variants
This now correctly identifies Little Nightmares 3 and enables the
recovery mechanism that sets PC to LR when detecting null pointer
execution loops.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
The PC < 0x1000 recovery mechanism introduced in commit fbb4f5c0
was causing issues for other games. This change restricts the recovery
to only apply when the title ID matches Little Nightmares 3.
- Add LittleNightmares3 title ID constant to title_ids.h
- Check program ID before applying PC return recovery in physical_core.cpp
- Recovery now only triggers for Little Nightmares 3 (010066101A55A800)
to avoid affecting other games
Fixes issues caused by the general PC return recovery in other titles.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
Major networking enhancements to improve multiplayer performance and
reduce desync issues in games like Mario Kart 8 Deluxe:
Network Performance:
- Add socket connection pooling in BSD service to reduce overhead
- Implement unreliable packet delivery for latency-sensitive game data
- Add packet reliability control for both ProxyPacket and LDNPacket
- Use ENET_PACKET_FLAG_UNSEQUENCED for small UDP packets (<1200 bytes)
Monitoring & Debugging:
- Add PacketStatistics struct to track sent/received/dropped packets
- Enhanced logging for proxy packet handling and socket lifecycle
- Periodic stats logging every 100 packets for diagnostics
Configuration:
- Update lobby_api_url and web_api_url to https://api.ynet-fun.xyz
- Add lobby API URL configuration support
Socket Management:
- Implement SocketPoolKey for efficient socket reuse
- Store domain/type/protocol info in FileDescriptor
- Max pool size limit (8 sockets per type) to prevent memory bloat
- Return closed sockets to pool when room is still connected
Protocol Updates:
- Add 'reliable' field to ProxyPacket and LDNPacket structures
- Update room.cpp packet handlers to respect reliability flags
- Maintain backward compatibility with default reliable=true
These changes significantly reduce packet latency for real-time game
traffic while maintaining reliability for control packets.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
Add support for the Skyline 32-bit modding framework by implementing
a code address offset and improving memory state verification.
Changes:
- Add CodeStartOffset constant (0x500000) applied to 32-bit code
address space types (Is32Bit and Is32BitNoMap) in KProcess::LoadFromMetadata
- Add debug logging for 32-bit syscall argument tracking in
SetProcessMemoryPermission, MapProcessCodeMemory, and
UnmapProcessCodeMemory wrapper functions
- Replace CheckMemoryStateContiguous with CheckMemoryState in
KPageTableBase::UnmapCodeMemory for more flexible memory state
verification
This implementation enables compatibility with:
- Skyline 32-bit modding framework
- CTGP-DX (Mario Kart 8 Deluxe mod)
- Other homebrew using 32-bit Skyline
Based on similar fixes in Ryujinx (commit 5e9678c8fe) and Eden emulator.
Co-authored-by: JPikachu <jpikachu.eden@gmail.com>
Co-authored-by: JPikachu <jpikachu@eden-emu.dev>
Signed-off-by: Zephyron <zephyron@citron-emu.org>
Initialize PollFD.revents field to prevent assertion failures when
copying from read buffer. The assertion was failing because revents
contained uninitialized data from the buffer.
Thanks to Dr.Stug for providing the logs that identified this issue.
Fixes assertion failure at core\hle\service\sockets\bsd.cpp:564
Signed-off-by: Zephyron <zephyron@citron-emu.org>
- Increased heap region from 8 GiB to 12 GiB
- Fixed memory manager page reference count allocation
- Made resource region sizing dynamic for >8GB DRAM
- Increased physical address space bits to support 16GB
Signed-off-by: Zephyron <zephyron@citron-emu.org>
- Add stubbed DeleteCacheStorage function to FSP_SRV service
- Return success instead of causing assertion failure
- Prevents userspace PANIC when games attempt to delete cache storage
Signed-off-by: Zephyron <zephyron@citron-emu.org>
Add proper recovery mechanism for null pointer execution (PC < 0x1000)
by returning from invalid function calls using the Link Register instead
of blindly continuing execution.
Fixes infinite crash loop in games like Little Nightmares III.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
Implements comprehensive NIM (Network Install Manager) services based on
the official Switch Brew documentation.
Changes:
- Added async interface classes: IAsyncValue, IAsyncResult,
IAsyncProgressResult, and IAsyncData for handling asynchronous operations
- Updated main nim service with all proper command names (commands 0-154)
- Replaced "Unknown" placeholders (84-134) with correct function names
- Added newer firmware commands (135-154) including download tasks,
application icon requests, and delivery info operations
- Fixed command 36: ListApplyDeltaTaskContentMeta (was duplicate name)
- Extended nim:shp service with Nintendo Account linking commands (600-601)
- Added nim:ecas command 5: GetCommonEcasSystemEventForReceivingBackgroundDownloadTask
- All services (nim, nim:eca, nim:shp, nim:ecas, ntc) verified and properly registered
This implementation accounts for all NIM-related functions across firmware
versions, providing proper stub handlers for emulator compatibility.
Reference: https://switchbrew.org/wiki/NIM_services
Signed-off-by: Zephyron <zephyron@citron-emu.org>
- Add parameter validation for joy_xpad_id, device_index, and npad_id
- Implement proper SixAxis resource manager integration with null checks
- Add safe fallback values to prevent crashes in motion sensor games
- Enhance error handling and logging for SixAxis sensor operations
- Address crashes in games like TOTK 1.4.2 that use motion sensors
Resolves SixAxis sensor crashes by following SwitchBrew HID service
specifications and adding proper parameter validation.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
Audio Core:
- Add support for splitter previous volume reset (REV 13+)
- Implement new audio processing time limits (REV 14-15)
- Add voice channel resource limits and effect processing v3
- Support float biquad filters for improved audio quality
- Enhance error handling to prevent audio system crashes
Android UI:
- Simplify FPS, RAM, and thermal indicator views
- Remove complex backgrounds and icons for cleaner display
- Reduce view sizes and improve text-based rendering
- Maintain color-coded status indicators for performance metrics
Core System:
- Improve file system save data space handling
- Enhance kernel synchronization error handling
- Add new error modules and result codes
- Fix potential infinite loops in handle operations
These changes improve audio processing capabilities while providing a cleaner,
more performant Android UI experience.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
Moved ZBCManager to `video_core/zbc_manager.cpp/h` for modularity. Added
`gl_zbc_clear.cpp/h` for efficient OpenGL color, depth, and stencil clears.
Updated `RasterizerOpenGL::Clear` to use ZBC with fallback. Added stencil
type validation. Fixed color mask and logging. Updated `CMakeLists.txt`.
Enhances performance and code organization.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
- Implement CreateInterruptEvent SVC function to resolve panic
- Add proper resource management with KScopedResourceReservation
- Use regular KEvent as placeholder for interrupt events
- Add proper cleanup with SCOPE_EXIT
- Include debug logging for troubleshooting
- Implement GetLaunchRequiredVersionUpgrade in IApplicationFunctions service
- Fix "Unknown / unimplemented function" error for command 210
- Return event handle instead of boolean to match Nintendo Switch API
- Use state_changed_event as placeholder until dedicated event is implemented
- Add function declaration to header file
Tested with Hollow Knight: Silksong - successfully boots.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
- Replace stubbed ZBCSetTable with comprehensive implementation
- Add parameter validation for format and type fields
- Implement detailed logging of ZBC color values for debugging
- Add proper documentation explaining ZBC (Zero Bandwidth Clear) functionality
- Handle color_ds and color_l2 arrays for GPU memory clearing operations
- Validate format parameter range (0-0xFF) and type parameter (0-1)
- Provide clear error handling for invalid parameters
- Add ZBCManager singleton class for global ZBC table management
- Implement ZBCQueryTable with full table lookup functionality
- Add thread-safe ZBC table storage with proper mutex protection
- Create ZBC namespace helper functions for GPU clearing operations
- Fix IoctlGpuCharacteristics struct size (0xA0) by correcting field types
- Add comprehensive logging and error handling for ZBC operations
- Enable ZBC table integration with GPU memory management system
- Store ZBC entries in both local device table and global manager
- Implement reference counting for proper ZBC entry lifecycle management
ZBC (Zero Bandwidth Clear) allows the GPU to perform efficient memory
clearing operations without requiring CPU bandwidth by storing clear
values in a dedicated table that can be referenced during rendering.
This implementation provides the foundation for zero-bandwidth clear
operations, allowing the GPU to efficiently clear color and depth
buffers using pre-defined values stored in the ZBC table.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
- Replace stubbed ZBCSetTable with comprehensive implementation
- Add parameter validation for format and type fields
- Implement detailed logging of ZBC color values for debugging
- Add proper documentation explaining ZBC (Zero Bandwidth Clear) functionality
- Handle color_ds and color_l2 arrays for GPU memory clearing operations
- Validate format parameter range (0-0xFF) and type parameter (0-1)
- Provide clear error handling for invalid parameters
ZBC (Zero Bandwidth Clear) allows the GPU to perform efficient memory
clearing operations without requiring CPU bandwidth by storing clear
values in a dedicated table that can be referenced during rendering.
Signed-off-by: Zephyron <zephyron@citron-emu.org>