The Switch 13.0.0 system update was released on September 15, 2021 (UTC). This Switch update was released for the following regions: ALL.

Security flaws fixed: <fill this in manually later, see the updatedetails page from the ninupdates-report page(s) once available for now>.

Change-log

Official ALL change-log:

  • Bluetooth® audio support was added.
  • Headphones, earbuds, speakers, and other audio devices that connect with Bluetooth can now be paired with Nintendo Switch family systems for audio output.
  • Bluetooth microphones are not supported.
  • Up to two compatible wireless controllers can be connected to the system while using Bluetooth audio.
  • Bluetooth audio cannot be used while local wireless communication is active.
  • For more information, see How to Pair and Manage Bluetooth Audio Devices.
  • “Update Dock” was added under System in System Settings for Nintendo Switch and Nintendo Switch – OLED Model systems, allowing for software updates to Nintendo Switch docks with a LAN port.
  • Dock software updates are not available for Nintendo Switch docks without a LAN port.
  • This feature was not added to Nintendo Switch Lite.
  • For more information, see How to Update the Dock Firmware.
  • “Maintain Internet Connection in Sleep Mode” was added under Sleep Mode in System Settings.
  • When this setting is enabled, systems with wired internet connections will maintain internet connection even while in sleep mode. This allows for software and add-on content to download to the system while the system is in sleep mode.
  • The setting is enabled by default.
  • When this setting is disabled, the system will connect to the internet only periodically, which decreases power consumption.
  • Note: Systems that are not updated to version 13.0.0 or later behave as if this setting is enabled.
  • The method to initiate “Calibrate Control Sticks” in System Settings was changed.
  • From System Settings, go to Controllers and Sensors, select Calibrate Control Sticks, then fully tilt the control stick in any one direction and keep it tilted for a few seconds to begin calibration.
  • Users can now view whether their wireless internet connection is using the 2.4 GHz or 5 GHz frequency band under “Connection Status” after selecting Internet in System Settings.
  • The Bluetooth® word mark and logos are registered trademarks owned by Bluetooth SIG, Inc. and any use of such marks by Nintendo is under license. Other trademarks and trade names are those of their respective owners.

System Titles

  • All sysmodules were updated, excluding stubs.
  • All SystemData were updated, except for: BrowserDll, both Dictionary SystemData, AvatarImage, Eula, UrlBlackList, ControllerIcon, ApplicationBlackList, FunctionBlackList.
  • All applets were updated, except for: miiEdit and all web-applets.
  • SystemData PlatformConfigAula and the SystemData for the Aula dock firmware were added.

The following sysmodules had IPC changes: usb, settings, bluetooth, bcat, hid, audio, wlan, pcv, account, ns, am, nim, btm, erpt, vi, npns, es, fs, ncm.

NPDM changes (see Services_API for the hosted service changes):

  • bcat: Access to acc:u1 was replaced with acc:e:u2.
  • friends, nim, pctl, eclct, sdb, olsc: Access to acc:u1 was replaced with acc:e:u1.
  • ptm, bsdsocket, hid, audio, wlan, nvservices, pcv, pcie, psc, safemode: Access to svcMapDeviceAddressSpace was removed.
  • hid: Access to rgltr was added.
  • audio: Access to btdrv and btm were added.
  • ns: Access to acc:e, ndrm:la, and ndrm:lu were added.
  • am: Access to mnpp:sys was added.
  • btm: Access to ovln:snd was added.
  • jit: Access to svcSynchronizePreemptionState was added.
  • olsc: Access to sprof:bg and sprof:sp were added.
  • playerSelect: Access to bcat:s was added.
  • photoViewer: Access to hwopus was removed.

RomFs changes:

  • ErrorMessage was updated.
  • Help was updated: "/legallines.htdocs/index.html" and the localization html under "/safe.htdocs/html/" was updated.
  • NgWord/NgWord2/NgWordT was updated.
  • LocalNews: message data was updated, and the following directories were added under "/image": "LnMinIntro_Aula", "LnSdAdvice_Aula", "LnSdIntro_Aula".
  • TimeZoneBinary: timezone data was updated. "/zoneinfo/posixrules" was removed.
  • FontKorean: the font was updated.
  • FirmwareDebugSettings, PlatformConfigIcosa, PlatformConfigHoag, PlatformConfigIcosaMariko: updated.
  • ControllerFirmware: updated "FirmwareInfo.csv", "TouchScreenFirmwareInfo.csv", "ukyosakyo_ep2_ota.bin". Added "FTS_33000510.fts256" and "FTS_98000004.ftb".
  • Various applet UI/gfx data was updated.

