Changes

5,789 bytes added ,  20:02, 8 January 2021
Hardware info
Line 1: Line 1: −
== Memory ==
+
= ARM11 Kernel Configuration Memory =
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
!  NAME
 
!  NAME
Line 5: Line 5:  
!  WIDTH
 
!  WIDTH
 
|-
 
|-
| ?
+
| KERNEL_?
 
| 0x1FF80000
 
| 0x1FF80000
 
| 1
 
| 1
 
|-
 
|-
| KERNEL_VERSIONMINOR
+
| KERNEL_VERSIONREVISION
 
| 0x1FF80001
 
| 0x1FF80001
 
| 1
 
| 1
 
|-
 
|-
| KERNEL_VERSIONMAJOR
+
| KERNEL_VERSIONMINOR
 
| 0x1FF80002
 
| 0x1FF80002
 
| 1
 
| 1
 
|-
 
|-
| ?
+
| KERNEL_VERSIONMAJOR
 
| 0x1FF80003
 
| 0x1FF80003
 
| 1
 
| 1
Line 32: Line 32:  
| 0x1FF80010
 
| 0x1FF80010
 
| 4
 
| 4
 +
|-
 +
| ENVINFO
 +
| 0x1FF80014
 +
| 1
 
|-
 
|-
 
| UNITINFO
 
| UNITINFO
| 0x1FF80014
+
| 0x1FF80015
 +
| 1
 +
|-
 +
| PREV_FIRM
 +
| 0x1FF80016
 
| 1
 
| 1
 
|-
 
|-
 
| KERNEL_CTRSDKVERSION
 
| KERNEL_CTRSDKVERSION
 
| 0x1FF80018
 
| 0x1FF80018
 +
| 4
 +
|-
 +
| FIRMLAUNCHFLAGS
 +
| 0x1FF80020
 +
| 4
 +
|-
 +
| APPMEMTYPE
 +
| 0x1FF80030
 
| 4
 
| 4
 
|-
 
|-
Line 44: Line 60:  
| 0x1FF80040
 
| 0x1FF80040
 
| 4
 
| 4
 +
|-
 +
| SYSMEMALLOC
 +
| 0x1FF80044
 +
| 4
 +
|-
 +
| BASEMEMALLOC
 +
| 0x1FF80048
 +
| 4
 +
|-
 +
| FIRM_?
 +
| 0x1FF80060
 +
| 1
 +
|-
 +
| FIRM_VERSIONREVISION
 +
| 0x1FF80061
 +
| 1
 
|-
 
|-
 
| FIRM_VERSIONMINOR
 
| FIRM_VERSIONMINOR
| 0x1FF80061
+
| 0x1FF80062
 
| 1
 
| 1
 
|-
 
|-
 
| FIRM_VERSIONMAJOR
 
| FIRM_VERSIONMAJOR
| 0x1FF80062
+
| 0x1FF80063
 
| 1
 
| 1
 
|-
 
|-
Line 60: Line 92:  
| 0x1FF80068
 
| 0x1FF80068
 
| 4
 
| 4
 +
|}
 +
 +
This memory page is mapped as "shared device" (it is thus uncached) and [[Memory_layout|read-only]] for ARM11 processes. This memory and the kernel code for it only exists under NATIVE_FIRM/SAFE_MODE_FIRM.
 +
 +
The FIRM_* fields are by default identical to the KERNEL_* fields. However, the FIRM_* fields can be overridden via FIRM-launch parameters, see [[FIRM|here]].
 +
 +
Besides mem-region related fields, the data written here by the old 3DS/new 3DS kernels is identical.
 +
 +
