Line 8: |
Line 8: |
| |- | | |- |
| | style="background: green" | Yes | | | style="background: green" | Yes |
− | | [[#CFG_SYSPROT9|CFG_SYSPROT9]] | + | | [[#CFG9_SYSPROT9|CFG9_SYSPROT9]] |
| | 0x10000000 | | | 0x10000000 |
| | 1 | | | 1 |
Line 14: |
Line 14: |
| |- | | |- |
| | style="background: green" | Yes | | | style="background: green" | Yes |
− | | [[#CFG_SYSPROT11|CFG_SYSPROT11]] | + | | [[#CFG9_SYSPROT11|CFG9_SYSPROT11]] |
| | 0x10000001 | | | 0x10000001 |
| | 1 | | | 1 |
Line 20: |
Line 20: |
| |- | | |- |
| | style="background: green" | Yes | | | style="background: green" | Yes |
− | | [[#CFG_RST11|CFG_RST11]] | + | | [[#CFG9_RST11|CFG9_RST11]] |
| | 0x10000002 | | | 0x10000002 |
| | 1 | | | 1 |
Line 26: |
Line 26: |
| |- | | |- |
| | style="background: green" | Yes | | | style="background: green" | Yes |
− | | CFG_DEBUGCTL | + | | CFG9_DEBUGCTL |
| | 0x10000004 | | | 0x10000004 |
| | 4 | | | 4 |
Line 38: |
Line 38: |
| |- | | |- |
| | style="background: green" | Yes | | | style="background: green" | Yes |
− | | [[#CFG_CARDCTL|CFG_CARDCTL]] | + | | [[#CFG9_CARDCTL|CFG9_CARDCTL]] |
| | 0x1000000C | | | 0x1000000C |
| | 2 | | | 2 |
Line 44: |
Line 44: |
| |- | | |- |
| | style="background: green" | Yes | | | style="background: green" | Yes |
− | | [[#CFG_CARDSTATUS|CFG_CARDSTATUS]] | + | | [[#CFG9_CARDSTATUS|CFG9_CARDSTATUS]] |
| | 0x10000010 | | | 0x10000010 |
| | 1 | | | 1 |
Line 50: |
Line 50: |
| |- | | |- |
| | style="background: green" | Yes | | | style="background: green" | Yes |
− | | CFG_CARDCYCLES0 | + | | CFG9_CARDCYCLES0 |
| | 0x10000012 | | | 0x10000012 |
| | 2 | | | 2 |
Line 56: |
Line 56: |
| |- | | |- |
| | style="background: green" | Yes | | | style="background: green" | Yes |
− | | CFG_CARDCYCLES1 | + | | CFG9_CARDCYCLES1 |
| | 0x10000014 | | | 0x10000014 |
| | 2 | | | 2 |
Line 74: |
Line 74: |
| |- | | |- |
| | style="background: red" | No | | | style="background: red" | No |
− | | [[#CFG_EXTMEMCNT9|CFG_EXTMEMCNT9]] | + | | [[#CFG9_EXTMEMCNT9|CFG9_EXTMEMCNT9]] |
| | 0x10000200 | | | 0x10000200 |
| | 1 | | | 1 |
Line 80: |
Line 80: |
| |- | | |- |
| | style="background: green" | Yes | | | style="background: green" | Yes |
− | | [[#CFG_MPCORECFG|CFG_MPCORECFG]] | + | | [[#CFG9_MPCORECFG|CFG9_MPCORECFG]] |
| | 0x10000FFC | | | 0x10000FFC |
| | 4 | | | 4 |
Line 86: |
Line 86: |
| |- | | |- |
| | style="background: green" | Yes | | | style="background: green" | Yes |
− | | [[#CFG_BOOTENV|CFG_BOOTENV]] | + | | [[#CFG9_BOOTENV|CFG9_BOOTENV]] |
| | 0x10010000 | | | 0x10010000 |
| | 4 | | | 4 |
Line 92: |
Line 92: |
| |- | | |- |
| | style="background: green" | Yes | | | style="background: green" | Yes |
− | | [[#CFG_UNITINFO|CFG_UNITINFO]] | + | | [[#CFG9_UNITINFO|CFG9_UNITINFO]] |
| | 0x10010010 | | | 0x10010010 |
| | 1 | | | 1 |
Line 98: |
Line 98: |
| |- | | |- |
| | style="background: green" | Yes | | | style="background: green" | Yes |
− | | [[#CFG_TWLUNITINFO|CFG_TWLUNITINFO]] | + | | [[#CFG9_TWLUNITINFO|CFG9_TWLUNITINFO]] |
| | 0x10010014 | | | 0x10010014 |
| | 1 | | | 1 |
Line 104: |
Line 104: |
| |} | | |} |
| | | |
− | == CFG_SYSPROT9 == | + | == CFG9_SYSPROT9 == |
− | CFG_SYSPROT9 is used to permanently disable certain security-sensitive ARM9 memory areas until the next hard reset.
| + | CFG9_SYSPROT9 is used to permanently disable certain security-sensitive ARM9 memory areas until the next hard reset. |
| | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
Line 125: |
Line 125: |
| |} | | |} |
| | | |
− | On Old 3DS, NATIVE_FIRM reads CFG_SYSPROT9 to know whether it has previously initialized the TWL console-unique keys using the OTP data. After setting the TWL console-unique keys, NATIVE_FIRM sets CFG_SYSPROT9 bit 1 to disable the OTP area. In subsequent FIRM launches prior to the next reset, NATIVE_FIRM will see that the OTP area is disabled, and skip this step. | + | On Old 3DS, NATIVE_FIRM reads CFG9_SYSPROT9 to know whether it has previously initialized the TWL console-unique keys using the OTP data. After setting the TWL console-unique keys, NATIVE_FIRM sets CFG9_SYSPROT9 bit 1 to disable the OTP area. In subsequent FIRM launches prior to the next reset, NATIVE_FIRM will see that the OTP area is disabled, and skip this step. |
| | | |
| On New 3DS, the above is instead done by the [[FIRM#New_3DS_FIRM|Kernel9 loader]]. In addition to using the OTP data for initializing the TWL console-unique keys, the Kernel9 loader will generate the decryption key for NATIVE_FIRM. The final keyslot for NATIVE_FIRM is preserved, so that at a non-reset FIRM launch, the keyslot can be reused, since the OTP would then be inaccessible. | | On New 3DS, the above is instead done by the [[FIRM#New_3DS_FIRM|Kernel9 loader]]. In addition to using the OTP data for initializing the TWL console-unique keys, the Kernel9 loader will generate the decryption key for NATIVE_FIRM. The final keyslot for NATIVE_FIRM is preserved, so that at a non-reset FIRM launch, the keyslot can be reused, since the OTP would then be inaccessible. |
| | | |
− | == CFG_SYSPROT11 == | + | == CFG9_SYSPROT11 == |
| | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
Line 145: |
Line 145: |
| |} | | |} |
| | | |
− | == CFG_RST11 == | + | == CFG9_RST11 == |
| | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
Line 180: |
Line 180: |
| |} | | |} |
| | | |
− | == CFG_CARDCTL == | + | == CFG9_CARDCTL == |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| ! Bit | | ! Bit |
Line 200: |
Line 200: |
| * Selecting CTRCARD1 will activate the register space at [[CTRCARD|0x10005000]]. | | * Selecting CTRCARD1 will activate the register space at [[CTRCARD|0x10005000]]. |
| | | |
− | == CFG_CARDSTATUS == | + | == CFG9_CARDSTATUS == |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| ! Bit | | ! Bit |
Line 215: |
Line 215: |
| |} | | |} |
| | | |
− | == CFG_EXTMEMCNT9 == | + | == CFG9_EXTMEMCNT9 == |
| This register is New3DS-only. | | This register is New3DS-only. |
| | | |
Line 232: |
Line 232: |
| |} | | |} |
| | | |
− | == CFG_MPCORECFG == | + | == CFG9_MPCORECFG == |
| Identical to [[PDN#PDN_MPCORE_CFG|PDN_MPCORE_CFG]]. | | Identical to [[PDN#PDN_MPCORE_CFG|PDN_MPCORE_CFG]]. |
| | | |
− | == CFG_BOOTENV == | + | == CFG9_BOOTENV == |
| This register is used to determine what the previous running FIRM was. Its value is kept following an MCU reboot. Its initial value (on a cold boot) is 0. NATIVE_FIRM [[Development_Services_PXI|sets it to 1]] on shutdown/FIRM launch. [[Legacy_FIRM_PXI|LGY FIRM]] writes value 3 here when launching a TWL title, and writes value 7 when launching an AGB title. | | This register is used to determine what the previous running FIRM was. Its value is kept following an MCU reboot. Its initial value (on a cold boot) is 0. NATIVE_FIRM [[Development_Services_PXI|sets it to 1]] on shutdown/FIRM launch. [[Legacy_FIRM_PXI|LGY FIRM]] writes value 3 here when launching a TWL title, and writes value 7 when launching an AGB title. |
| | | |
| NATIVE_FIRM will only launch titles if this is not value 0, and will only save the [[Flash_Filesystem|AGB_FIRM savegame]] to SD if this is value 7. | | NATIVE_FIRM will only launch titles if this is not value 0, and will only save the [[Flash_Filesystem|AGB_FIRM savegame]] to SD if this is value 7. |
| | | |
− | == CFG_UNITINFO == | + | == CFG9_UNITINFO == |
| This 8-bit register is value zero for retail, non-zero for dev/debug units. | | This 8-bit register is value zero for retail, non-zero for dev/debug units. |
| | | |
− | == CFG_TWLUNITINFO == | + | == CFG9_TWLUNITINFO == |
| In the console-unique TWL key-init/etc function the ARM9 copies the u8 value from REG_UNITINFO to this register. | | In the console-unique TWL key-init/etc function the ARM9 copies the u8 value from REG_UNITINFO to this register. |
| | | |
| This is also used by TWL_FIRM Process9. | | This is also used by TWL_FIRM Process9. |