BootImagePackage

All files in RomFS were updated.

Kernel

  • Compiler upgrade to LLVM 11.1.
    • Most notably, certain code now emits "ands" rather than "and; and; tst" + "bfxil" patterns are more commonly used.
  • C++ language upgrade to C++17.
    • Slab heaps/object containers are now constant initialized, no longer constructed during .init_array.
  • Initialize0 changes:
    • KernelLdr now sends back the initial process binary address in state.
    • Initialize0 now uses a helper function for selecting random virtual regions, and now verifies KInitialPageTable->IsFree() before selecting regions.
    • Initialize0 now verifies that the initial process binary address is in correct place (pool partition), and sets global=initial address.
      • This global is now used where GetInitialProcessBinaryAddress() was used previously.
  • KPort limit increased to 0x180 from 0x100.
  • SvcMapDeviceAddressSpace() was removed.
    • Userland only ever used SvcMapDeviceAddressSpaceByForce and SvcMapDeviceAddressSpaceAligned, so this doesn't break any official software.
    • Map only allowed one page table to be allocated, only partially mapping the desired range if more than one would be used.
      • Similarly, it returned an output mapped size so a caller could continue mapping partially until the whole range was done, one page table at a time.
    • All parameters required to implement partial mapping have been removed, correspondingly.
      • No out_mapped_size, out_page_table_count, pt_limit parameters to any KDevicePageTable mapping functions any more.
      • UnlockForDevicePageTablePartialMap no longer takes in a partially-mapped size.
        • This code is simplified, since it is no longer possible to have a partially-mapped size other than zero.
  • The two new kernel objects/four new SVCs added in 11.0.0 are finally present/instantiated.
    • Prototypes for the new SVCs:
      • 0x39: Result CreateIoPool(Handle *out_handle, uint32_t which);
      • 0x3A: Result CreateIoRegion(Handle *out_handle, Handle io_pool, PhysicalAddress physical_address, size_t size, MemoryMapping mapping, MemoryPermission perm);
        • MemoryMapping is a new enum, 0 = IO, 1 = Uncached memory, 2 = Normal Memory.
      • 0x46: Result MapIoRegion(Handle region_handle, uintptr_t address, size_t size, MemoryPermission perm);
      • 0x47: Result UnmapIoRegion(Handle region_handle, uintptr_t address, size_t size);
    • These SVCs conceptually allow creating an object for mapping in certain physical address ranges at user-specified virtual addresses, without having to include the ranges in npdm/kip capabilities ahead of time.
      • The only allowed id right now is 0, which corresponds to PCIE_A2 (physical address range 0x12000000-0x1FFFFFFF).
  • KLightLock::Lock now uses simplified logic; KLightLock::LockSlowPath now returns a bool for whether the lock was acquired.
  • KWritableEvent was deleted.
    • Class tokens for types after KWritableEvent have been adjusted downwards to compensate (see mesosphere for class token generation algorithm).
    • Handles which were previously returned to KWritableEvent are now returned directly to KEvent.
    • KEvent has new boolean member to track whether the readable event has been destroyed.
    • KReadableEvent::Initialize now opens reference to the parent event, rather than inline in KEvent::Initialize.
  • KReadableEvent::Signal/Clear are no longer virtual functions.
  • KAutoObject no longer has virtual destructor.
    • This mostly means that base/deleting destructor no longer occur inside vtables.
  • New memory state (0x16/0x2016) "Coverage", currently not exposed via any SVCs.
  • A number of functions are now devirtualized when possible, indicating either the virtual functions (or the classes) were marked final.
    • KProcess::GetId()
    • KThread::GetId()
    • KSessionRequest::Finalize()
    • KInitialPageAllocator::Free()
  • KConditionVariable::WaitForAddress/KConditionalVariable::SignalToAddress are now static
  • KMemoryManager now operates on physical addresses instead of virtual addresses.
    • KMemoryManager::Initialize now iterates the physical tree rather than the virtual tree, when finding pool regions.
    • KMemoryManager::Allocate now returns a physical address instead of a virtual address.
    • KMemoryManager::Close now takes in a physical address instead of a virtual address.
    • KPageHeap now operates on physical addresses rather than virtual addresses.
      • New member stores the linear virtual address for the physical range the heap operates on.
    • KBlockInfo now size 0x10 instead of 0x20.
      • Before: struct { KBlockInfo *prev; KBlockInfo *next; size_t num_pages; KVirtualAddress address; }
      • Now: struct { KBlockInfo *next; u32 phys_address_page; u32 num_pages; };
      • phys_address_page is a KPhysicalAddress / PageSize, to ensure it fits in u32.
    • This halves memory requirements for KBlockInfos system-wide, effectively doubling the KPageGroup capacity.
    • Memory range helper object used by page table functions also now operates on physical addresses.
  • KPageTableBase no longer contains virtual memory region cache.
    • This was only used in KPageTableBase::MapPageGroupImpl to do ABORT_UNLESS(IsHeapVirtualAddress(...));
    • This abort is no longer present, likely because page groups are now physical blocks rather than virtual ones.
  • KPageTable::Unmap now incrementally frees pages, rather than freeing them all at once.
  • KHandleTableEntryInfo no longer stores object class token, KHandleTable::Add/Register no longer takes class token as argument.
    • This reduces KHandleTable size (and thus KProcess size) by 0x800.
  • The following types no longer have (unused) slab heaps:
    • KClientSession, KLightClientSession, KLightServerSession
  • A complete re-work/unification was done for the various kinds of thread waiting operations in the kernel.
    • Previously, there were a number of different ways to initiate and end waits, handled manually in each location by invoking thread->SetState(...);
    • Now, all waits use a common interface based around thread queue objects with virtual functions for the three kinds of supported waits.
    • Supported queue virtual functions:
      • void NotifyAvailable(KThread *waiting_thread, KSynchronizationObject *signaled_object, Result wait_result);
        • This is supported only by the queue used by WaitSynchronization, and sets the signaled object/sync'd index for the thread.
      • void EndWait(KThread *waiting_thread, Result wait_result);
        • This conceptually ends a wait "normally", usually without additional cleanup. This is exclusively called by kernel-handled wait codepaths.
      • void CancelWait(KThread *waiting_thread, Result wait_result, bool cancel_timer_task);
        • This conceptually ends a wait "by force", interrupting it regardless of normal wait completion.
          • This usually involves extra cleanup.
        • This is invoked by e.g. CancelSynchronization, thread termination, thread finalize, etc.
    • KThread::SetState is likely private now; it is called only by internal KThread functions.
    • KLightSession was notably reworked substantially to take advantage of the new unified wait semantics.
    • KSynchronizationObject::DumpWaiters() no longer exists.
  • KDebug is now substantially more careful about management of its process pointer.
    • New field "is_attached" explicitly tracks whether the KDebug is attached (instead of m_process != nullptr).
    • m_process replaced by a new helper object containing KProcess * and reference count.
      • Code which previously used the process field now opens/closes references on m_process_holder.
      • When m_process_holder's reference count hits zero, the process is closed and m_pointer is set to 1 instead of nullptr.
    • This makes the way KDebug treats the attached process's reference count much more correct/consistent.
      • In particular, "the KDebug is attached" now counts as one reference to the KProcess, no matter what the KDebug is doing with it.
  • Resource management has changed substantially.
    • Dynamic slabheaps no longer contain a pointer to an associated page allocator; instead, a page allocator is now passed as an argument to .Allocate().
    • There are new helper objects which contain a dynamic slab heap pointer and a page allocator pointer, used for conveniently referencing a slab/page resource pair.
      • There are now helper objects differentiating between KBlockInfo and KPageTableManager allocators for system/application context.
      • KPageTable now has a helper function to allocate a page from the KPageTableManager helper object.
    • Instead of allocating all unused pages to the page table page heap, all but 70 pages are allocated to the page table page heap.
    • When a new flag from the secure monitor is zero (this is always the case on retail), new logic for "dynamic resource expansion" is enabled.
      • In particular, this causes the helper objects for the system memory blocks, block infos, and page table managers to be set to the dynamic page allocator.
        • Thus, the last 70 unused pages are dynamically allocated to (system memory blocks, system block infos, system page table pages) on a first-come basis as the system uses these resources.
        • NOTE: There is no "free"-ing of these resources back to the unused page heap, once they've been allocated to a specific slab they will remain in that slab until reboot.
      • In addition, when allocating a KSession, KEvent, or KLightSession from the system resource limit fails, an object of the desired type will be allocated from the otherwise unused "gaps" in the slab region.
        • When allocating a KSession dynamically from gap-space, kernel also allocates two KSessionRequests from gap-space and frees them to the KSessionRequest slabheap.
        • Allocator for this uses an intrusive red black tree on in-place nodes in the gaps.
  • Minor changes to the atomic operations for slab heaps.
      • Slab heap initialization now panics if L1 cache is direct-mapped (1-way associative).
      • Slab heap allocation no longer issues a clrex on failure.
      • For types supporting the new dynamic allocation, Slab heap free now checks that the object lives within the slab region instead of panicking when object is not within slab extents.
  • The interrupt task manager thread no longer exists, functionality has been rolled into KScheduler.
    • KScheduler now has member pointer to the interrupt task manager for the current core.
    • KScheduler::EnableScheduling now sends scheduler interrupt unconditionally, regardless of disable count.
    • KScheduler::RescheduleCurrentCore now uses double-checked-locking-esque strategy for checking scheduling necessity around interrupt disables.
    • KScheduler::Schedule now processes interrupt tasks directly (calls a KInterruptTaskManager member function) rather than setting the interrupt task thread to runnable.
  • KInterruptEventTask no longer contains a KLightLock member.
    • KSchedulerLock is used in places where interrupt events were locked previously.
  • KSchedulerInterruptTask is now a KInterruptHandler, rather than a KInterruptTask (no ::DoTask() implementation, any more).
  • KProcess::AddSharedMemory now sets all fields in one block/scope, rather than two.
  • KWorkerTaskManager::Initialize now hardcodes id=0 instead of taking it as a parameter.
    • KWorkerTaskManager no longer has "id"/"active" fields.
  • Certain unnecessary conditionals were optimized in KServerSession::SendReply/ReceiveMessage.
    • Code of the form `x = condition ? a : b` with condition's value fixed for the block was optimized to `x = a`.
    • This may just be a relic of compiler upgrade mentioned above.
  • Minor changes to GetInfo:
    • Logic which previously disabled interrupt for profiling InfoTypes now instead disables dispatch (KScopedDisableDispatch instead of KScopedDisableInterrupt).
    • InfoType_ThreadTickCount has had its value changed from 0xF0000002 to 0x19. This is presumably to generate better asm for the switch statement.
  • SendAsyncRequestWithUserBuffer now accepts ResultThreadTerminating as a success result (it does not unlock memory when it is returned).
  • KClientSession::SendSyncRequest/SendAsyncRequest no longer hold the scheduler lock while calling KServerSession::OnRequest.
    • Lock is now acquired as needed by KServerSession::OnRequest itself.
  • KClientSession, KLightClientSession, KLightServerSession no longer inherit from KSlabAllocated/KAutoObjectWithList, and are now correspondingly smaller.
  • KResourceLimit::Allocate() now calls KAutoObject::Create().
  • KPrintf has been replaced with a function which takes a non-format string, and prints the string, then <current program ID formatted as %016lx>, then a newline.
    • "Break() called. %016lx\n" and "Exception occurred. %016lx\n" are now "Break() called. " and "Exception occurred. ", respectively.
  • StoreDataCacheSharedForInit has slightly different (but equivalent) iteration logic.

