Line 1: |
Line 1: |
− | = Secure Monitor Calls = | + | = SMC = |
− | | |
| 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 with a small change: |
| {| class=wikitable | | {| class=wikitable |
− | ! Bit number || Bit mask || Description | + | ! Bits || Description |
| |- | | |- |
− | | 31 || 0x80000000 || Set to 0 means Yielding Call; Set to 1 means Fast Call. | + | | 0-7 || Function Number |
| |- | | |- |
− | | 30 || 0x40000000 || Set to 0 means SMC32 convention; Set to 1 means SMC64. | + | | 8-15 || Argument Type |
| |- | | |- |
− | | 29-24 || 0x3F000000 || Service Call ranges. | + | | 16-23 || Reserved |
| |- | | |- |
− | | 23-16 || 0x00FF0000 || Must be zero. | + | | 24-29 || Call Range |
| |- | | |- |
− | | 15-8 || 0x0000FF00 || Argument type. This is different from the ARM SMC calling convention. | + | | 30 || Call Convention (0 = SMC32, 1 = SMC64) |
| |- | | |- |
− | | 7-0 || 0x000000FF || Function number within the range call type. | + | | 31 || Call Type (0 = Yielding Call, 1 = Fast Call) |
| |} | | |} |
| | | |
| If bit ''n'' is set in the argument type then parameter X''n'' is treated as a pointer and the kernel will setup address translation for it in [[SVC#svcCallSecureMonitor|svcCallSecureMonitor]]. | | If bit ''n'' is set in the argument type then parameter X''n'' is treated as a pointer and the kernel will setup address translation for it in [[SVC#svcCallSecureMonitor|svcCallSecureMonitor]]. |
| | | |
− | == Id 0 == | + | SMC arguments are passed using registers X0-X7 with X0 always sending the call sub-id and returning the result of the call. |
− | Functions exposed to user-mode processes using [[SVC|svcCallSecureMonitor]]. | + | |
| + | == FunctionId0 == |
| + | 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|GetConfig]] (same as in [[#FunctionId1]]) |
| |- | | |- |
− | | 0xC3000003 || CheckStatus || || | + | | 0xC3000003 || GetResult |
| |- | | |- |
− | | 0xC3000404 || GetResult || || | + | | 0xC3000404 || GetResultData |
| |- | | |- |
− | | 0xC3000E05 || ExpMod || || | + | | 0xC3000E05 || ModularExponentiate |
| |- | | |- |
− | | 0xC3000006 || GetRandomBytes (Same as Id 1 Sub-Id 5.) || || | + | | 0xC3000006 || [[#GenerateRandomBytes|GenerateRandomBytes]] (same as in [[#FunctionId1]]) |
| |- | | |- |
− | | 0xC3000007 || [[#GenerateAesKek]] || || | + | | 0xC3000007 || [[#GenerateAesKek|GenerateAesKek]] |
| |- | | |- |
− | | 0xC3000008 || [[#LoadAesKey]] || || | + | | 0xC3000008 || [[#LoadAesKey|LoadAesKey]] |
| |- | | |- |
− | | 0xC3000009 || [[#CryptAes]] || || | + | | 0xC3000009 || [[#ComputeAes|ComputeAes]] |
| |- | | |- |
− | | 0xC300000A || [[#GenerateSpecificAesKey]] || || | + | | 0xC300000A || [[#GenerateSpecificAesKey|GenerateSpecificAesKey]] |
| |- | | |- |
− | | 0xC300040B || [[#ComputeCmac]] || || | + | | 0xC300040B || [[#ComputeCmac|ComputeCmac]] |
| |- | | |- |
− | | 0xC300100C || [[#LoadRsaPrivateKey]] || || | + | | [1.0.0-4.1.0] 0xC300100C || [[#DecryptAndImportEsDeviceKey|DecryptAndImportEsDeviceKey]] |
| |- | | |- |
− | | 0xC300100D || [[#PrivateRsa]] || || | + | | [5.0.0+] 0xC300D60C || [[#ReencryptDeviceUniqueData|ReencryptDeviceUniqueData]] |
| |- | | |- |
− | | 0xC300100E || [[#LoadRsaPublicKey]] || || | + | | 0xC300100D || [[#DecryptDeviceUniqueData|DecryptDeviceUniqueData]] |
| |- | | |- |
− | | 0xC300060F || [[#PublicRsa]] || || | + | | [1.0.0-4.1.0] 0xC300100E || [[#DecryptAndImportLotusKey|DecryptAndImportLotusKey]] |
| |- | | |- |
− | | 0xC3000610 || [[#UnwrapRsaEncryptedAesKey]] || || | + | | 0xC300060F || [[#ModularExponentiateByStorageKey|ModularExponentiateByStorageKey]] |
| |- | | |- |
− | | 0xC3000011 || [[#LoadRsaWrappedAesKey]] || || | + | | 0xC3000610 || [[#PrepareEsDeviceUniqueKey|PrepareEsDeviceUniqueKey]] |
| |- | | |- |
− | | 0xC3000012 || [2.0.0+] GenerateRsaWrappedAesKek || || | + | | 0xC3000011 || [[#LoadPreparedAesKey|LoadPreparedAesKey]] |
| + | |- |
| + | | 0xC3000012 || [2.0.0+] [[#PrepareEsCommonKey|PrepareEsCommonKey]] |
| |} | | |} |
| | | |
Line 74: |
Line 77: |
| ** This means: Plaintext kek keys never leave TrustZone. | | ** This means: Plaintext kek keys never leave TrustZone. |
| ** Further, this means: Actual AES/RSA keys never leave TrustZone. | | ** Further, this means: Actual AES/RSA keys never leave TrustZone. |
| + | |
| + | === GenerateRandomBytes === |
| + | Takes an u64 '''Size'''. Returns [[#Result]] and '''RandomBytes'''. |
| + | |
| + | '''Size''' is limited to 0x38 (for fitting in return registers). |
| | | |
| === GenerateAesKek === | | === GenerateAesKek === |
Line 83: |
Line 91: |
| 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 CryptoUsecase_Aes. | + | The session kek must have been created with [[#CryptoUsecase|CryptoUsecase Aes]]. |
| | | |
− | === CryptAes === | + | === ComputeAes === |
− | Encrypts/decrypts using Aes (CTR and CBC). | + | Encrypts/decrypts using AES (CTR and CBC). Takes an [[#CipherMode]]. |
| | | |
− | Key must be set prior using one of the [[#LoadAesKey]], [[#GenerateSpecificAesKey]] or [[#LoadRsaWrappedAesKey]] commands. | + | Key must be set prior using one of the [[#LoadAesKey]] or [[#GenerateSpecificAesKey]] commands. |
| | | |
| === GenerateSpecificAesKey === | | === GenerateSpecificAesKey === |
− | Todo: This one seems unrelated to [[#CryptoUsecase]].
| + | Takes a wrapped AES key and decrypts it using static data. |
| + | |
| + | === ComputeCmac === |
| + | Calculates CMAC over input data. |
| + | |
| + | === DecryptAndImportEsDeviceKey === |
| + | Takes a session kek created with [[#GenerateAesKek]], a wrapped AES key, and a wrapped RSA private key. |
| | | |
− | === LoadRsaPrivateKey ===
| + | The session kek must have been created with [[#CryptoUsecase|CryptoUsecase TitleKey]]. |
− | Takes a session kek created with [[#GenerateAesKek]], and a wrapped RSA private key.
| |
| | | |
− | The session kek must have been created with CryptoUsecase_PrivateRsa.
| + | [5.0.0] This function was removed and replaced with [[#ReencryptDeviceUniqueData]]. |
| | | |
− | === PrivateRsa === | + | === ReencryptDeviceUniqueData === |
− | Encrypts using Rsa private key.
| + | Takes in two session keks created with [[#GenerateAesKek]], two wrapped AES keys, an enum member, and a wrapped RSA private key. |
| | | |
− | Key must be set prior using the [[#LoadRsaPrivateKey]] command.
| + | Decrypts and validates the wrapped RSA private key with the first kek/wrapped key, and re-encrypts it with the second if valid. |
| | | |
− | === LoadRsaPublicKey ===
| + | The re-encrypted key is then passed to the user, for use with [[#DecryptDeviceUniqueData]]. |
− | Takes a session kek created with [[#GenerateAesKek]], and a wrapped RSA public key.
| |
| | | |
− | The session kek must have been created with CryptoUsecase_PublicRsa.
| + | === DecryptDeviceUniqueData === |
| + | Takes a session kek created with [[#GenerateAesKek]], a wrapped AES key, an enum member, and a wrapped RSA private key. |
| | | |
− | === PublicRsa ===
| + | The session kek must have been created with [[#CryptoUsecase|CryptoUsecase RsaPrivate]]. |
− | Encrypts using Rsa public key.
| |
| | | |
− | Key must be set prior using the [[#LoadRsaPublicKey]] command.
| + | [4.0.0+] The SMC handler when certain conditions pass and FunctionId0==0xC300100D now returns error 0x6 instead of calling the handler funcptr. |
| | | |
− | === UnwrapRsaEncryptedAesKey ===
| + | [5.0.0+] This function now takes an additional input [[#DecryptOrImportMode]]. This extends the original functionality to enable importing private keys into the security engine instead of decrypting them. |
− | Takes a session kek created with [[#GenerateAesKek]], and a wrapped RSA public key.
| |
| | | |
− | Returns a session-unique AES key especially for use in [[#LoadRsaWrappedAesKey]].
| + | === DecryptAndImportLotusKey === |
| + | Takes a session kek created with [[#GenerateAesKek]], and a wrapped RSA key. |
| | | |
− | The session kek must have been created with CryptoUsecase_RsaWrappedAesKey. | + | The session kek must have been created with [[#CryptoUsecase|CryptoUsecase RsaSecureExpMod]]. |
| | | |
− | === LoadRsaWrappedAesKey === | + | [5.0.0] This function was removed. |
− | Takes a session-unique AES key from [[#UnwrapRsaEncryptedAesKey]]. | + | |
| + | === ModularExponentiateByStorageKey === |
| + | Performs an ExpMod operation using an exponent previously loaded with the [[#DecryptAndImportLotusKey]] command. |
| + | |
| + | [5.0.0+] This now uses any exponent previously loaded with [[#DecryptDeviceUniqueData]] and takes an [[#SecureExpModMode]]. |
| + | |
| + | === PrepareEsDeviceUniqueKey === |
| + | Takes an Rsa-Oaep-wrapped TitleKey, an RSA Public Key, and a label hash. |
| + | |
| + | Performs an ExpMod operation using an exponent previously loaded with the [[#DecryptAndImportEsDeviceKey]] command, and then validates/extracts a Titlekey from the resulting message. |
| + | |
| + | Returns a session-unique AES key especially for use in [[#LoadTitleKey]]. |
| + | |
| + | [5.0.0+] This now uses any exponent previously loaded with [[#DecryptDeviceUniqueData]]. |
| + | |
| + | === LoadPreparedAesKey === |
| + | Takes a session-unique AES key from [[#PrepareEsCommonKey]] or [[#PrepareEsDeviceUniqueKey]]. |
| + | |
| + | === PrepareEsCommonKey === |
| + | Takes an AES-wrapped common TitleKey and returns a sealed AES key. |
| + | |
| + | == FunctionId1 == |
| + | Functions exposed to the kernel internally. |
| | | |
− | === enum CryptoUsecase ===
| |
| {| class=wikitable | | {| class=wikitable |
| ! Value || Name | | ! Value || Name |
| |- | | |- |
− | | 0 || CryptoUsecase_Aes | + | | 0xC4000001 || [[#SuspendCpu|SuspendCpu]] |
| + | |- |
| + | | 0x84000002 || [[#PowerOffCpu|PowerOffCpu]] |
| + | |- |
| + | | 0xC4000003 || [[#PowerOnCpu|PowerOnCpu]] |
| + | |- |
| + | | 0xC3000004 || [[#GetConfig|GetConfig]] (same as in [[#FunctionId0]]) |
| + | |- |
| + | | 0xC3000005 || [[#GenerateRandomBytes|GenerateRandomBytesNonBlocking]] |
| |- | | |- |
− | | 1 || CryptoUsecase_PrivateRsa | + | | 0xC3000006 || [[#ShowError|ShowError]] |
| |- | | |- |
− | | 2 || CryptoUsecase_PublicRsa | + | | 0xC3000007 || [2.0.0+] [[#SetKernelCarveoutRegion|SetKernelCarveoutRegion]] |
| |- | | |- |
− | | 3 || CryptoUsecase_RsaWrappedAesKey | + | | 0xC3000008 || [2.0.0+] [[#ReadWriteRegister|ReadWriteRegister]] |
| |} | | |} |
| | | |
− | == Id 1 == | + | === SuspendCpu === |
− | Functions exposed to the kernel internally.
| + | Takes an u64 '''PowerState''', an u64 '''EntrypointAddress''' and an u64 '''ContextId'''. No output. |
| + | |
| + | Suspends the CPU (CPU0). |
| + | |
| + | The kernel calls this SMC on shutdown with '''PowerState''' set to 0x0201001B (power level: 0x02==system; power type: 0x01==powerdown; ID: 0x1B). |
| + | |
| + | === PowerOffCpu === |
| + | No input/output. |
| + | |
| + | Turns off the CPU (CPU1, CPU2 or CPU3). |
| + | |
| + | === PowerOnCpu === |
| + | Takes an u64 '''TargetCpu''', an u64 '''EntrypointAddress''' and an u64 '''ContextId'''. Returns [[#Result]]. |
| + | |
| + | Turns on the CPU (CPU1, CPU2 or CPU3). |
| + | |
| + | === GetConfig === |
| + | Takes a [[#ConfigItem]]. Returns [[#Result]] and a '''ConfigValue'''. |
| + | |
| + | ==== ConfigItem ==== |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Value || Name |
| + | |- |
| + | | 1 || [[#DisableProgramVerification]] |
| + | |- |
| + | | 2 || [[#DramId]] |
| + | |- |
| + | | 3 || [[#SecurityEngineInterruptNumber]] |
| + | |- |
| + | | 4 || [[#FuseVersion]] |
| + | |- |
| + | | 5 || [[#HardwareType]] |
| + | |- |
| + | | 6 || [[#HardwareState]] |
| + | |- |
| + | | 7 || [[#IsRecoveryBoot]] |
| + | |- |
| + | | 8 || [[#DeviceId]] |
| + | |- |
| + | | 9 || [1.0.0-4.0.0] [[#BootReason]] |
| + | |- |
| + | | 10 || [[#MemoryMode]] |
| + | |- |
| + | | 11 || [[#IsDevelopmentFunctionEnabled]] |
| + | |- |
| + | | 12 || [[#KernelConfiguration]] |
| + | |- |
| + | | 13 || [[#IsChargerHiZModeEnabled]] |
| + | |- |
| + | | 14 || [4.0.0+] [[#RetailInteractiveDisplayState]] |
| + | |- |
| + | | 15 || [5.0.0+] [[#RegulatorType]] |
| + | |- |
| + | | 16 || [5.0.0+] [[#DeviceUniqueKeyGeneration]] |
| + | |- |
| + | | 17 || [5.0.0+] [[#Package2Hash]] |
| + | |} |
| + | |
| + | ===== DisableProgramVerification ===== |
| + | [[Process Manager services|PM]] checks this item and if non-zero, calls fsp-pr SetEnabledProgramVerification(false). |
| + | |
| + | ===== DramId ===== |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Value |
| + | ! Description |
| + | |- |
| + | | 0 |
| + | | EristaIcosaSamsung4gb |
| + | |- |
| + | | 1 |
| + | | EristaIcosaHynix4gb |
| + | |- |
| + | | 2 |
| + | | EristaIcosaMicron4gb |
| + | |- |
| + | | 3 |
| + | | [11.0.0+] MarikoIowaHynix1y4gb ([1.0.0-10.2.0] EristaCopperSamsung4gb) |
| + | |- |
| + | | 4 |
| + | | EristaIcosaSamsung6gb |
| + | |- |
| + | | 5 |
| + | | [12.0.0+] MarikoHoagHynix1y4gb ([4.0.0-11.0.1] EristaCopperHynix4gb) |
| + | |- |
| + | | 6 |
| + | | [13.0.0+] MarikoAulaHynix1y4gb ([4.0.0-12.1.0] EristaCopperMicron4gb) |
| + | |- |
| + | | 7 |
| + | | [15.0.0+] Reserved ([5.0.0-14.1.2] MarikoIowax1x2Samsung4gb, [4.0.0-4.1.0] Reserved) |
| + | |- |
| + | | 8 |
| + | | [5.0.0+] MarikoIowaSamsung4gb |
| + | |- |
| + | | 9 |
| + | | [5.0.0+] MarikoIowaSamsung8gb |
| + | |- |
| + | | 10 |
| + | | [6.0.0+] MarikoIowaHynix4gb ([5.0.0-5.1.0] Reserved) |
| + | |- |
| + | | 11 |
| + | | [7.0.0+] MarikoIowaMicron4gb ([5.0.0-6.2.0] Reserved) |
| + | |- |
| + | | 12 |
| + | | [5.0.0+] MarikoHoagSamsung4gb |
| + | |- |
| + | | 13 |
| + | | [5.0.0+] MarikoHoagSamsung8gb |
| + | |- |
| + | | 14 |
| + | | [7.0.0+] MarikoHoagHynix4gb ([5.0.0-6.2.0] Reserved) |
| + | |- |
| + | | 15 |
| + | | [7.0.0+] MarikoHoagMicron4gb ([5.0.0-6.2.0] Reserved) |
| + | |- |
| + | | 16 |
| + | | [15.0.0+] Reserved ([8.0.0-14.1.2] MarikoIowaSamsung4gbY) |
| + | |- |
| + | | 17 |
| + | | [9.0.0+] MarikoIowaSamsung1y4gbX |
| + | |- |
| + | | 18 |
| + | | [9.0.0+] MarikoIowaSamsung1y8gbX |
| + | |- |
| + | | 19 |
| + | | [9.0.0+] MarikoHoagSamsung1y4gbX |
| + | |- |
| + | | 20 |
| + | | [14.0.0+] MarikoIowaSamsung1z4gb ([9.0.0-13.2.1] MarikoIowaSamsung1y4gbY) |
| + | |- |
| + | | 21 |
| + | | [14.0.0+] MarikoHoagSamsung1z4gb ([9.0.0-13.2.1] MarikoIowaSamsung1y8gbY) |
| + | |- |
| + | | 22 |
| + | | [14.0.0+] MarikoAulaSamsung1z4gb ([13.0.0-13.2.1] Reserved, [9.0.0-12.1.0] MarikoAulaSamsung1y4gb) |
| + | |- |
| + | | 23 |
| + | | [10.0.0+] MarikoHoagSamsung1y8gbX |
| + | |- |
| + | | 24 |
| + | | [10.0.0+] MarikoAulaSamsung1y4gbX |
| + | |- |
| + | | 25 |
| + | | [11.0.0+] MarikoIowaMicron1y4gb |
| + | |- |
| + | | 26 |
| + | | [11.0.0+] MarikoHoagMicron1y4gb |
| + | |- |
| + | | 27 |
| + | | [11.0.0+] MarikoAulaMicron1y4gb |
| + | |- |
| + | | 28 |
| + | | [11.0.0+] MarikoAulaSamsung1y8gbX |
| + | |- |
| + | | 29 |
| + | | [16.0.0+] MarikoIowaHynix1a4gb ([15.0.0-15.0.1] MarikoIowax1x2Samsung4gb) |
| + | |- |
| + | | 30 |
| + | | [16.0.0+] MarikoHoagHynix1a4gb ([15.0.0-15.0.1] MarikoHoagx1x2Samsung4gb) |
| + | |- |
| + | | 31 |
| + | | [16.0.0+] MarikoAulaHynix1a4gb ([15.0.0-15.0.1] MarikoAulax1x2Samsung4gb) |
| + | |- |
| + | | 32 |
| + | | [16.0.0+] MarikoIowaMicron1a4gb ([15.0.0-15.0.1] MarikoIowaSamsung4gbY) |
| + | |- |
| + | | 33 |
| + | | [16.0.0+] MarikoHoagMicron1a4gb ([15.0.0-15.0.1] MarikoHoagSamsung4gbY) |
| + | |- |
| + | | 34 |
| + | | [16.0.0+] MarikoAulaMicron1a4gb ([15.0.0-15.0.1] MarikoAulaSamsung4gbY) |
| + | |} |
| + | |
| + | This is extracted directly from [[Fuse_registers#FUSE_RESERVED_ODM4|FUSE_RESERVED_ODM4]]. |
| + | |
| + | [[PCV_services|PCV]] selects memory training tables based on DramId. |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! SocType |
| + | ! Platform |
| + | ! DramId |
| + | ! Revision |
| + | ! DVFS |
| + | |- |
| + | | Erista |
| + | | jetson-tx1 |
| + | | N/A |
| + | | 0x07 |
| + | | |
| + | 11_40800_01_V9.8.3_V1.6 |
| + | 11_68000_01_V9.8.3_V1.6 |
| + | 11_102000_01_V9.8.3_V1.6 |
| + | 11_204000_05_V9.8.3_V1.6 |
| + | 11_408000_02_V9.8.3_V1.6 |
| + | 11_665600_03_V9.8.3_V1.6 |
| + | 11_800000_01_V9.8.3_V1.6 |
| + | 11_1065600_01_V9.8.3_V1.6 |
| + | 11_1331200_01_V9.8.3_V1.6 |
| + | 11_1600000_02_V9.8.3_V1.6 |
| + | |- |
| + | | Erista |
| + | | nx-abcb |
| + | | EristaIcosaSamsung4gb |
| + | | 0x07 |
| + | | |
| + | 10_40800_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_68000_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_102000_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_204000_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_408000_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_665600_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_800000_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_1065600_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_1331200_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_1600000_NoCfgVersion_V9.8.7_V1.6 |
| + | |- |
| + | | Erista |
| + | | nx-abcb |
| + | | EristaIcosaMicron4gb |
| + | | 0x07 |
| + | | |
| + | 10_40800_NoCfgVersion_V9.8.4_V1.6 |
| + | 10_68000_NoCfgVersion_V9.8.4_V1.6 |
| + | 10_102000_NoCfgVersion_V9.8.4_V1.6 |
| + | 10_204000_NoCfgVersion_V9.8.4_V1.6 |
| + | 10_408000_NoCfgVersion_V9.8.4_V1.6 |
| + | 10_665600_NoCfgVersion_V9.8.4_V1.6 |
| + | 10_800000_NoCfgVersion_V9.8.4_V1.6 |
| + | 10_1065600_NoCfgVersion_V9.8.4_V1.6 |
| + | 10_1331200_NoCfgVersion_V9.8.4_V1.6 |
| + | 10_1600000_NoCfgVersion_V9.8.4_V1.6 |
| + | |- |
| + | | Erista |
| + | | nx-abcb |
| + | | EristaIcosaHynix4gb |
| + | | 0x07 |
| + | | |
| + | 10_40800_NoCfgVersion_V9.8.4_V1.6 |
| + | 10_68000_NoCfgVersion_V9.8.4_V1.6 |
| + | 10_102000_NoCfgVersion_V9.8.4_V1.6 |
| + | 10_204000_NoCfgVersion_V9.8.4_V1.6 |
| + | 10_408000_NoCfgVersion_V9.8.4_V1.6 |
| + | 10_665600_NoCfgVersion_V9.8.4_V1.6 |
| + | 10_800000_NoCfgVersion_V9.8.4_V1.6 |
| + | 10_1065600_NoCfgVersion_V9.8.4_V1.6 |
| + | 10_1331200_NoCfgVersion_V9.8.4_V1.6 |
| + | 10_1600000_NoCfgVersion_V9.8.4_V1.6 |
| + | |- |
| + | | Erista |
| + | | nx-abca2 |
| + | | EristaIcosaSamsung4gb, EristaIcosaMicron4gb |
| + | | 0x07 |
| + | | |
| + | 10_40800_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_68000_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_102000_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_204000_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_408000_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_665600_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_800000_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_1065600_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_1331200_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_1600000_NoCfgVersion_V9.8.7_V1.6 |
| + | |- |
| + | | Erista |
| + | | nx-abca2 |
| + | | EristaIcosaHynix4gb |
| + | | 0x07 |
| + | | |
| + | 10_40800_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_68000_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_102000_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_204000_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_408000_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_665600_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_800000_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_1065600_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_1331200_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_1600000_NoCfgVersion_V9.8.7_V1.6 |
| + | |- |
| + | | Erista |
| + | | nx-abca2 |
| + | | EristaIcosaSamsung6gb |
| + | | 0x07 |
| + | | |
| + | 10_40800_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_68000_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_102000_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_204000_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_408000_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_665600_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_800000_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_1065600_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_1331200_NoCfgVersion_V9.8.7_V1.6 |
| + | 10_1600000_NoCfgVersion_V9.8.7_V1.6 |
| + | |- |
| + | | Mariko |
| + | | nx-abca2, nx-abcb, nx-abcc, nx-abcd |
| + | | MarikoIowax1x2Samsung4gb |
| + | | 0x03 |
| + | | |
| + | 01_204000_NoCfgVersion_V0.3.1_V2.0 |
| + | 01_1331200.0_NoCfgVersion_V0.3.1_V2.0 |
| + | 01_1600000_NoCfgVersion_V0.3.1_V2.0 |
| + | |- |
| + | | Mariko |
| + | | nx-abca2, nx-abcb, nx-abcc, nx-abcd |
| + | | MarikoIowaSamsung4gb, MarikoHoagSamsung4gb |
| + | | 0x03 |
| + | | |
| + | 01_204000_NoCfgVersion_V0.3.1_V2.0 |
| + | 01_1331200.0_NoCfgVersion_V0.3.1_V2.0 |
| + | 01_1600000_NoCfgVersion_V0.3.1_V2.0 |
| + | |- |
| + | | Mariko |
| + | | nx-abca2, nx-abcb, nx-abcc, nx-abcd |
| + | | MarikoIowaSamsung8gb, MarikoHoagSamsung8gb |
| + | | 0x03 |
| + | | |
| + | 01_204000_NoCfgVersion_V0.4.2_V2.0 |
| + | 01_1331200.0_NoCfgVersion_V0.4.2_V2.0 |
| + | 01_1600000_NoCfgVersion_V0.4.2_V2.0 |
| + | |- |
| + | | Mariko |
| + | | nx-abca2, nx-abcb, nx-abcc, nx-abcd |
| + | | MarikoIowaHynix4gb, MarikoHoagHynix4gb |
| + | | 0x03 |
| + | | |
| + | 01_204000_NoCfgVersion_V0.3.1_V2.0 |
| + | 01_1331200.0_NoCfgVersion_V0.3.1_V2.0 |
| + | 01_1600000_NoCfgVersion_V0.3.1_V2.0 |
| + | |- |
| + | | Mariko |
| + | | nx-abca2, nx-abcb, nx-abcc, nx-abcd |
| + | | MarikoIowaMicron4gb, MarikoHoagMicron4gb |
| + | | 0x03 |
| + | | |
| + | 01_204000_NoCfgVersion_V0.4.2_V2.0 |
| + | 01_1331200.0_NoCfgVersion_V0.4.2_V2.0 |
| + | 01_1600000_NoCfgVersion_V0.4.2_V2.0 |
| + | |- |
| + | | Mariko |
| + | | nx-abca2, nx-abcb, nx-abcc, nx-abcd |
| + | | MarikoIowaSamsung4gbY |
| + | | 0x03 |
| + | | |
| + | 01_204000_NoCfgVersion_V0.4.2_V2.0 |
| + | 01_1331200.0_NoCfgVersion_V0.4.2_V2.0 |
| + | 01_1600000_NoCfgVersion_V0.4.2_V2.0 |
| + | |- |
| + | | Mariko |
| + | | nx-abca2, nx-abcb, nx-abcc, nx-abcd |
| + | | MarikoIowaSamsung1y4gbX |
| + | | 0x03 |
| + | | |
| + | 01_204000_NoCfgVersion_V0.4.2_V2.0 |
| + | 01_1331200.0_NoCfgVersion_V0.4.2_V2.0 |
| + | 01_1600000_NoCfgVersion_V0.4.2_V2.0 |
| + | |- |
| + | | Mariko |
| + | | nx-abca2, nx-abcb, nx-abcc, nx-abcd |
| + | | MarikoIowaSamsung1y8gbX |
| + | | 0x03 |
| + | | |
| + | 01_204000_NoCfgVersion_V0.4.2_V2.0 |
| + | 01_1331200.0_NoCfgVersion_V0.4.2_V2.0 |
| + | 01_1600000_NoCfgVersion_V0.4.2_V2.0 |
| + | |- |
| + | | Mariko |
| + | | nx-abca2, nx-abcb, nx-abcc, nx-abcd |
| + | | MarikoHoagSamsung1y4gbX |
| + | | 0x03 |
| + | | |
| + | 01_204000_NoCfgVersion_V0.4.2_V2.0 |
| + | 01_1331200.0_NoCfgVersion_V0.4.2_V2.0 |
| + | 01_1600000_NoCfgVersion_V0.4.2_V2.0 |
| + | |- |
| + | | Mariko |
| + | | nx-abca2, nx-abcb, nx-abcc, nx-abcd |
| + | | MarikoIowaSamsung1y4gbY |
| + | | 0x03 |
| + | | |
| + | 01_204000_NoCfgVersion_V0.4.2_V2.0 |
| + | 01_1331200.0_NoCfgVersion_V0.4.2_V2.0 |
| + | 01_1600000_NoCfgVersion_V0.4.2_V2.0 |
| + | |- |
| + | | Mariko |
| + | | nx-abca2, nx-abcb, nx-abcc, nx-abcd |
| + | | MarikoIowaSamsung1y8gbY |
| + | | 0x03 |
| + | | |
| + | 01_204000_NoCfgVersion_V0.4.2_V2.0 |
| + | 01_1331200.0_NoCfgVersion_V0.4.2_V2.0 |
| + | 01_1600000_NoCfgVersion_V0.4.2_V2.0 |
| + | |- |
| + | | Mariko |
| + | | nx-abca2, nx-abcb, nx-abcc, nx-abcd |
| + | | MarikoIowaSamsung1y4gbA |
| + | | 0x03 |
| + | | |
| + | 01_204000_NoCfgVersion_V0.4.5_V2.0 |
| + | 01_1331200.0_NoCfgVersion_V0.4.5_V2.0 |
| + | 01_1600000_NoCfgVersion_V0.4.5_V2.0 |
| + | |} |
| + | |
| + | '''nx-abca2''' ('''Icosa''' in '''Erista''', '''Iowa''' in '''Mariko''') hardware types are variations of the retail, EDEV and SDEV form factors. |
| + | |
| + | '''nx-abcb''' ('''Copper''' in '''Erista''', '''Calcio''' in '''Mariko''') is unreleased. Among other differences, this has extra hardware to support HDMI output. |
| + | |
| + | [8.0.0+] '''nx-abcc''' ('''Hoag''') was added for the Lite retail and HDEV form factors. |
| + | |
| + | [10.0.0+] '''nx-abcd''' ('''Aula''') was added for the OLED Model retail and ADEV form factors. |
| + | |
| + | '''Erista''' memory is LPDDR4, while '''Mariko''' memory is LPDDR4X. |
| + | |
| + | ===== SecurityEngineInterruptNumber ===== |
| + | SPL uses this for setting up the security engine IRQ. |
| + | |
| + | ===== FuseVersion ===== |
| + | The current [[Package2#Versions|bootloader maximum version]] - 1. |
| + | |
| + | ===== HardwareType ===== |
| + | {| class=wikitable |
| + | ! Value || Description |
| + | |- |
| + | | 0 || Icosa |
| + | |- |
| + | | 1 || Copper |
| + | |- |
| + | | 2 || [8.0.0+] Hoag ([1.0.0-7.0.1] Invalid) |
| + | |- |
| + | | 3 || [4.0.0+] Iowa |
| + | |- |
| + | | 4 || [8.0.0+] Calcio |
| + | |- |
| + | | 5 || [10.0.0+] Aula |
| + | |- |
| + | | 15 || Invalid |
| + | |} |
| + | |
| + | [1.0.0+] This item is obtained by checking bits 8 and 2 from [[Fuse_registers#FUSE_RESERVED_ODM4|FUSE_RESERVED_ODM4]]. |
| + | |
| + | [4.0.0+] This item is obtained by checking bits 8, 2 and 16-19 from [[Fuse_registers#FUSE_RESERVED_ODM4|FUSE_RESERVED_ODM4]]. |
| + | |
| + | [7.0.0+] This item can now only be 0 (Icosa) or 15 (Invalid) in Erista units. |
| + | |
| + | Hardware is '''Icosa''' (Erista retail, EDEV and SDEV) if [[Fuse_registers#FUSE_RESERVED_ODM4|HardwareType1]] (bit 2) is 1 and [[Fuse_registers#FUSE_RESERVED_ODM4|HardwareType2]] (bit 8) is 0. |
| + | |
| + | Hardware is '''Copper''' (unreleased Erista model) if [[Fuse_registers#FUSE_RESERVED_ODM4|HardwareType1]] (bit 2) is 0 and [[Fuse_registers#FUSE_RESERVED_ODM4|HardwareType2]] (bit 8) is 1. |
| + | |
| + | [4.0.0+] Hardware is '''Iowa''' (Mariko retail, EDEV and SDEV) if [[Fuse_registers#FUSE_RESERVED_ODM4|HardwareType3]] (bits 16-19) is 1. |
| + | |
| + | [8.0.0+] Hardware is '''Hoag''' (Mariko Lite retail and HDEV) if [[Fuse_registers#FUSE_RESERVED_ODM4|HardwareType3]] (bits 16-19) is 2. |
| + | |
| + | [8.0.0+] Hardware is '''Calcio''' (unreleased Mariko model) if [[Fuse_registers#FUSE_RESERVED_ODM4|HardwareType1]] (bit 2) is 0 and [[Fuse_registers#FUSE_RESERVED_ODM4|HardwareType2]] (bit 8) is 1. |
| + | |
| + | [10.0.0+] Hardware is '''Aula''' (Mariko OLED Model retail and ADEV) if [[Fuse_registers#FUSE_RESERVED_ODM4|HardwareType3]] (bits 16-19) is 4. |
| + | |
| + | ===== HardwareState ===== |
| + | {| class=wikitable |
| + | ! Value || Description |
| + | |- |
| + | | 0 || Development |
| + | |- |
| + | | 1 || Production |
| + | |- |
| + | | 2 || Invalid |
| + | |} |
| + | |
| + | This item is obtained by checking bits 9 and 0-1 from [[Fuse_registers#FUSE_RESERVED_ODM4|FUSE_RESERVED_ODM4]]. |
| + | |
| + | Hardware is '''Development''' if [[Fuse_registers#FUSE_RESERVED_ODM4|HardwareState1]] (bits 0-1) is 3 and [[Fuse_registers#FUSE_RESERVED_ODM4|HardwareState2]] (bit 9) is 0. |
| + | |
| + | Hardware is '''Production''' if [[Fuse_registers#FUSE_RESERVED_ODM4|HardwareState1]] (bits 0-1) is 0 and [[Fuse_registers#FUSE_RESERVED_ODM4|HardwareState2]] (bit 9) is 1. |
| + | |
| + | ===== IsRecoveryBoot ===== |
| + | 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. |
| + | |
| + | ===== 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. |
| + | |
| + | ===== BootReason ===== |
| + | {| class=wikitable |
| + | ! Value || Description |
| + | |- |
| + | | 0 || Invalid |
| + | |- |
| + | | 1 || AcOk |
| + | |- |
| + | | 2 || OnKey |
| + | |- |
| + | | 3 || RtcAlarm1 |
| + | |- |
| + | | 4 || RtcAlarm2 |
| + | |} |
| + | |
| + | Used to determine how the system booted. |
| + | |
| + | ===== 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 |
| + | |} |
| + | |
| + | ===== IsDevelopmentFunctionEnabled ===== |
| + | Kernel uses this to determine behavior of [[SVC#svcBreak|svcBreak]] positive arguments. It will break instead of just force-exiting the process which is what happens on retail. |
| + | |
| + | [2.0.0+] This is also used with certain debug [[SVC|SVCs]]. |
| + | |
| + | [3.0.0+] [[Loader services|RO]] checks this and if set then skipping NRR rsa signatures is allowed. |
| + | |
| + | ===== KernelConfiguration ===== |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Bits |
| + | ! Description |
| + | |- |
| + | | 0 |
| + | | EnableNonZeroFillMemory |
| + | |- |
| + | | 1 |
| + | | EnableUserExceptionHandler |
| + | |- |
| + | | 2 |
| + | | EnablePmuAccess |
| + | |- |
| + | | 3 |
| + | | [8.0.0+] EnableExtraThreadResourceAllocation |
| + | |- |
| + | | 4 |
| + | | [13.0.0+] DisableDynamicSystemResourceAllocation |
| + | |- |
| + | | 8 |
| + | | CallShowErrorOnPanic |
| + | |- |
| + | | 16-17 |
| + | | MemorySize |
| + | |} |
| + | |
| + | Kernel reads this when setting up memory-related code. |
| + | |
| + | '''EnableNonZeroFillMemory''' is a boolean determining whether kernel should it will memset various allocated memory-regions with 0x58, 0x59, 0x5A ('X', 'Y', 'Z') instead of zero. This allows Nintendo devs to find uninitialized memory bugs. |
| + | |
| + | '''EnableUserExceptionHandler''' is a boolean determining whether kernel should forcefully enable usermode exception handlers (when false, only certain aborts (((1LL << (esr >> 26)) & 0x1115804400224001) == 0, typically data/prefetch aborts) that occur when the faulting address is in a readable region with MemoryType_CodeStatic will trigger usermode exception handlers). |
| + | |
| + | '''EnablePmuAccess''' is a boolean determining whether kernel should enable usermode access to the Performance Monitors (whether PMUSERENR_EL0 should be 1 or 0). |
| + | |
| + | '''EnableExtraThreadResourceAllocation''' is a boolean determining whether the kernel should increase the KThread slabheap capacity by 160. This also increases object capacities that are calculated based on number of threads. |
| + | |
| + | '''CallShowErrorOnPanic''' is a boolean determining whether kernel should call smcPanic on error instead of infinite-looping. |
| + | |
| + | '''MemorySize''' determines how much memory is available. 00/03 = 4 GB, 01 = 6 GB, 02 = 8 GB. |
| + | |
| + | ===== IsChargerHiZModeEnabled ===== |
| + | This tells if the TI Charger (bq24192) is active. |
| + | |
| + | ===== RetailInteractiveDisplayState ===== |
| + | {| class=wikitable |
| + | ! Value || Description |
| + | |- |
| + | | 0 || Disabled |
| + | |- |
| + | | 1 || Enabled |
| + | |} |
| + | |
| + | 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. |
| + | |
| + | ===== RegulatorType ===== |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Value |
| + | ! SocType |
| + | ! GPU |
| + | ! Power Blocks |
| + | |- |
| + | | 0 |
| + | | Erista |
| + | | GM20B (0x12B) |
| + | | max77620_sd0, max77621_cpu and max77621_gpu |
| + | |- |
| + | | 1 |
| + | | Mariko |
| + | | GM20B_B (0x12E) |
| + | | max77620_sd0, max77812_cpu and max77812_gpu |
| + | |- |
| + | | 2 |
| + | | Mariko |
| + | | GM20B_B (0x12E) |
| + | | max77620_sd0, max77812_cpu and max77812_gpu |
| + | |} |
| + | |
| + | [5.0.0+] [[PCV_services|PCV]] uses this value in combination with [[#HardwareType|HardwareType]] to configure power blocks and memory tables for different hardware. |
| + | |
| + | ===== DeviceUniqueKeyGeneration ===== |
| + | 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". |
| + | |
| + | ===== 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. |
| + | |
| + | === ShowError === |
| + | Takes an u32 '''Color''' and issues a system panic. |
| + | |
| + | The kernel always calls this with '''Color''' set to 0xF00. |
| + | |
| + | === SetKernelCarveoutRegion === |
| + | Takes an u64 '''Index''', an u64 '''Address''' and an u64 '''Size'''. Returns [[#Result]]. |
| + | |
| + | If '''Index''' is 0, '''Address''' and '''Size''' are used to configure '''MC_SECURITY_CARVEOUT4'''. |
| + | If '''Index''' is 1, '''Address''' and '''Size''' are used to configure '''MC_SECURITY_CARVEOUT5'''. |
| + | Any other '''Index''' values are invalid. |
| + | |
| + | The kernel calls this with '''Index''' set to 0, '''Address''' set to 0x80060000 and '''Size''' set to a dynamically calculated size which covers all the kernel and built-in sysmodules' DRAM regions. |
| + | |
| + | === ReadWriteRegister === |
| + | Takes an u64 '''Register''', an u32 '''Mask''' and an u32 '''InValue'''. Returns [[#Result]] and an u32 '''OutValue'''. |
| + | |
| + | Relays [[SVC#svcReadWriteRegister|svcReadWriteRegister]] to the Secure Monitor. |
| + | |
| + | = CryptoUsecase = |
| + | {| class=wikitable |
| + | ! Value || Name |
| + | |- |
| + | | 0 || Aes |
| + | |- |
| + | | 1 || RsaPrivate |
| + | |- |
| + | | 2 || SecureExpMod |
| + | |- |
| + | | 3 || RsaOaep |
| + | |- |
| + | | 4 || [5.0.0+] RsaImport |
| + | |- |
| + | | 5 || [5.0.0+] |
| + | |- |
| + | | 6 || [5.0.0+] |
| + | |} |
| + | |
| + | = CipherMode = |
| + | {| class=wikitable |
| + | ! Value || Name |
| + | |- |
| + | | 0 || CbcEncrypt |
| + | |- |
| + | | 1 || CbcDecrypt |
| + | |- |
| + | | 2 || Ctr |
| + | |} |
| | | |
| + | = DecryptOrImportMode = |
| {| class=wikitable | | {| class=wikitable |
− | ! Sub-Id || Name || In || Out | + | ! Value || Name |
| + | |- |
| + | | 0 || DecryptRsaPrivateKey |
| + | |- |
| + | | 1 || ImportLotusKey |
| |- | | |- |
− | | 0xC4000001 || CpuSuspend || X1=power_state, X2=entrypoint_addr, X3=context_addr || None | + | | 2 || ImportEsKey |
| |- | | |- |
− | | 0x84000002 || CpuOff || None || None | + | | 3 || ImportSslKey |
| |- | | |- |
− | | 0xC4000003 || CpuOn || || | + | | 4 || ImportDrmKey |
| + | |} |
| + | |
| + | = SecureExpModMode = |
| + | {| class=wikitable |
| + | ! Value || Name |
| |- | | |- |
− | | 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 | + | | 0 || Lotus |
| |- | | |- |
− | | 0xC3000005 || GetRandomBytes (Same as Id 0 Sub-Id 6.) || X1=dst_addr, X2,X3,X4,X5,X6,X7=0 || | + | | 1 || Ssl |
| |- | | |- |
− | | 0xC3000006 || Panic || W1=unk, X2,X3,X4,X5,X6,X7=0 || X0=result | + | | 2 || Drm |
| + | |} |
| + | |
| + | = EsKeyType = |
| + | {| class=wikitable |
| + | ! Value || Name |
| |- | | |- |
− | | 0xC3000007 || [2.0.0+] ProtectKernelRegion || || | + | | 0 || TitleKey |
| |- | | |- |
− | | 0xC3000008 || [2.0.0+] ReadWriteRegister || || | + | | 1 || ElicenseKey |
| |} | | |} |
| | | |
− | = Errors = | + | = Result = |
− | 2: Invalid input | + | {| class=wikitable |
− | 3: Busy | + | ! Value || Description |
| + | |- |
| + | | 0 || Success |
| + | |- |
| + | | 1 || Not implemented |
| + | |- |
| + | | 2 || Invalid argument |
| + | |- |
| + | | 3 || In progress |
| + | |- |
| + | | 4 || No async operation |
| + | |- |
| + | | 5 || Invalid async operation |
| + | |- |
| + | | 6 || [8.0.0+] Not permitted |
| + | |} |