Line 1: |
Line 1: |
− | = Secure Monitor Calls = | + | = Secure Monitor calls = |
− | | |
| The secure monitor provides two top level handlers of which each provides a range of sub handlers. | | The secure monitor provides two top level handlers of which each provides a range of sub handlers. |
| | | |
− | Secure Monitor Calls follow the ARM SMC calling convention up to a small change: | + | Secure Monitor calls follow the ARM SMC calling convention up to a small change: |
| {| class=wikitable | | {| class=wikitable |
| ! Bit number || Bit mask || Description | | ! Bit number || Bit mask || Description |
Line 24: |
Line 23: |
| SMC arguments are passed using registers X0-X7 with X0 always sending the call sub-id and returning the result of the call. | | SMC arguments are passed using registers X0-X7 with X0 always sending the call sub-id and returning the result of the call. |
| | | |
− | == ID 0 == | + | == FunctionId0 == |
| Functions exposed to user-mode processes using [[SVC|svcCallSecureMonitor]]. SMCs should be called from CPUID 3 (where SPL runs). | | Functions exposed to user-mode processes using [[SVC|svcCallSecureMonitor]]. SMCs should be called from CPUID 3 (where SPL runs). |
| | | |
| {| class=wikitable | | {| class=wikitable |
− | ! Sub-ID || Name || In || Out | + | ! Value || Name |
| |- | | |- |
− | | 0xC3000401 || SetConfig || || | + | | 0xC3000401 || SetConfig |
| |- | | |- |
− | | 0xC3000002 || GetConfig (Same as ID 1, Sub-ID 4) || || | + | | 0xC3000002 || [[#GetConfig]] (same as in [[#FunctionId1]]) |
| |- | | |- |
− | | 0xC3000003 || GetResult || || | + | | 0xC3000003 || GetResult |
| |- | | |- |
− | | 0xC3000404 || GetResultData || || | + | | 0xC3000404 || GetResultData |
| |- | | |- |
− | | 0xC3000E05 || ExpMod || || | + | | 0xC3000E05 || ExpMod |
| |- | | |- |
− | | 0xC3000006 || GenerateRandomBytes (Same as ID 1, Sub-ID 5) || || | + | | 0xC3000006 || [[#GenerateRandomBytes]] (same as in [[#FunctionId1]]) |
| |- | | |- |
− | | 0xC3000007 || [[#GenerateAesKek]] || || | + | | 0xC3000007 || [[#GenerateAesKek]] |
| |- | | |- |
− | | 0xC3000008 || [[#LoadAesKey]] || || | + | | 0xC3000008 || [[#LoadAesKey]] |
| |- | | |- |
− | | 0xC3000009 || [[#ComputeAes]] || || | + | | 0xC3000009 || [[#ComputeAes]] |
| |- | | |- |
− | | 0xC300000A || [[#GenerateSpecificAesKey]] || || | + | | 0xC300000A || [[#GenerateSpecificAesKey]] |
| |- | | |- |
− | | 0xC300040B || [[#ComputeCmac]] || || | + | | 0xC300040B || [[#ComputeCmac]] |
| |- | | |- |
− | | [1.0.0-4.1.0] 0xC300100C || [[#ImportEsKey]] || || | + | | [1.0.0-4.1.0] 0xC300100C || [[#ImportEsKey]] |
| |- | | |- |
− | | [5.0.0+] 0xC300D60C || [[#ReEncryptRsaPrivateKey]] || || | + | | [5.0.0+] 0xC300D60C || [[#ReEncryptRsaPrivateKey]] |
| |- | | |- |
− | | [1.0.0-4.1.0] 0xC300100D || [[#DecryptRsaPrivateKey]] || || | + | | [1.0.0-4.1.0] 0xC300100D || [[#DecryptRsaPrivateKey]] |
| |- | | |- |
− | | [5.0.0+] 0xC300100D || [[#DecryptOrImportRsaPrivateKey]] || || | + | | [5.0.0+] 0xC300100D || [[#DecryptOrImportRsaPrivateKey]] |
| |- | | |- |
− | | [1.0.0-4.1.0] 0xC300100E || [[#ImportLotusKey]] || || | + | | [1.0.0-4.1.0] 0xC300100E || [[#ImportLotusKey]] |
| |- | | |- |
− | | 0xC300060F || [[#StorageExpMod]] || || | + | | 0xC300060F || [[#StorageExpMod]] |
| |- | | |- |
− | | 0xC3000610 || [[#UnwrapTitleKey]] || || | + | | 0xC3000610 || [[#UnwrapTitleKey]] |
| |- | | |- |
− | | 0xC3000011 || [[#LoadTitleKey]] || || | + | | 0xC3000011 || [[#LoadTitleKey]] |
| |- | | |- |
− | | 0xC3000012 || [2.0.0+] [[#UnwrapCommonTitleKey]] || || | + | | 0xC3000012 || [2.0.0+] [[#UnwrapCommonTitleKey]] |
| |} | | |} |
| | | |
Line 82: |
Line 81: |
| | | |
| === GenerateAesKek === | | === GenerateAesKek === |
− | Takes an "access key" as input, an [[#enum_CryptoUsecase]]. | + | Takes an "access key" as input, an [[#CryptoUsecase]]. |
| | | |
| Returns a session-unique kek for said usecase. | | Returns a session-unique kek for said usecase. |
Line 89: |
Line 88: |
| Takes a session kek created with [[#GenerateAesKek]], and a wrapped AES key. | | Takes a session kek created with [[#GenerateAesKek]], and a wrapped AES key. |
| | | |
− | The session kek must have been created with [[#enum_CryptoUsecase|CryptoUsecase_Aes]]. | + | The session kek must have been created with [[#CryptoUsecase|CryptoUsecase Aes]]. |
| | | |
| === ComputeAes === | | === ComputeAes === |
− | Encrypts/decrypts using AES (CTR and CBC). Takes an [[#enum_CipherMode]]. | + | Encrypts/decrypts using AES (CTR and CBC). Takes an [[#CipherMode]]. |
| | | |
| Key must be set prior using one of the [[#LoadAesKey]] or [[#GenerateSpecificAesKey]] commands. | | Key must be set prior using one of the [[#LoadAesKey]] or [[#GenerateSpecificAesKey]] commands. |
Line 105: |
Line 104: |
| Takes a session kek created with [[#GenerateAesKek]], a wrapped AES key, and a wrapped RSA private key. | | Takes a session kek created with [[#GenerateAesKek]], a wrapped AES key, and a wrapped RSA private key. |
| | | |
− | The session kek must have been created with [[#enum_CryptoUsecase|CryptoUsecase_TitleKey]]. | + | The session kek must have been created with [[#CryptoUsecase|CryptoUsecase TitleKey]]. |
| | | |
| [5.0.0] This function was removed and replaced with [[#ReEncryptRsaPrivateKey]]. | | [5.0.0] This function was removed and replaced with [[#ReEncryptRsaPrivateKey]]. |
Line 119: |
Line 118: |
| Takes a session kek created with [[#GenerateAesKek]], a wrapped AES key, an enum member, and a wrapped RSA private key. | | Takes a session kek created with [[#GenerateAesKek]], a wrapped AES key, an enum member, and a wrapped RSA private key. |
| | | |
− | The session kek must have been created with [[#enum_CryptoUsecase|CryptoUsecase_RsaPrivate]]. | + | The session kek must have been created with [[#CryptoUsecase|CryptoUsecase RsaPrivate]]. |
| | | |
− | [4.0.0+] The SMC handler when certain conditions pass and SMC_ID==0xC300100D now returns error 0x6 instead of calling the handler funcptr. | + | [4.0.0+] The SMC handler when certain conditions pass and FunctionId0==0xC300100D now returns error 0x6 instead of calling the handler funcptr. |
| | | |
| [5.0.0+] This function was replaced by [[#DecryptOrImportRsaPrivateKey]]. | | [5.0.0+] This function was replaced by [[#DecryptOrImportRsaPrivateKey]]. |
| | | |
| === DecryptOrImportRsaPrivateKey === | | === DecryptOrImportRsaPrivateKey === |
− | This function replaced [[#DecryptRsaPrivateKey]] in [[5.0.0]], adding an additional [[#enum_DecryptOrImportMode]]. | + | This function replaced [[#DecryptRsaPrivateKey]] in [[5.0.0]], adding an additional [[#DecryptOrImportMode]]. |
| | | |
| This SMC extends DecryptRsaPrivateKey's original functionality to enable importing private keys into the security engine instead of decrypting them, when certain enum members are passed. | | This SMC extends DecryptRsaPrivateKey's original functionality to enable importing private keys into the security engine instead of decrypting them, when certain enum members are passed. |
Line 133: |
Line 132: |
| Takes a session kek created with [[#GenerateAesKek]], and a wrapped RSA key. | | Takes a session kek created with [[#GenerateAesKek]], and a wrapped RSA key. |
| | | |
− | The session kek must have been created with [[#enum_CryptoUsecase|CryptoUsecase_RsaSecureExpMod]]. | + | The session kek must have been created with [[#CryptoUsecase|CryptoUsecase RsaSecureExpMod]]. |
| | | |
| [5.0.0] This function was removed. | | [5.0.0] This function was removed. |
Line 140: |
Line 139: |
| Performs an ExpMod operation using an exponent previously loaded with the [[#ImportLotusKey]] command. | | Performs an ExpMod operation using an exponent previously loaded with the [[#ImportLotusKey]] command. |
| | | |
− | [5.0.0+] This now uses any exponent previously loaded with [[#DecryptOrImportRsaPrivateKey]] and takes an [[#enum_SecureExpModMode]]. | + | [5.0.0+] This now uses any exponent previously loaded with [[#DecryptOrImportRsaPrivateKey]] and takes an [[#SecureExpModMode]]. |
| | | |
| === UnwrapTitleKey === | | === UnwrapTitleKey === |
Line 157: |
Line 156: |
| Takes an AES-wrapped TitleKey and returns a sealed AES key. | | Takes an AES-wrapped TitleKey and returns a sealed AES key. |
| | | |
− | === enum CryptoUsecase === | + | == FunctionId1 == |
− | {| class=wikitable
| + | Functions exposed to the kernel internally. |
− | ! Value || Name
| |
− | |-
| |
− | | 0 || CryptoUsecase_Aes
| |
− | |-
| |
− | | 1 || CryptoUsecase_RsaPrivate
| |
− | |-
| |
− | | 2 || CryptoUsecase_RsaSecureExpMod
| |
− | |-
| |
− | | 3 || CryptoUsecase_TitleKey
| |
− | |}
| |
− | | |
− | Note:
| |
− | The [[#enum_CryptoUsecase|CryptoUsecase_TitleKey]] represents a RSA wrapped AES key.
| |
| | | |
− | === enum CipherMode ===
| |
| {| class=wikitable | | {| class=wikitable |
| ! Value || Name | | ! Value || Name |
| |- | | |- |
− | | 0 || CipherMode_CbcEncrypt | + | | 0xC4000001 || [[#CpuSuspend]] |
| |- | | |- |
− | | 1 || CipherMode_CbcDecrypt | + | | 0x84000002 || [[#CpuOff]] |
| |- | | |- |
− | | 2 || CipherMode_Ctr | + | | 0xC4000003 || [[#CpuOn]] |
− | |}
| |
− | | |
− | === enum DecryptOrImportMode ===
| |
− | {| class=wikitable
| |
− | ! Value || Name
| |
| |- | | |- |
− | | 0 || DecryptOrImportMode_DecryptRsaPrivateKey | + | | 0xC3000004 || [[#GetConfig]] (same as in [[#FunctionId0]]) |
| |- | | |- |
− | | 1 || DecryptOrImportMode_ImportLotusKey | + | | 0xC3000005 || [[#GenerateRandomBytes]] (same as in [[#FunctionId0]]) |
| |- | | |- |
− | | 2 || DecryptOrImportMode_ImportEsKey | + | | 0xC3000006 || [[#Panic]] |
| |- | | |- |
− | | 3 || DecryptOrImportMode_ImportSslKey | + | | 0xC3000007 || [2.0.0+] [[#ConfigureCarveout]] |
| |- | | |- |
− | | 4 || DecryptOrImportMode_ImportDrmKey | + | | 0xC3000008 || [2.0.0+] [[#ReadWriteRegister]] |
| |} | | |} |
| | | |
− | === enum SecureExpModMode === | + | === CpuSuspend === |
− | {| class=wikitable
| + | Takes an u64 '''PowerState''', an u64 '''EntrypointAddr''' and an u64 '''ContextId'''. No output. |
− | ! Value || Name
| |
− | |-
| |
− | | 0 || SecureExpModMode_Lotus
| |
− | |-
| |
− | | 1 || SecureExpModMode_Ssl
| |
− | |-
| |
− | | 2 || SecureExpModMode_Drm
| |
− | |}
| |
| | | |
− | == ID 1 ==
| + | Suspends the CPU (CPU0). |
− | Functions exposed to the kernel internally.
| |
| | | |
− | {| class=wikitable
| + | The kernel calls this SMC on shutdown with '''PowerState''' set to 0x0201001B (power level: 0x02==system; power type: 0x01==powerdown; ID: 0x1B). |
− | ! Sub-ID || Name || In || Out
| |
− | |-
| |
− | | 0xC4000001 || [[#CpuSuspend]] || X1=power_state, X2=entrypoint_addr, X3=context_id || None
| |
− | |-
| |
− | | 0x84000002 || [[#CpuOff]] || None || None
| |
− | |-
| |
− | | 0xC4000003 || [[#CpuOn]] || X1=target_cpu, X2=entrypoint_addr, X3=context_id, X4,X5,X6,X7=0 || X0=result
| |
− | |-
| |
− | | 0xC3000004 || [[#GetConfig]] (Same as ID 0, Sub-ID 2) || W1=config_item, X2,X3,X4,X5,X6,X7=0 || X0=result, X1,X2,X3,X4=config_val
| |
− | |-
| |
− | | 0xC3000005 || [[#GenerateRandomBytes]] (Same as ID 0, Sub-ID 6) || X1=size, X2,X3,X4,X5,X6,X7=0 || X0=result, X1,X2,X3,X4,X5,X6,X7=rand_bytes
| |
− | |-
| |
− | | 0xC3000006 || [[#Panic]] || W1=panic_color, X2,X3,X4,X5,X6,X7=0 || X0=result
| |
− | |-
| |
− | | 0xC3000007 || [2.0.0+] [[#ConfigureCarveout]] || X1=carveout_index, X2=region_phys_addr, X3=region_size, X4,X5,X6,X7=0 || X0=result
| |
− | |-
| |
− | | 0xC3000008 || [2.0.0+] [[#ReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val, X4,X5,X6,X7=0 || X0=result, W1=out_val
| |
− | |}
| |
| | | |
− | === CpuSuspend === | + | === CpuOff === |
− | Standard ARM PCSI SMC. Suspends the CPU (CPU0).
| + | No input/output. |
| | | |
− | The kernel calls this SMC on shutdown with '''power_state''' set to 0x0201001B (power level: 0x02==system; power type: 0x01==powerdown; ID: 0x1B).
| + | Turns off the CPU (CPU1, CPU2 or CPU3). |
| | | |
− | === CpuOff === | + | === CpuOn === |
− | Standard ARM PCSI SMC. Turns off the CPU (CPU1, CPU2 or CPU3).
| + | Takes an u64 '''TargetCpu''', an u64 '''EntrypointAddr''' and an u64 '''ContextId'''. Returns [[#Result]]. |
| | | |
− | === CpuOn ===
| + | Turns on the CPU (CPU1, CPU2 or CPU3). |
− | Standard ARM PCSI SMC. Turns on the CPU (CPU1, CPU2 or CPU3).
| |
| | | |
| === GetConfig === | | === GetConfig === |
− | Takes a '''config_item''' and returns an associated '''config_val'''. | + | Takes a [[#ConfigItem]]. Returns [[#Result]] and a '''ConfigVal'''. |
| | | |
| + | ==== ConfigItem ==== |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
− | ! ConfigItem || Name | + | ! Value || Name |
| |- | | |- |
| | 1 || [[#DisableProgramVerification]] | | | 1 || [[#DisableProgramVerification]] |
Line 286: |
Line 239: |
| |} | | |} |
| | | |
− | ==== DisableProgramVerification ==== | + | ===== DisableProgramVerification ===== |
| [[Process Manager services|PM]] checks this item and if non-zero, calls fsp-pr SetEnabledProgramVerification(false). | | [[Process Manager services|PM]] checks this item and if non-zero, calls fsp-pr SetEnabledProgramVerification(false). |
| | | |
− | ==== DramId ==== | + | ===== DramId ===== |
− | This is extracted directly from [[Fuse_registers#FUSE_RESERVED_ODM4|FUSE_RESERVED_ODM4]].
| |
− | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
− | ! Value | + | ! Value |
− | ! Description | + | ! Description |
| |- | | |- |
− | | 0 | + | | 0 |
− | | DramId_EristaIcosaSamsung4gb | + | | EristaIcosaSamsung4gb |
| |- | | |- |
− | | 1 | + | | 1 |
− | | DramId_EristaIcosaHynix4gb | + | | EristaIcosaHynix4gb |
| |- | | |- |
− | | 2 | + | | 2 |
− | | DramId_EristaIcosaMicron4gb | + | | EristaIcosaMicron4gb |
| |- | | |- |
− | | 3 | + | | 3 |
− | | Reserved | + | | Reserved |
| |- | | |- |
− | | 4 | + | | 4 |
− | | DramId_EristaIcosaSamsung6gb | + | | EristaIcosaSamsung6gb |
| |- | | |- |
− | | 5 | + | | 5 |
− | | [4.0.0+] Reserved | + | | [4.0.0+] Reserved |
| |- | | |- |
− | | 6 | + | | 6 |
− | | [4.0.0+] Reserved | + | | [4.0.0+] Reserved |
| |- | | |- |
− | | 7 | + | | 7 |
− | | [5.0.0+] DramId_MarikoIowax1x2Samsung4gb ([4.0.0-4.1.0] Reserved) | + | | [5.0.0+] MarikoIowax1x2Samsung4gb ([4.0.0-4.1.0] Reserved) |
| |- | | |- |
− | | 8 | + | | 8 |
− | | [5.0.0+] DramId_MarikoIowaSamsung4gb | + | | [5.0.0+] MarikoIowaSamsung4gb |
| |- | | |- |
− | | 9 | + | | 9 |
− | | [5.0.0+] DramId_MarikoIowaSamsung8gb | + | | [5.0.0+] MarikoIowaSamsung8gb |
| |- | | |- |
− | | 10 | + | | 10 |
− | | [6.0.0+] DramId_MarikoIowaHynix4gb ([5.0.0-5.1.0] Reserved) | + | | [6.0.0+] MarikoIowaHynix4gb ([5.0.0-5.1.0] Reserved) |
| |- | | |- |
− | | 11 | + | | 11 |
− | | [7.0.0+] DramId_MarikoIowaMicron4gb ([5.0.0-6.2.0] Reserved) | + | | [7.0.0+] MarikoIowaMicron4gb ([5.0.0-6.2.0] Reserved) |
| |- | | |- |
− | | 12 | + | | 12 |
− | | [5.0.0+] DramId_MarikoHoagSamsung4gb | + | | [5.0.0+] MarikoHoagSamsung4gb |
| |- | | |- |
− | | 13 | + | | 13 |
− | | [5.0.0+] DramId_MarikoHoagSamsung8gb | + | | [5.0.0+] MarikoHoagSamsung8gb |
| |- | | |- |
− | | 14 | + | | 14 |
− | | [7.0.0+] DramId_MarikoHoagHynix4gb ([5.0.0-6.2.0] Reserved) | + | | [7.0.0+] MarikoHoagHynix4gb ([5.0.0-6.2.0] Reserved) |
| |- | | |- |
− | | 15 | + | | 15 |
− | | [7.0.0+] DramId_MarikoHoagMicron4gb ([5.0.0-6.2.0] Reserved) | + | | [7.0.0+] MarikoHoagMicron4gb ([5.0.0-6.2.0] Reserved) |
| |- | | |- |
− | | 16 | + | | 16 |
− | | [8.0.0+] DramId_MarikoIowaSamsung4gbY | + | | [8.0.0+] MarikoIowaSamsung4gbY |
| |- | | |- |
− | | 17 | + | | 17 |
− | | [9.0.0+] DramId_MarikoIowaSamsung1y4gbX | + | | [9.0.0+] MarikoIowaSamsung1y4gbX |
| |- | | |- |
− | | 18 | + | | 18 |
− | | [9.0.0+] DramId_MarikoIowaSamsung1y8gbX | + | | [9.0.0+] MarikoIowaSamsung1y8gbX |
| |- | | |- |
− | | 19 | + | | 19 |
− | | [9.0.0+] DramId_MarikoHoagSamsung1y4gbX | + | | [9.0.0+] MarikoHoagSamsung1y4gbX |
| |- | | |- |
− | | 20 | + | | 20 |
− | | [9.0.0+] DramId_MarikoIowaSamsung1y4gbY | + | | [9.0.0+] MarikoIowaSamsung1y4gbY |
| |- | | |- |
− | | 21 | + | | 21 |
− | | [9.0.0+] DramId_MarikoIowaSamsung1y8gbY | + | | [9.0.0+] MarikoIowaSamsung1y8gbY |
| |- | | |- |
− | | 22 | + | | 22 |
− | | [9.0.0+] DramId_MarikoIowaSamsung1y4gbA | + | | [9.0.0+] MarikoIowaSamsung1y4gbA |
| |} | | |} |
| + | |
| + | This is extracted directly from [[Fuse_registers#FUSE_RESERVED_ODM4|FUSE_RESERVED_ODM4]]. |
| | | |
| [[PCV_services|PCV]] selects memory training tables based on DramId. | | [[PCV_services|PCV]] selects memory training tables based on DramId. |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
− | ! SoC | + | ! SoC |
− | ! Platform | + | ! Platform |
− | ! DramId | + | ! DramId |
− | ! Revision | + | ! Revision |
− | ! DVFS version | + | ! DVFS version |
| |- | | |- |
− | | T210 | + | | T210 |
− | | jetson-tx1 | + | | jetson-tx1 |
− | | N/A | + | | N/A |
− | | 0x07 | + | | 0x07 |
| | | | | |
| 11_40800_01_V9.8.3_V1.6 | | 11_40800_01_V9.8.3_V1.6 |
Line 392: |
Line 345: |
| 11_1600000_02_V9.8.3_V1.6 | | 11_1600000_02_V9.8.3_V1.6 |
| |- | | |- |
− | | T210 | + | | T210 |
− | | nx-abcb | + | | nx-abcb |
− | | EristaIcosaSamsung4gb | + | | EristaIcosaSamsung4gb |
− | | 0x07 | + | | 0x07 |
| | | | | |
| 10_40800_NoCfgVersion_V9.8.7_V1.6 | | 10_40800_NoCfgVersion_V9.8.7_V1.6 |
Line 408: |
Line 361: |
| 10_1600000_NoCfgVersion_V9.8.7_V1.6 | | 10_1600000_NoCfgVersion_V9.8.7_V1.6 |
| |- | | |- |
− | | T210 | + | | T210 |
− | | nx-abcb | + | | nx-abcb |
− | | EristaIcosaMicron4gb | + | | EristaIcosaMicron4gb |
− | | 0x07 | + | | 0x07 |
| | | | | |
| 10_40800_NoCfgVersion_V9.8.4_V1.6 | | 10_40800_NoCfgVersion_V9.8.4_V1.6 |
Line 424: |
Line 377: |
| 10_1600000_NoCfgVersion_V9.8.4_V1.6 | | 10_1600000_NoCfgVersion_V9.8.4_V1.6 |
| |- | | |- |
− | | T210 | + | | T210 |
− | | nx-abcb | + | | nx-abcb |
− | | EristaIcosaHynix4gb | + | | EristaIcosaHynix4gb |
− | | 0x07 | + | | 0x07 |
| | | | | |
| 10_40800_NoCfgVersion_V9.8.4_V1.6 | | 10_40800_NoCfgVersion_V9.8.4_V1.6 |
Line 440: |
Line 393: |
| 10_1600000_NoCfgVersion_V9.8.4_V1.6 | | 10_1600000_NoCfgVersion_V9.8.4_V1.6 |
| |- | | |- |
− | | T210 | + | | T210 |
− | | nx-abca2 | + | | nx-abca2 |
− | | EristaIcosaSamsung4gb, EristaIcosaMicron4gb | + | | EristaIcosaSamsung4gb, EristaIcosaMicron4gb |
− | | 0x07 | + | | 0x07 |
| | | | | |
| 10_40800_NoCfgVersion_V9.8.7_V1.6 | | 10_40800_NoCfgVersion_V9.8.7_V1.6 |
Line 456: |
Line 409: |
| 10_1600000_NoCfgVersion_V9.8.7_V1.6 | | 10_1600000_NoCfgVersion_V9.8.7_V1.6 |
| |- | | |- |
− | | T210 | + | | T210 |
− | | nx-abca2 | + | | nx-abca2 |
− | | EristaIcosaHynix4gb | + | | EristaIcosaHynix4gb |
− | | 0x07 | + | | 0x07 |
| | | | | |
| 10_40800_NoCfgVersion_V9.8.7_V1.6 | | 10_40800_NoCfgVersion_V9.8.7_V1.6 |
Line 472: |
Line 425: |
| 10_1600000_NoCfgVersion_V9.8.7_V1.6 | | 10_1600000_NoCfgVersion_V9.8.7_V1.6 |
| |- | | |- |
− | | T210 | + | | T210 |
− | | nx-abca2 | + | | nx-abca2 |
− | | EristaIcosaSamsung6gb | + | | EristaIcosaSamsung6gb |
− | | 0x07 | + | | 0x07 |
| | | | | |
| 10_40800_NoCfgVersion_V9.8.7_V1.6 | | 10_40800_NoCfgVersion_V9.8.7_V1.6 |
Line 488: |
Line 441: |
| 10_1600000_NoCfgVersion_V9.8.7_V1.6 | | 10_1600000_NoCfgVersion_V9.8.7_V1.6 |
| |- | | |- |
− | | T214 | + | | T214 |
− | | nx-abca2, nx-abcb, nx-abcc | + | | nx-abca2, nx-abcb, nx-abcc |
− | | MarikoIowax1x2Samsung4gb | + | | MarikoIowax1x2Samsung4gb |
− | | 0x03 | + | | 0x03 |
| | | | | |
| 01_204000_NoCfgVersion_V0.3.1_V2.0 | | 01_204000_NoCfgVersion_V0.3.1_V2.0 |
Line 497: |
Line 450: |
| 01_1600000_NoCfgVersion_V0.3.1_V2.0 | | 01_1600000_NoCfgVersion_V0.3.1_V2.0 |
| |- | | |- |
− | | T214 | + | | T214 |
− | | nx-abca2, nx-abcb, nx-abcc | + | | nx-abca2, nx-abcb, nx-abcc |
− | | MarikoIowaSamsung4gb, MarikoHoagSamsung4gb | + | | MarikoIowaSamsung4gb, MarikoHoagSamsung4gb |
− | | 0x03 | + | | 0x03 |
| | | | | |
| 01_204000_NoCfgVersion_V0.3.1_V2.0 | | 01_204000_NoCfgVersion_V0.3.1_V2.0 |
Line 506: |
Line 459: |
| 01_1600000_NoCfgVersion_V0.3.1_V2.0 | | 01_1600000_NoCfgVersion_V0.3.1_V2.0 |
| |- | | |- |
− | | T214 | + | | T214 |
− | | nx-abca2, nx-abcb, nx-abcc | + | | nx-abca2, nx-abcb, nx-abcc |
− | | MarikoIowaSamsung8gb, MarikoHoagSamsung8gb | + | | MarikoIowaSamsung8gb, MarikoHoagSamsung8gb |
− | | 0x03 | + | | 0x03 |
| | | | | |
| 01_204000_NoCfgVersion_V0.4.2_V2.0 | | 01_204000_NoCfgVersion_V0.4.2_V2.0 |
Line 515: |
Line 468: |
| 01_1600000_NoCfgVersion_V0.4.2_V2.0 | | 01_1600000_NoCfgVersion_V0.4.2_V2.0 |
| |- | | |- |
− | | T214 | + | | T214 |
− | | nx-abca2, nx-abcb, nx-abcc | + | | nx-abca2, nx-abcb, nx-abcc |
− | | MarikoIowaHynix4gb, MarikoHoagHynix4gb | + | | MarikoIowaHynix4gb, MarikoHoagHynix4gb |
− | | 0x03 | + | | 0x03 |
| | | | | |
| 01_204000_NoCfgVersion_V0.3.1_V2.0 | | 01_204000_NoCfgVersion_V0.3.1_V2.0 |
Line 524: |
Line 477: |
| 01_1600000_NoCfgVersion_V0.3.1_V2.0 | | 01_1600000_NoCfgVersion_V0.3.1_V2.0 |
| |- | | |- |
− | | T214 | + | | T214 |
− | | nx-abca2, nx-abcb, nx-abcc | + | | nx-abca2, nx-abcb, nx-abcc |
− | | MarikoIowaMicron4gb, MarikoHoagMicron4gb | + | | MarikoIowaMicron4gb, MarikoHoagMicron4gb |
− | | 0x03 | + | | 0x03 |
| | | | | |
| 01_204000_NoCfgVersion_V0.4.2_V2.0 | | 01_204000_NoCfgVersion_V0.4.2_V2.0 |
Line 533: |
Line 486: |
| 01_1600000_NoCfgVersion_V0.4.2_V2.0 | | 01_1600000_NoCfgVersion_V0.4.2_V2.0 |
| |- | | |- |
− | | T214 | + | | T214 |
− | | nx-abca2, nx-abcb, nx-abcc | + | | nx-abca2, nx-abcb, nx-abcc |
− | | DramId_MarikoIowaSamsung4gbY | + | | MarikoIowaSamsung4gbY |
− | | 0x03 | + | | 0x03 |
| | | | | |
| 01_204000_NoCfgVersion_V0.4.2_V2.0 | | 01_204000_NoCfgVersion_V0.4.2_V2.0 |
Line 542: |
Line 495: |
| 01_1600000_NoCfgVersion_V0.4.2_V2.0 | | 01_1600000_NoCfgVersion_V0.4.2_V2.0 |
| |- | | |- |
− | | T214 | + | | T214 |
− | | nx-abca2, nx-abcb, nx-abcc | + | | nx-abca2, nx-abcb, nx-abcc |
− | | DramId_MarikoIowaSamsung1y4gbX | + | | MarikoIowaSamsung1y4gbX |
− | | 0x03 | + | | 0x03 |
| | | | | |
| 01_204000_NoCfgVersion_V0.4.2_V2.0 | | 01_204000_NoCfgVersion_V0.4.2_V2.0 |
Line 551: |
Line 504: |
| 01_1600000_NoCfgVersion_V0.4.2_V2.0 | | 01_1600000_NoCfgVersion_V0.4.2_V2.0 |
| |- | | |- |
− | | T214 | + | | T214 |
− | | nx-abca2, nx-abcb, nx-abcc | + | | nx-abca2, nx-abcb, nx-abcc |
− | | DramId_MarikoIowaSamsung1y8gbX | + | | MarikoIowaSamsung1y8gbX |
− | | 0x03 | + | | 0x03 |
| | | | | |
| 01_204000_NoCfgVersion_V0.4.2_V2.0 | | 01_204000_NoCfgVersion_V0.4.2_V2.0 |
Line 560: |
Line 513: |
| 01_1600000_NoCfgVersion_V0.4.2_V2.0 | | 01_1600000_NoCfgVersion_V0.4.2_V2.0 |
| |- | | |- |
− | | T214 | + | | T214 |
− | | nx-abca2, nx-abcb, nx-abcc | + | | nx-abca2, nx-abcb, nx-abcc |
− | | DramId_MarikoHoagSamsung1y4gbX | + | | MarikoHoagSamsung1y4gbX |
− | | 0x03 | + | | 0x03 |
| | | | | |
| 01_204000_NoCfgVersion_V0.4.2_V2.0 | | 01_204000_NoCfgVersion_V0.4.2_V2.0 |
Line 569: |
Line 522: |
| 01_1600000_NoCfgVersion_V0.4.2_V2.0 | | 01_1600000_NoCfgVersion_V0.4.2_V2.0 |
| |- | | |- |
− | | T214 | + | | T214 |
− | | nx-abca2, nx-abcb, nx-abcc | + | | nx-abca2, nx-abcb, nx-abcc |
− | | DramId_MarikoIowaSamsung1y4gbY | + | | MarikoIowaSamsung1y4gbY |
− | | 0x03 | + | | 0x03 |
| | | | | |
| 01_204000_NoCfgVersion_V0.4.2_V2.0 | | 01_204000_NoCfgVersion_V0.4.2_V2.0 |
Line 578: |
Line 531: |
| 01_1600000_NoCfgVersion_V0.4.2_V2.0 | | 01_1600000_NoCfgVersion_V0.4.2_V2.0 |
| |- | | |- |
− | | T214 | + | | T214 |
− | | nx-abca2, nx-abcb, nx-abcc | + | | nx-abca2, nx-abcb, nx-abcc |
− | | DramId_MarikoIowaSamsung1y8gbY | + | | MarikoIowaSamsung1y8gbY |
− | | 0x03 | + | | 0x03 |
| | | | | |
| 01_204000_NoCfgVersion_V0.4.2_V2.0 | | 01_204000_NoCfgVersion_V0.4.2_V2.0 |
Line 587: |
Line 540: |
| 01_1600000_NoCfgVersion_V0.4.2_V2.0 | | 01_1600000_NoCfgVersion_V0.4.2_V2.0 |
| |- | | |- |
− | | T214 | + | | T214 |
− | | nx-abca2, nx-abcb, nx-abcc | + | | nx-abca2, nx-abcb, nx-abcc |
− | | DramId_MarikoIowaSamsung1y4gbA | + | | MarikoIowaSamsung1y4gbA |
− | | 0x03 | + | | 0x03 |
| | | | | |
| 01_204000_NoCfgVersion_V0.4.5_V2.0 | | 01_204000_NoCfgVersion_V0.4.5_V2.0 |
Line 605: |
Line 558: |
| '''Erista''' memory is LPDDR4, while '''Mariko''' memory is LPDDR4X. | | '''Erista''' memory is LPDDR4, while '''Mariko''' memory is LPDDR4X. |
| | | |
− | ==== SecurityEngineIrqNumber ==== | + | ===== SecurityEngineIrqNumber ===== |
| SPL uses this for setting up the security engine IRQ. | | SPL uses this for setting up the security engine IRQ. |
| | | |
− | ==== Version ==== | + | ===== Version ===== |
| The current [[Package2#Versions|Package1 Maxver Constant]] - 1. | | The current [[Package2#Versions|Package1 Maxver Constant]] - 1. |
| | | |
− | ==== HardwareType ==== | + | ===== HardwareType ===== |
| [1.0.0+] This item is obtained by checking bits 8 and 2 from [[Fuse_registers#FUSE_RESERVED_ODM4|FUSE_RESERVED_ODM4]]. It can be: | | [1.0.0+] This item is obtained by checking bits 8 and 2 from [[Fuse_registers#FUSE_RESERVED_ODM4|FUSE_RESERVED_ODM4]]. It can be: |
| * 0 ('''Icosa'''; Erista retail and EDEV), if development flag (bit 8) is '''Retail''' and production flag (bit 2) is '''Production'''. | | * 0 ('''Icosa'''; Erista retail and EDEV), if development flag (bit 8) is '''Retail''' and production flag (bit 2) is '''Production'''. |
Line 639: |
Line 592: |
| It is still only 0 (Icosa) or 0xF (Invalid) in retail units. | | It is still only 0 (Icosa) or 0xF (Invalid) in retail units. |
| | | |
− | ==== IsRetail ==== | + | ===== IsRetail ===== |
| This item is obtained by checking bits 9 and 0-1 from [[Fuse_registers#FUSE_RESERVED_ODM4|FUSE_RESERVED_ODM4]]. It can be 0 (Debug), 1 (Retail) or 2 (Invalid). | | This item is obtained by checking bits 9 and 0-1 from [[Fuse_registers#FUSE_RESERVED_ODM4|FUSE_RESERVED_ODM4]]. It can be 0 (Debug), 1 (Retail) or 2 (Invalid). |
| | | |
− | ==== IsRecoveryBoot ==== | + | ===== IsRecoveryBoot ===== |
| Used to determine if the system is booting from SafeMode firmware. | | Used to determine if the system is booting from SafeMode firmware. |
| | | |
| Under normal circumstances, this just returns bit 0 of the active [[BCT#bootloader0_info|bootloader info]]'s attribute field. | | Under normal circumstances, this just returns bit 0 of the active [[BCT#bootloader0_info|bootloader info]]'s attribute field. |
| | | |
− | ==== DeviceId ==== | + | ===== DeviceId ===== |
| [[NIM_services|NIM]] checks if this item matches the [[Settings_services|set:cal]] DeviceId with byte7 cleared. If they don't match, a panic is thrown. | | [[NIM_services|NIM]] checks if this item matches the [[Settings_services|set:cal]] DeviceId with byte7 cleared. If they don't match, a panic is thrown. |
| | | |
− | ==== BootReason ==== | + | ===== BootReason ===== |
− | Used to determine how the system booted.
| |
− | | |
| {| class=wikitable | | {| class=wikitable |
| ! Value || Description | | ! Value || Description |
Line 667: |
Line 618: |
| |} | | |} |
| | | |
− | ==== MemoryArrange ==== | + | Used to determine how the system booted. |
− | [[Process Manager services|PM]] uses this item for selecting the appropriate size for each [[SVC#LimitableResource|LimitableResource_Memory]]. | + | |
| + | ===== MemoryMode ===== |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Bits |
| + | ! Description |
| + | |- |
| + | | 0-3 |
| + | | Purpose (0 = None, 1 = ForStandard, 2 = ForAppletDev, 3 = ForSystemDev) |
| + | |- |
| + | | 4-7 |
| + | | Size (0 = 4GB, 1 = 6GB, 2 = 8GB) |
| + | |} |
| + | |
| + | [[Process Manager services|PM]] and the kernel decide memory arrangement based on MemoryMode. |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! MemoryArrange |
| + | ! MemoryMode |
| + | ! Description |
| + | |- |
| + | | 0 |
| + | | 0x01 |
| + | | Standard |
| + | |- |
| + | | 1 |
| + | | 0x02 |
| + | | StandardForAppletDev |
| + | |- |
| + | | 2 |
| + | | 0x03 |
| + | | StandardForSystemDev |
| + | |- |
| + | | 3 |
| + | | 0x11 |
| + | | Expanded |
| + | |- |
| + | | 4 |
| + | | 0x12 |
| + | | ExpandedForAppletDev |
| + | |- |
| + | | 5 |
| + | | 0x21 |
| + | | ExpandedForMarikoDev |
| + | |} |
| | | |
− | ==== IsDebugMode ==== | + | ===== IsDebugMode ===== |
| Kernel uses this to determine behavior of svcBreak positive arguments. It will break instead of just force-exiting the process which is what happens on retail. | | Kernel uses this to determine behavior of svcBreak positive arguments. It will break instead of just force-exiting the process which is what happens on retail. |
| | | |
Line 679: |
Line 674: |
| The value of this field is loaded from [[BootConfig]] unsigned-config+0x10 u8 bit1. | | The value of this field is loaded from [[BootConfig]] unsigned-config+0x10 u8 bit1. |
| | | |
− | ==== KernelConfiguration ==== | + | ===== KernelConfiguration ===== |
| Kernel reads this when setting up memory-related code. | | Kernel reads this when setting up memory-related code. |
| | | |
Line 694: |
Line 689: |
| Bits 16-17 determine how much memory is available. 00/03 = 4 GB, 01 = 6 GB, 02 = 8 GB. | | Bits 16-17 determine how much memory is available. 00/03 = 4 GB, 01 = 6 GB, 02 = 8 GB. |
| | | |
− | ==== IsChargerHiZModeEnabled ==== | + | ===== IsChargerHiZModeEnabled ===== |
| This tells if the TI Charger (bq24192) is active. | | This tells if the TI Charger (bq24192) is active. |
| | | |
− | ==== KeyGeneration ==== | + | ===== KeyGeneration ===== |
| This item is obtained from [[Fuse_registers#FUSE_RESERVED_ODM2|FUSE_RESERVED_ODM2]] if bit 11 from [[Fuse_registers#FUSE_RESERVED_ODM4|FUSE_RESERVED_ODM4]] is set, [[Fuse_registers#FUSE_RESERVED_ODM0|FUSE_RESERVED_ODM0]] matches 0x8E61ECAE and [[Fuse_registers#FUSE_RESERVED_ODM1|FUSE_RESERVED_ODM1]] matches 0xF2BA3BB2. | | This item is obtained from [[Fuse_registers#FUSE_RESERVED_ODM2|FUSE_RESERVED_ODM2]] if bit 11 from [[Fuse_registers#FUSE_RESERVED_ODM4|FUSE_RESERVED_ODM4]] is set, [[Fuse_registers#FUSE_RESERVED_ODM0|FUSE_RESERVED_ODM0]] matches 0x8E61ECAE and [[Fuse_registers#FUSE_RESERVED_ODM1|FUSE_RESERVED_ODM1]] matches 0xF2BA3BB2. |
| | | |
| [5.0.0+] [[Filesystem services|FS]] can now use this value for the '''KeyGeneration''' parameter when calling [[#GenerateAesKek|GenerateAesKek]] during "GetBisEncryptionKey". | | [5.0.0+] [[Filesystem services|FS]] can now use this value for the '''KeyGeneration''' parameter when calling [[#GenerateAesKek|GenerateAesKek]] during "GetBisEncryptionKey". |
| | | |
− | ==== IsKiosk ==== | + | ===== IsKiosk ===== |
| This item is bit 10 from [[Fuse_registers#FUSE_RESERVED_ODM4|FUSE_RESERVED_ODM4]]. | | This item is bit 10 from [[Fuse_registers#FUSE_RESERVED_ODM4|FUSE_RESERVED_ODM4]]. |
| | | |
| [4.0.0+] [[Settings_services|Settings]] uses this value to overwrite the quest flag from [[Settings_services#set:sys|GetQuestFlag]]. This is used to detect if a Switch is a kiosk unit for display at retail stores. | | [4.0.0+] [[Settings_services|Settings]] uses this value to overwrite the quest flag from [[Settings_services#set:sys|GetQuestFlag]]. This is used to detect if a Switch is a kiosk unit for display at retail stores. |
| | | |
− | ==== RegulatorType ==== | + | ===== RegulatorType ===== |
− | This item is currently hardcoded to 0.
| |
− | | |
− | [5.0.0+] [[PCV_services|PCV]] uses this value in combination with [[#HardwareType|HardwareType]] to configure power blocks and memory tables for different hardware.
| |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
| |- | | |- |
− | ! Value | + | ! Value |
− | ! SoC | + | ! SoC |
− | ! GPU | + | ! GPU |
− | ! Power Blocks | + | ! Power Blocks |
| |- | | |- |
− | | 0 | + | | 0 |
− | | T210 | + | | T210 |
− | | GM20B (0x12B) | + | | GM20B (0x12B) |
− | | max77620_sd0, max77621_cpu and max77621_gpu | + | | max77620_sd0, max77621_cpu and max77621_gpu |
| |- | | |- |
− | | 1 | + | | 1 |
− | | T214 | + | | T214 |
− | | GM20B_B (0x12E) | + | | GM20B_B (0x12E) |
− | | max77620_sd0, max77812_cpu and max77812_gpu | + | | max77620_sd0, max77812_cpu and max77812_gpu |
| |- | | |- |
− | | 2 | + | | 2 |
− | | T214 | + | | T214 |
− | | GM20B_B (0x12E) | + | | GM20B_B (0x12E) |
− | | max77620_sd0, max77812_cpu and max77812_gpu | + | | max77620_sd0, max77812_cpu and max77812_gpu |
| |} | | |} |
| | | |
− | ==== Package2Hash ==== | + | This item is currently hardcoded to 0. |
| + | |
| + | [5.0.0+] [[PCV_services|PCV]] uses this value in combination with [[#HardwareType|HardwareType]] to configure power blocks and memory tables for different hardware. |
| + | |
| + | ===== Package2Hash ===== |
| This is a SHA-256 hash calculated over the [[Package2|package2]] image. Since the hash calculation is an optional step in pkg2ldr, this item is only valid in recovery mode. Otherwise, an error is returned instead. | | This is a SHA-256 hash calculated over the [[Package2|package2]] image. Since the hash calculation is an optional step in pkg2ldr, this item is only valid in recovery mode. Otherwise, an error is returned instead. |
| | | |
| === GenerateRandomBytes === | | === GenerateRandomBytes === |
− | Takes a '''size''' and returns '''rand_bytes'''. | + | Takes an u64 '''RndSize'''. Returns [[#Result]] and '''RndData'''. |
| | | |
− | The kernel limits '''size''' to 0x38 (for fitting in return registers). | + | The kernel limits '''RndSize''' to 0x38 (for fitting in return registers). |
| | | |
| === Panic === | | === Panic === |
− | Issues a system panic.
| + | Takes an u32 '''PanicColor''' and issues a system panic. |
| | | |
− | The kernel always calls this with '''panic_color''' set to 0xF00. | + | The kernel always calls this with '''PanicColor''' set to 0xF00. |
| | | |
| === ConfigureCarveout === | | === ConfigureCarveout === |
− | Configures memory controller carveout regions.
| + | Takes an u64 '''CarveoutIdx''', an u64 '''CarveoutAddr''' and an u64 '''CarveoutSize'''. Returns [[#Result]]. |
| | | |
− | If '''carveout_index''' is 0, '''region_phys_addr''' and '''region_size''' are used to configure '''MC_SECURITY_CARVEOUT4'''. | + | If '''CarveoutIdx''' is 0, '''CarveoutAddr''' and '''CarveoutSize''' are used to configure '''MC_SECURITY_CARVEOUT4'''. |
− | If '''carveout_index''' is 1, '''region_phys_addr''' and '''region_size''' are used to configure '''MC_SECURITY_CARVEOUT5'''. | + | If '''CarveoutIdx''' is 1, '''CarveoutAddr''' and '''CarveoutSize''' are used to configure '''MC_SECURITY_CARVEOUT5'''. |
− | Any other '''carveout_index''' values are invalid. | + | Any other '''CarveoutIdx''' values are invalid. |
| | | |
− | The kernel calls this with '''carveout_index''' set to 0, '''region_phys_addr''' set to 0x80060000 and '''region_size''' set to a dynamically calculated size which covers all the kernel and built-in sysmodules' DRAM regions. | + | The kernel calls this with '''CarveoutIdx''' set to 0, '''CarveoutAddr''' set to 0x80060000 and '''CarveoutSize''' set to a dynamically calculated size which covers all the kernel and built-in sysmodules' DRAM regions. |
| | | |
| === ReadWriteRegister === | | === ReadWriteRegister === |
| + | Takes an u64 '''RegAddr''', an u32 '''RwMask''' and an u32 '''InValue'''. Returns [[#Result]] and an u32 '''OutValue'''. |
| + | |
| Relays [[SVC#svcReadWriteRegister|svcReadWriteRegister]] to the Secure Monitor. | | Relays [[SVC#svcReadWriteRegister|svcReadWriteRegister]] to the Secure Monitor. |
| | | |
− | = Errors = | + | = CryptoUsecase = |
| + | {| class=wikitable |
| + | ! Value || Name |
| + | |- |
| + | | 0 || Aes |
| + | |- |
| + | | 1 || RsaPrivate |
| + | |- |
| + | | 2 || RsaSecureExpMod |
| + | |- |
| + | | 3 || TitleKey |
| + | |} |
| + | |
| + | TitleKey represents a RSA wrapped AES key. |
| + | |
| + | = CipherMode = |
| + | {| class=wikitable |
| + | ! Value || Name |
| + | |- |
| + | | 0 || CbcEncrypt |
| + | |- |
| + | | 1 || CbcDecrypt |
| + | |- |
| + | | 2 || Ctr |
| + | |} |
| + | |
| + | = DecryptOrImportMode = |
| + | {| class=wikitable |
| + | ! Value || Name |
| + | |- |
| + | | 0 || DecryptRsaPrivateKey |
| + | |- |
| + | | 1 || ImportLotusKey |
| + | |- |
| + | | 2 || ImportEsKey |
| + | |- |
| + | | 3 || ImportSslKey |
| + | |- |
| + | | 4 || ImportDrmKey |
| + | |} |
| + | |
| + | = SecureExpModMode = |
| + | {| class=wikitable |
| + | ! Value || Name |
| + | |- |
| + | | 0 || Lotus |
| + | |- |
| + | | 1 || Ssl |
| + | |- |
| + | | 2 || Drm |
| + | |} |
| + | |
| + | = Result = |
| {| class=wikitable | | {| class=wikitable |
| ! Value || Description | | ! Value || Description |
Line 775: |
Line 825: |
| | 5 || Invalid async operation | | | 5 || Invalid async operation |
| |- | | |- |
− | | [8.0.0+] 6 || Blacklisted | + | | [8.0.0+] 6 || Not permitted |
| |} | | |} |