= Shared Memory Page For ARM11 Processes =
 +
{| class="wikitable" border="1"
 +
!  NAME
 +
!  PROCESS VIRTUAL ADDRESS
 +
!  WIDTH
 +
|-
 +
| bit0 selects DATETIME_0 or DATETIME_1.
 +
| 0x1FF81000
 +
| 4
 +
|-
 +
| RUNNING_HW (1=product, 2=devboard, 3=debugger, 4=capture, 5=?)
 +
| 0x1FF81004
 +
| 1
 +
|-
 +
| MCU_HW_INFO
 +
| 0x1FF81005
 +
| 1
 +
|-
 +
| DATETIME_0 {(u64)MillisecondsSinceFirstJan1900,(u64)SystemTickLastTimeThisWasUpdated,(u32)unk(set to 0xFFB0FF0 by PTM),(u32)Set to 0 by PTM,(u32)Set to 0 by PTM,(u32)set to 0 by PTM}
 +
| 0x1FF81020
 +
| 32
 +
|-
 +
| DATETIME_1
 +
| 0x1FF81040
 +
| 32
 +
|-
 +
| WIFI_MACADDR
 +
| 0x1FF81060
 +
| 6
 +
|-
 +
| WIFI_LINKLEVEL Ranges from 0-3; 0 stands for no or a poor network connection; 3 stands for a good connection. This corresponds with the number of wifi bars displayed by [[Home Menu]].
 +
| 0x1FF81066
 +
| 1
 +
|-
 +
| NETWORK_STATE The network state displayed by [[Home Menu]]. 2: Internet, 3/4/6: Local, 7: Disabled, Everything else: Enabled
 +
| 0x1FF81067
 +
| 1
 +
|-
 +
| 3D_SLIDERSTATE
 +
| 0x1FF81080
 +
| 4
 +
|-
 +
| 3D_LEDSTATE
 +
| 0x1FF81084
 +
| 1
 +
|-
 +
| BATTERY_LEDSTATE
 +
| 0x1FF81085
 +
| 1
 +
|-
 +
| PTM sets bit0 to 1 when it has done writing MCU-originating hw info to [[#RUNNING_HW|RUNNING_HW]], [[#MCU_HW_INFO|MCU_HW_INFO]]. There are no other bits.
 +
| 0x1FF81086
 +
| 1
 
|-
 
|-
 
| MENUTID
 
| MENUTID
Line 68: Line 161:  
| 0x1FF810A8
 
| 0x1FF810A8
 
| 8
 
| 8
 +
|-
 +
| Signed? Headsets connected?
 +
| 0x1FF810C0
 +
| 1
 
|}
 
|}
   −
All of these fields are initialized by the ARM11 kernel, except for MENUTID and ACTIVEMENUTID which are set by NS.
+
This memory page is normally read-only for ARM11 processes, write-access is [[Memory_layout|determined]] by the process exheader kernel "shared page writing" flag. It is mapped as "shared device" (it is thus uncached) in both cases.
 +
 
 +
This memory only exists under NATIVE_FIRM/SAFE_MODE_FIRM.
 +
 
 +
= ARM11 Kernel Config Fields =
 +
 
 +
== 0x1FF80000 / 0x1FF80060 ==
 +
Unknown, this is normally value 0.
 +
 
 +
== KERNEL_VERSIONREVISION / FIRM_VERSIONREVISION ==
 +
This is the version-revision for the currently running [[FIRM]].
 +
 
 +
== KERNEL_VERSIONMINOR ==
 +
This is the version-minor from ((title-version & 0x3FF) >> 4), for the currently running [[FIRM]]. The values from KERNEL_VERSIONMINOR and KERNEL_VERSIONMAJOR can be stored in applications' [[NCCH#CXI|CXI]] exheader.
 +
 
 +
== FIRM_VERSIONMINOR ==
 +
This is the same as KERNEL_VERSIONMINOR. After [[AM:InstallNATIVEFIRM]] checks FIRM_SYSCOREVER, [[AM:InstallNATIVEFIRM]] then compares FIRM_VERSIONMINOR with the NATIVE_FIRM ((title-version & 0x3FF) >> 4), when the latter is larger than FIRM_VERSIONMINOR [[AM:InstallNATIVEFIRM]] will trigger a [[FIRM]] install.
   −
=== KERNEL_VERSIONMINOR / FIRM_VERSIONMINOR ===
+
== KERNEL_VERSIONMAJOR / FIRM_VERSIONMAJOR ==
This is the [[FIRM]] version-minor, this likely isn't obtained from the [[FIRM]] title-version.
+
This is the version-major for the currently running [[FIRM]].
   −
=== KERNEL_VERSIONMAJOR ===
+
The kernel initializes KERNEL_VERSIONMAJOR and SYSCOREVER with the same constant value.
This is the ((title-version & 0x3FF) >> 4), for the currently running [[FIRM]].
     −
=== FIRM_VERSIONMAJOR ===
+
== UPDATEFLAG ==
This is the same as KERNEL_VERSIONMAJOR. After [[AM:InstallNATIVEFIRM]] checks FIRM_SYSCOREVER, [[AM:InstallNATIVEFIRM]] then compares FIRM_VERSIONMAJOR with the NATIVE_FIRM ((title-version & 0x3FF) >> 4), when the latter is larger than FIRM_VERSIONMAJOR [[AM:InstallNATIVEFIRM]] will trigger a [[FIRM]] install.
+
Normally this flag is zero. When the ARM11 kernel is booting on non-factory FIRM it will set this flag to 1, when bit0 from the data which field 0x1FF80016 is loaded from is clear, if the following [[PAD]] buttons are pressed: L, R, A, Up. When this flag is set, [[NS]] will launch the [[System_Settings#System_Updater|System Updater]] title instead of [[Home Menu]].
   −
=== UPDATEFLAG ===
+
== NSTID ==
Normally this flag is zero, however when the ARM11 kernel is booting it will set this flag to 1, if the following [[PAD]] buttons are pressed: L, R, A, Up. When this flag is set, the system will launch the [[System_Settings#System_Updater|System Updater]] title instead of displaying the [[Home Menu]].
+
This field contains the titleID of the first title to launch from CTR-NAND after the [[FIRM]] system processes are loaded. The [[Process_Manager_Services|PM]] module launches this title. If this field titleID is all-zero, the system will not attempt to launch the title. The regular ARM11 kernel sets this to the regular [[NS]] titleID, while the SAFE_MODE ARM11 kernel sets this to the SAFE_MODE NS titleID. The factory FIRM ARM11-kernel sets this to the NS TID from [[Factory_Setup|here]].
   −
=== NSTID ===
+
== SYSCOREVER ==
This field contains the titleID of the first title to launch from CTR-NAND after the [[FIRM]] system processes are loaded. The [[Process Manager Ports|PM]] module launches this title. If this field titleID is all-zero, the system will not attempt to launch the title. The regular ARM11 kernel sets this to the regular [[NS]] titleID, while the SAFE_MODE ARM11 kernel sets this to the SAFE_MODE NS titleID.
+
This field is initialized by the ARM11 kernel, this is the programID-low of the running FIRM. When launching [[NCCH#CXI|CXIs]], the value stored here must match the core version field stored in the CXI exheader. If they do not match, the [[Process_Manager_Services|PM]] module will refuse to launch the ARM11 process.
   −
=== SYSCOREVER ===
+
With [[Factory_Setup|factory]] NATIVE_FIRM, this is set to 0x0, even though the FIRM programID-low is 0x2. However, the factory system-titles have core-version set to 0x2. Hence, this config-mem SYSCOREVER field might not be used by factory system processes?
When launching [[NCCH#CXI|CXIs]], the value stored here must match the core version field stored in the CXI exheader. If they do not match, the [[Process Manager Ports|PM]] module will refuse to launch the ARM11 process. The regular ARM11 kernel sets this to 0x2, while the SAFE_MODE ARM11 kernel sets this to 0x3.
     −
=== FIRM_SYSCOREVER ===
+
== FIRM_SYSCOREVER ==
 
Normally this is the same as SYSCOREVER. This used by [[AM:InstallNATIVEFIRM]] for comparing with the NATIVE_FIRM titleID-low. When the low u8 from the NATIVE_FIRM titleID-low is larger than FIRMSYSCOREVER, [[AM:InstallNATIVEFIRM]] will trigger FIRM installing. When that u8 is not larger than FIRM_SYSCOREVER, and these two values don't match, [[AM:InstallNATIVEFIRM]] will return an error.
 
Normally this is the same as SYSCOREVER. This used by [[AM:InstallNATIVEFIRM]] for comparing with the NATIVE_FIRM titleID-low. When the low u8 from the NATIVE_FIRM titleID-low is larger than FIRMSYSCOREVER, [[AM:InstallNATIVEFIRM]] will trigger FIRM installing. When that u8 is not larger than FIRM_SYSCOREVER, and these two values don't match, [[AM:InstallNATIVEFIRM]] will return an error.
   −
=== UNITINFO ===
+
== ENVINFO ==
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
!  Bit
 
!  Bit
Line 99: Line 210:  
|-
 
|-
 
| 0
 
| 0
| Clear for dev unit, set for retail
+
| Clear for developer unit, set for retail.(See 0x1FF80015)
 
|-
 
|-
 
| 1
 
| 1
| Set for debug units
+
| IsJtagConnected
 
|-
 
|-
 
| 2-7
 
| 2-7
| ?
+
|?
 
|}
 
|}
   −
Normally this register is all-zero, however bit1 in this field is set by the ARM11 kernel when ARM debug CP14 DSCR bit14 is set. [[NS]] loads the menu TID from MENUTID when bits 1-7 of this register are clear. [[ErrDisp]] will display development error info when bit0 is clear.
+
Bit1 in this field is set by the ARM11 kernel when ARM debug CP14 DSCR bit14 is set (halting debug-mode enabled). [[NS]] loads the menu TID from MENUTID when bits 1-7 of this field are clear. [[ErrDisp]] will display development error info when bit0 is clear.
   −
=== KERNEL_CTRSDKVERSION / FIRM_CTRSDKVERSION ===
+
== UNITINFO ==
 +
{| class="wikitable" border="1"
 +
!  Value
 +
!  Boot Env
 +
|-
 +
| 0
 +
| Prod
 +
|-
 +
| 1
 +
| Dev
 +
|-
 +
| 2
 +
| Debugger
 +
|-
 +
| 3
 +
| Firm
 +
|}
 +
 
 +
The ARM11 loads the value of [[CONFIG_Registers#CFG_UNITINFO|CFG_UNITINFO]] from 0x1FFFFFF0+1 during startup, which is written by the ARM9 during ARM9<>ARM11 kernel sync.
 +
 
 +
When this field is zero, bit0 for ENVINFO is set for retail. When this field is non-zero, bit0 for ENVINFO is clear for dev/debug units, and an ARM11 kernel state flag which enables debugging is set. JTAG is only enabled for debugger and "firm" modes (bit1).
 +
 
 +
== PREV_FIRM ==
 +
{| class="wikitable" border="1"
 +
!  Value
 +
!  Description
 +
|-
 +
| 0
 +
| Cold Boot
 +
|-
 +
| 1
 +
| Reset from CTR mode
 +
|-
 +
| 3
 +
| Reset from TWL mode
 +
|-
 +
| 5
 +
| Reset from NTR mode
 +
|-
 +
| 7
 +
| Reset from AGB mode
 +
|}
 +
 
 +
The ARM11 loads this value from 0x1FFFFFF0+2 during startup, which is written by the ARM9 during ARM9<>ARM11 kernel sync.
 +
 
 +
This originates from the low 8-bits of register [[CONFIG|0x10010000]]. When bit0 is set, the ARM11 kernel will not set the UPDATEFLAG to value 1.
 +
 
 +
== KERNEL_CTRSDKVERSION / FIRM_CTRSDKVERSION ==
 
This is the CTR-SDK version which was used to build the currently running [[FIRM]].
 
This is the CTR-SDK version which was used to build the currently running [[FIRM]].
   −
=== APPMEMALLOC ===
+
== APPMEMTYPE ==
This contains the total size of the memory that can be allocated with the application [[SVC|memory-type]]. On retail this is 64MB for [[3DS_Development_Unit_Software#Config|prod]].
+
The value of this field determines the size for APPMEMALLOC. The retail type(value0) is used when the type is not values 2-5. See [[Memory_layout]] for the table of values for this and the mem-region sizes.
 +
 
 +
== APPMEMALLOC ==
 +
This contains the total size of the memory that can be allocated with the APPLICATION [[SVC|memory-region]], see [[Memory_layout|here]].
 +
 
 +
== SYSMEMALLOC ==
 +
Same as APPMEMALLOC except for the SYSTEM mem-region, see [[Memory_layout|here]].
 +
 
 +
== BASEMEMALLOC ==
 +
Same as APPMEMALLOC except for the BASE mem-region, see [[Memory_layout|here]].
 +
 
 +
= Shared Memory Page Fields =
 +
 
 +
== RUNNING_HW ==
 +
Converted from [[#MCU_HW_INFO|MCU_HW_INFO]] (names extracted from TestMenu) by PTM, depending on whether or not the system is a N3DS/N2DS or not:
 +
 
 +
{| class="wikitable" border="1"
 +
!  Value
 +
!  Description
 +
|-
 +
| 0
 +
| Invalid (unknown)
 +
|-
 +
| 1
 +
| PRODUCT
 +
|-
 +
| 2
 +
| TS_BOARD
 +
|-
 +
| 3
 +
| KMC_DEBUGGER
 +
|-
 +
| 4
 +
| KMC_CAPTURE
 +
|-
 +
| 5
 +
| IS_DEBUGGER
 +
|-
 +
| 6
 +
| SNAKE_PRODUCT
 +
|-
 +
| 7
 +
| SNAKE_IS_DEBUGGER
 +
|-
 +
| 8
 +
| SNAKE_IS_CAPTURE
 +
|-
 +
| 9
 +
| SNAKE_KMC_DEBUGGER
 +
|}
 +
 
 +
== MCU_HW_INFO ==
 +
 
 +
Converted to [[#RUNNING_HW|RUNNING_HW]] by PTM.
 +
 
 +
{| class="wikitable" border="1"
 +
!  Value
 +
!  Description
 +
|-
 +
| 0
 +
| PRODUCT
 +
|-
 +
| 1
 +
| TS_BOARD
 +
|-
 +
| 2
 +
| KMC_DEBUGGER
 +
|-
 +
| 4
 +
| KMC_CAPTURE
 +
|-
 +
| 5
 +
| IS_DEBUGGER
 +
|-
 +
| 6
 +
| IS_CAPTURE (N3DS only)
 +
|}
 +
 
 +
== WIFI_MACADDR ==
 +
This is the WiFi MAC address for the 3DS. This is initialized by the [[NWM_Services|NWM]] module and is loaded from the WiFi card's EEPROM.
 +
 
 +
== 3D_SLIDERSTATE ==
 +
This float contains the state of the 3D slider. The range of this float is value 0.0f for "off", and 1.0f for max.
 +
 
 +
This is written/updated by [[HID_Services|HID]] module.
 +
 
 +
== 3D_LEDSTATE ==
 +
When non-zero, the 3D LED is disabled. See [[GSPGPU:SetLedForceOff]].
 +
 
 +
== BATTERY_LEDSTATE ==
 +
Bit[0] is set when the adapter is connected. Bit[1] is set when the battery is charging. Bit[2:4] is the value of [[PTM:GetBatteryLevel|battery level]]. If the connection bit is set but the charging bit is clear, it means the battery is already fully charged but still with adapter connected.
 +
 
 +
== MENUTID ==
 +
Unknown, contains the menu TID (used by [[NS]])
 +
 
 +
== ACTIVEMENUTID ==
 +
This contains the titleID of the currently running menu launched by [[NS]].
   −
=== MENUTID ===
+
= NATIVE_FIRM Versions =
This contains the titleID of the retail menu which will be launched by [[NS]].
     −
=== ACTIVEMENUTID ===
+
See [[FIRM#NATIVE_FIRM|FIRM]].
This contains the titleID of the currently running menu launched by [[NS]]. Normally this is the home menu TID from MENUTID, but if launching that fails this titleID is the [[NS#Alternate Menu|alternate menu]].(On debug units this is the TID loaded from [[Config_Savegame|config]])