bluetooth

  • New btdrv commands were added.
  • A number of funcs now clear stack buffers before sending it elsewhere.
  • A new system-setting is now used during audio-enabling.
  • ...

See Also

System update report(s):


Nintendo Switch System Versions
1.0.0
2.0.0 • 2.1.0 • 2.2.0 • 2.3.0
3.0.0 • 3.0.1 • 3.0.2
4.0.0 • 4.0.1 • 4.1.0
5.0.0 • 5.0.1 • 5.0.2 • 5.1.0
6.0.0 • 6.0.1 • 6.1.0 • 6.2.0
7.0.0 • 7.0.1
8.0.0 • 8.0.1 • 8.1.0 • 8.1.1
9.0.0 • 9.0.1 • 9.1.0 • 9.2.0
10.0.0 • 10.0.1 • 10.0.2 • 10.0.3 • 10.0.4 • 10.1.0 • 10.1.1 • 10.2.0
11.0.0 • 11.0.1
12.0.0 • 12.0.1 • 12.0.2 • 12.0.3 • 12.1.0
13.0.0 • 13.1.0 • 13.2.0 • 13.2.1
14.0.0 • 14.1.0 • 14.1.1 • 14.1.2
15.0.0 • 15.0.1
16.0.0 • 16.0.1 • 16.0.2 • 16.0.3 • 16.1.0
17.0.0 • 17.0.1
18.0.0