Skip to content
lifehackerhansol edited this page Sep 23, 2024 · 11 revisions

This page details features in Luma3DS that are either always in effect (cannot be toggled off) or are toggled on by default. For documentation on optional/toggleable features, see the Optional features page. For documentation on Luma3DS' custom sysmodule, see Rosalina.

Custom sysmodules

  • Loader: Inspired by yifanlu's re-implementation of Loader, Luma3DS integrates a custom Loader with the ability to inject code, allowing most of our patches to work with ease, and does most of the work involved in language emulation and game patching/LayeredFS. More information about these features can be found on the Optional features page.
  • Rosalina: A completely custom sysmodule with a myriad of features for end user convenience, triggered by pressing L+Down+Select (by default, can be changed) once the 3DS is booted. See the linked page for more information.
  • Service Manager (SM) and PXI: The builtin sysmodules SM and PXI were re-implemented by @TuxSH and integrated into Luma, and are somewhat more efficient than their Nintendo counterparts. Additionally, service access checking was removed from the SM re-implementation, removing many restrictions.

Data protection

  • Entrypoint/source detection: As of version 9.0, the entrypoint Luma3DS is booted from is displayed on the bottom screen in the configuration menu. Luma3DS can detect whether it was booted from the SD card, CTRNAND, FIRM0/1, as well as the entrypoint that launched it (boot9strap, ntrboot, etc.) and will enable/disable features accordingly. For example, when launched from ntrboot, Luma3DS only allows itself to be used as a chainloader because it isn't safe to fully boot from it.
  • FIRM partition write protection: Luma3DS prevents the system from writing to the FIRM partitions. This allows you to perform a System Update safely without boot9strap being removed.
  • Session persistence: You will be returned to the correct NAND (sysNAND or emuNAND1/2/3/4) when returning from titles that soft reboot the 3DS, such as System Settings, extended memory games (Smash Brothers, Monster Hunter XX, etc.), DS carts, and DSiWare. This excludes GBA Virtual Console games launched from emuNAND; due to the way AGB_FIRM works you must be rebooted to sysNAND on exit or your save will be lost.

Removal of restrictions

  • AGB patches: Custom Gameboy Advance Virtual Console games can be launched with AGB_FIRM.
  • Archive/ARM9 exheader/Services/SVC access: SVC, service, archive, and ARM9 exheader permission checks are patched out by default as of Luma3DS v9.0.
  • Exception handlers: If something causes a crash/exception, Luma3DS will show a dump and offer to save it to the SD card for parsing later. ARM11 exception handlers can be turned off, but this is highly not recommended; ARM9 exception handlers cannot be turned off. Luma3DS' exception handlers are capable of handling crashes in chainloaded payloads (unless the payload has its own handlers, such as GodMode9), CPU exceptions, svcBreak()s, kernel panics, most cases of ErrDisp, etc.
    • To parse an exception dump:
    • Note: Our exception dump parser uses Python; it must be installed and added to your system PATH.
    • Clone Luma3DS' git repository (or just download the /exceptions/parser directory)
    • Open a terminal/CMD avigate to the /exceptions/parser directory, and run python setup.py install. This will install the exception dump parser to your system.
    • Navigate to where your kept your exception dump and run luma3ds_exception_dump_parser FILE_NAME_HERE.dmp
  • Region-free patches: The region lock preventing foreign/imported 3DS games from working has been removed. Carts from the NA (North America), EU (Europe), JP (Japan), KOR (Korea), TWN (Taiwan, Hong Kong), and CHN (mainland China) regions should work without issue on any region firmware with Luma3DS, eliminating the need to perform region changes. Note: CHN/TWN/KOR 3DSes use a different shared font archive than NA/EU/JP. It may be necessary to install the other regions' shared font archives if your out of region game does not work.

Developer features

These features are useful for debugging and writing homebrew; typically they will not be useful for the end user.

  • A kernel extension extending the features of Kernel11:

    • New features for existing SVCs, for example:

      • New types for svcGetProcessInfo: 0x10000 to get a process's name, 0x10001 to get a process's title ID, 0x10002 to 0x10007 for section attributes, 0x10008 for TTBR1, etc.
      • New types for svcGetSystemInfo: 0x10000 for CFW info, 0x10001 for N3DS-related info, 0x10002 for TTBCR and TTBR0 per core, etc.
      • New types for svcGetThreadInfo: 0x10000 for thread local storage.
      • Many other changes to be listed here.
    • New SVCs:

      • svcControlService(): Performs actions related to services or global handles.
        • SERVICEOP_STEAL_CLIENT_SESSION: Steal a client session given a service or global port name
        • SERVICEOP_GET_NAME: Get the name of a service or global port given a client or session handle
      • svcCustomBackdoor(): Executes a function in supervisor mode, using the supervisor-mode stack.
      • svcConvertVAToPA(): Gives the physical address corresponding to a virtual address.
      • svcFlushDataCacheRange(): Flushes a range of the data cache (L2C included).
      • svcFlushEntireDataCache(): Flushes the data cache entirely (L2C included).
      • svcInvalidateInstructionCacheRange(): Invalidates a range of the instruction cache.
      • svcInvalidateEntireInstructionCache(): Invalidates the instruction cache entirely.
      • svcMapProcessMemoryEx(): Maps a block of process memory.
      • svcUnmapProcessMemoryEx(): Unmaps a block of process memory.
      • svcControlMemoryEx(): Controls memory mapping, with the choice to use region attributes or not.
      • svcCopyHandle(): Copy a handle from a process to another one.
      • svcTranslateHandle(): Get the address and class name of the underlying kernel object corresponding to a handle.
      • Indirect SVC: svc 0xFE
      • See csvc.h for more information.
    • Debug features:

      • Everything behaves as if the "Allow debug" kernel flags was always set, and svcKernelSetState as well as the official debug handlers always believe that the unit is a development one. This is needed for the below item
      • No need to do svcKernelSetState(6, 1, 1LL) for user-specified exception handlers anymore.
      • Luma3DS' fatal exception handlers are now only used either on privileged-mode crashes or when there is no preferred alternative, namely: KDebug based-debugging, or user-defined exception handlers.
    • New memory mapping: PA 00000000..30000000 -> VA 80000000..B0000000 [ Priv: RWX, User: RWX ] [ Shared, Strongly Ordered ] (accessible from the GDB stub)

    • Because of memory issues, ErrDisp is not launched; err:f has been reimplemented.