/* * SPDX-License-Identifier: BSD-3-Clause * SPDX-FileCopyrightText: Copyright TF-RMM Contributors. */ #ifndef SMC_RSI_H #define SMC_RSI_H #include #include #include /* * This file describes the Realm Services Interface (RSI) Application Binary * Interface (ABI) for SMC calls made from within the Realm to the RMM and * serviced by the RMM. * * See doc/rmm_interface.md for more details. */ /* * The major version number of the RSI implementation. Increase this whenever * the binary format or semantics of the SMC calls change. */ #define RSI_ABI_VERSION_MAJOR 12U /* * The minor version number of the RSI implementation. Increase this when * a bug is fixed, or a feature is added without breaking binary compatibility. */ #define RSI_ABI_VERSION_MINOR 0 #define RSI_ABI_VERSION ((RSI_ABI_VERSION_MAJOR << 16U) | \ RSI_ABI_VERSION_MINOR) #define RSI_ABI_VERSION_GET_MAJOR(_version) ((_version) >> 16U) #define RSI_ABI_VERSION_GET_MINOR(_version) ((_version) & 0xFFFFU) #define IS_SMC64_RSI_FID(_fid) IS_SMC64_STD_FAST_IN_RANGE(RSI, _fid) #define SMC64_RSI_FID(_offset) SMC64_STD_FID(RSI, _offset) #define SMC_RSI_ABI_VERSION SMC64_RSI_FID(U(0x0)) /* RSI Status code enumeration as per Section D4.3.6 of the RMM Spec */ typedef enum { /* Command completed successfully */ RSI_SUCCESS = 0U, /* * The value of a command input value * caused the command to fail */ RSI_ERROR_INPUT = 1U, /* * The state of the current Realm or current REC * does not match the state expected by the command */ RSI_ERROR_STATE = 2U, /* The operation requested by the command is not complete */ RSI_INCOMPLETE = 3U, RSI_ERROR_COUNT } rsi_status_t; /* * Returns a measurement. * arg1: Measurement index (0..4), measurement (RIM or REM) to read * ret0: Status / error * ret1: Measurement value, bytes: 0 - 7 * ret2: Measurement value, bytes: 7 - 15 * ret3: Measurement value, bytes: 16 - 23 * ret4: Measurement value, bytes: 24 - 31 * ret5: Measurement value, bytes: 32 - 39 * ret6: Measurement value, bytes: 40 - 47 * ret7: Measurement value, bytes: 48 - 55 * ret8: Measurement value, bytes: 56 - 63 */ #define SMC_RSI_MEASUREMENT_READ SMC64_RSI_FID(U(0x2)) /* * Extends a REM. * arg0: Measurement index (1..4), measurement (REM) to extend * arg1: Measurement size in bytes * arg3: Challenge value, bytes: 0 - 7 * arg4: Challenge value, bytes: 7 - 15 * arg5: Challenge value, bytes: 16 - 23 * arg6: Challenge value, bytes: 24 - 31 * arg7: Challenge value, bytes: 32 - 39 * arg8: Challenge value, bytes: 40 - 47 * arg9: Challenge value, bytes: 48 - 55 * arg10: Challenge value, bytes: 56 - 63 * ret0: Status / error */ #define SMC_RSI_MEASUREMENT_EXTEND SMC64_RSI_FID(U(0x3)) /* * Initialize the operation to retrieve an attestation token. * arg1: The IPA of token buffer * arg2: Challenge value, bytes: 0 - 7 * arg3: Challenge value, bytes: 7 - 15 * arg4: Challenge value, bytes: 16 - 23 * arg5: Challenge value, bytes: 24 - 31 * arg6: Challenge value, bytes: 32 - 39 * arg7: Challenge value, bytes: 40 - 47 * arg8: Challenge value, bytes: 48 - 55 * arg9: Challenge value, bytes: 56 - 63 * ret0: Status / error * ret1: Size of completed token in bytes */ #define SMC_RSI_ATTEST_TOKEN_INIT SMC64_RSI_FID(U(0x4)) /* * Continue the operation to retrieve an attestation token. * arg1: The IPA of token buffer * ret0: Status / error * ret1: Size of completed token in bytes */ #define SMC_RSI_ATTEST_TOKEN_CONTINUE SMC64_RSI_FID(U(0x5)) struct rsi_realm_config { /* IPA width in bits */ SET_MEMBER(unsigned long ipa_width, 0, 0x1000); /* Offset 0 */ }; COMPILER_ASSERT(sizeof(struct rsi_realm_config) == 0x1000); COMPILER_ASSERT(offsetof(struct rsi_realm_config, ipa_width) == 0); /* * arg0 == struct rsi_realm_config address */ #define SMC_RSI_REALM_CONFIG SMC64_RSI_FID(U(0x6)) /* * arg0 == IPA address of target region * arg1 == Size of target region in bytes * arg2 == RIPAS value * ret0 == Status / error * ret1 == Top of modified IPA range */ #define SMC_RSI_IPA_STATE_SET SMC64_RSI_FID(U(0x7)) /* * arg0 == IPA * ret0 == Status / error * ret1 == RIPAS value */ #define SMC_RSI_IPA_STATE_GET SMC64_RSI_FID(U(0x8)) #define RSI_HOST_CALL_NR_GPRS 7U struct rsi_host_call { SET_MEMBER(struct { /* Immediate value */ unsigned int imm; /* Offset 0 */ /* Registers */ unsigned long gprs[RSI_HOST_CALL_NR_GPRS]; }, 0, 0x100); }; COMPILER_ASSERT(sizeof(struct rsi_host_call) == 0x100); COMPILER_ASSERT(offsetof(struct rsi_host_call, imm) == 0); COMPILER_ASSERT(offsetof(struct rsi_host_call, gprs[0]) == 8); COMPILER_ASSERT(offsetof(struct rsi_host_call, gprs[RSI_HOST_CALL_NR_GPRS - 1]) == 8 * RSI_HOST_CALL_NR_GPRS); /* * arg0 == struct rsi_host_call addr */ #define SMC_RSI_HOST_CALL SMC64_RSI_FID(U(0x9)) #endif /* SMC_RSI_H */