Line 22: |
Line 22: |
| 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. |
| + | |
| + | == ID 0 == |
| Functions exposed to user-mode processes using [[SVC|svcCallSecureMonitor]]. | | Functions exposed to user-mode processes using [[SVC|svcCallSecureMonitor]]. |
| | | |
| {| class=wikitable | | {| class=wikitable |
− | ! Sub-Id || Name || In || Out | + | ! Sub-ID || Name || In || Out |
| |- | | |- |
| | 0xC3000401 || SetConfig || || | | | 0xC3000401 || SetConfig || || |
| |- | | |- |
− | | 0xC3000002 || GetConfig (Same as Id 1 Sub-Id 4.) || || | + | | 0xC3000002 || GetConfig (Same as ID 1, Sub-ID 4) || || |
| |- | | |- |
| | 0xC3000003 || CheckStatus || || | | | 0xC3000003 || CheckStatus || || |
Line 38: |
Line 40: |
| | 0xC3000E05 || ExpMod || || | | | 0xC3000E05 || ExpMod || || |
| |- | | |- |
− | | 0xC3000006 || GetRandomBytes (Same as Id 1 Sub-Id 5.) || || | + | | 0xC3000006 || GetRandomBytes (Same as ID 1, Sub-ID 5) || || |
| |- | | |- |
| | 0xC3000007 || [[#GenerateAesKek]] || || | | | 0xC3000007 || [[#GenerateAesKek]] || || |
Line 58: |
Line 60: |
| | 0xC300060F || [[#PublicRsa]] || || | | | 0xC300060F || [[#PublicRsa]] || || |
| |- | | |- |
− | | 0xC3000610 || [[#UnwrapRsaEncryptedAesKey]] || || | + | | 0xC3000610 || [[#UnwrapPreparedAesKey]] || || |
| |- | | |- |
− | | 0xC3000011 || [[#LoadRsaWrappedAesKey]] || || | + | | 0xC3000011 || [[#LoadPreparedAesKey]] || || |
| |- | | |- |
− | | 0xC3000012 || [2.0.0+] GenerateRsaWrappedAesKek || || | + | | 0xC3000012 || [2.0.0+] GeneratePreparedAesKek || || |
| |} | | |} |
| | | |
Line 74: |
Line 76: |
| ** 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. |
| + | |
| + | Note: |
| + | The [[#CryptoUsecase|CryptoUsecase_PreparedAesKey]] represents a RSA wrapped AES key. |
| | | |
| === GenerateAesKek === | | === GenerateAesKek === |
Line 113: |
Line 118: |
| Key must be set prior using the [[#LoadRsaPublicKey]] command. | | Key must be set prior using the [[#LoadRsaPublicKey]] command. |
| | | |
− | === UnwrapRsaEncryptedAesKey === | + | === UnwrapPreparedAesKey === |
| Takes a session kek created with [[#GenerateAesKek]], and a wrapped RSA public key. | | Takes a session kek created with [[#GenerateAesKek]], and a wrapped RSA public key. |
| | | |
− | Returns a session-unique AES key especially for use in [[#LoadRsaWrappedAesKey]]. | + | Returns a session-unique AES key especially for use in [[#LoadPreparedAesKey]]. |
| | | |
− | The session kek must have been created with CryptoUsecase_RsaWrappedAesKey. | + | The session kek must have been created with CryptoUsecase_PreparedAesKey. |
| | | |
− | === LoadRsaWrappedAesKey === | + | === LoadPreparedAesKey === |
− | Takes a session-unique AES key from [[#UnwrapRsaEncryptedAesKey]]. | + | Takes a session-unique AES key from [[#UnwrapPreparedAesKey]]. |
| | | |
| === enum CryptoUsecase === | | === enum CryptoUsecase === |
Line 133: |
Line 138: |
| | 2 || CryptoUsecase_PublicRsa | | | 2 || CryptoUsecase_PublicRsa |
| |- | | |- |
− | | 3 || CryptoUsecase_RsaWrappedAesKey | + | | 3 || CryptoUsecase_PreparedAesKey |
| |} | | |} |
| | | |
− | == Id 1 == | + | == ID 1 == |
| Functions exposed to the kernel internally. | | Functions exposed to the kernel internally. |
| | | |
| {| class=wikitable | | {| class=wikitable |
− | ! Sub-Id || Name || In || Out | + | ! Sub-ID || Name || In || Out |
| |- | | |- |
− | | 0xC4000001 || CpuSuspend || X1=power_state, X2=entrypoint_addr, X3=context_addr || None | + | | 0xC4000001 || [[#CpuSuspend]] || X1=power_state, X2=entrypoint_addr, X3=context_id || None |
| |- | | |- |
− | | 0x84000002 || CpuOff || None || None | + | | 0x84000002 || [[#CpuOff]] || None || None |
| |- | | |- |
− | | 0xC4000003 || CpuOn || || | + | | 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 | + | | 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 || GetRandomBytes (Same as Id 0 Sub-Id 6.) || X1=dst_addr, X2,X3,X4,X5,X6,X7=0 || | + | | 0xC3000005 || [[#GetRandomBytes]] (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=unk, X2,X3,X4,X5,X6,X7=0 || X0=result | + | | 0xC3000006 || [[#Panic]] || W1=unk, X2,X3,X4,X5,X6,X7=0 || X0=result |
| |- | | |- |
| | 0xC3000007 || [2.0.0+] ProtectKernelRegion || || | | | 0xC3000007 || [2.0.0+] ProtectKernelRegion || || |
Line 158: |
Line 163: |
| | 0xC3000008 || [2.0.0+] ReadWriteRegister || || | | | 0xC3000008 || [2.0.0+] ReadWriteRegister || || |
| |} | | |} |
| + | |
| + | === CpuSuspend === |
| + | Standard ARM PCSI SMC. Suspends the CPU (CPU0). |
| + | |
| + | The kernel calls this SMC on shutdown with '''power_state''' set to 0x0201001B (power level: 0x02==system; power type: 0x01==powerdown; ID: 0x1B). |
| + | |
| + | === CpuOff === |
| + | Standard ARM PCSI SMC. Turns off the CPU (CPU1, CPU2 or CPU3). |
| + | |
| + | === CpuOn === |
| + | Standard ARM PCSI SMC. Turns on the CPU (CPU1, CPU2 or CPU3). |
| + | |
| + | === GetConfig === |
| + | Takes a '''config_item''' and returns an associated '''config_val'''. |
| + | |
| + | === GetRandomBytes === |
| + | Takes a '''size''' and returns '''rand_bytes'''. |
| + | |
| + | The kernel limits '''size''' to 0x38 (for fitting in return registers). |
| + | |
| + | === Panic === |
| + | Issues a system panic. |
| + | |
| + | The kernel always calls this with '''unk''' set to 0xF00. |
| | | |
| = Errors = | | = Errors = |
− | 2: Invalid input | + | {| class=wikitable |
− | 3: Busy | + | ! Value || Description |
| + | |- |
| + | | 2 || Invalid input |
| + | |- |
| + | | 3 || Busy |
| + | |} |