blob: e269f077a8287542e6c4a55aa640193d765a21cc [file] [log] [blame]
Soby Mathewb4c6df42022-11-09 11:13:29 +00001/*
2 * SPDX-License-Identifier: BSD-3-Clause
3 * SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
4 */
5
6#ifndef SMC_RSI_H
7#define SMC_RSI_H
8
9#include <smc.h>
10#include <stddef.h>
11#include <utils_def.h>
12
13/*
14 * This file describes the Realm Services Interface (RSI) Application Binary
15 * Interface (ABI) for SMC calls made from within the Realm to the RMM and
16 * serviced by the RMM.
17 *
18 * See doc/rmm_interface.md for more details.
19 */
20
21/*
22 * The major version number of the RSI implementation. Increase this whenever
23 * the binary format or semantics of the SMC calls change.
24 */
25#define RSI_ABI_VERSION_MAJOR 12U
26
27/*
28 * The minor version number of the RSI implementation. Increase this when
29 * a bug is fixed, or a feature is added without breaking binary compatibility.
30 */
31#define RSI_ABI_VERSION_MINOR 0
32
33#define RSI_ABI_VERSION ((RSI_ABI_VERSION_MAJOR << 16U) | \
34 RSI_ABI_VERSION_MINOR)
35
36#define RSI_ABI_VERSION_GET_MAJOR(_version) ((_version) >> 16U)
37#define RSI_ABI_VERSION_GET_MINOR(_version) ((_version) & 0xFFFFU)
38
39#define IS_SMC64_RSI_FID(_fid) IS_SMC64_STD_FAST_IN_RANGE(RSI, _fid)
40
41#define SMC64_RSI_FID(_offset) SMC64_STD_FID(RSI, _offset)
42
43#define SMC_RSI_ABI_VERSION SMC64_RSI_FID(U(0x0))
44
45/* RSI Status code enumeration as per Section D4.3.6 of the RMM Spec */
46typedef enum {
47 /* Command completed successfully */
48 RSI_SUCCESS = 0U,
49
50 /*
51 * The value of a command input value
52 * caused the command to fail
53 */
54 RSI_ERROR_INPUT = 1U,
55
56 /*
57 * The state of the current Realm or current REC
58 * does not match the state expected by the command
59 */
60 RSI_ERROR_STATE = 2U,
61
62 /* The operation requested by the command is not complete */
63 RSI_INCOMPLETE = 3U,
64
65 RSI_ERROR_COUNT
66} rsi_status_t;
67
68/*
69 * Returns a measurement.
70 * arg1: Measurement index (0..4), measurement (RIM or REM) to read
71 * ret0: Status / error
72 * ret1: Measurement value, bytes: 0 - 7
73 * ret2: Measurement value, bytes: 7 - 15
74 * ret3: Measurement value, bytes: 16 - 23
75 * ret4: Measurement value, bytes: 24 - 31
76 * ret5: Measurement value, bytes: 32 - 39
77 * ret6: Measurement value, bytes: 40 - 47
78 * ret7: Measurement value, bytes: 48 - 55
79 * ret8: Measurement value, bytes: 56 - 63
80 */
81#define SMC_RSI_MEASUREMENT_READ SMC64_RSI_FID(U(0x2))
82
83/*
84 * Extends a REM.
85 * arg0: Measurement index (1..4), measurement (REM) to extend
86 * arg1: Measurement size in bytes
87 * arg3: Challenge value, bytes: 0 - 7
88 * arg4: Challenge value, bytes: 7 - 15
89 * arg5: Challenge value, bytes: 16 - 23
90 * arg6: Challenge value, bytes: 24 - 31
91 * arg7: Challenge value, bytes: 32 - 39
92 * arg8: Challenge value, bytes: 40 - 47
93 * arg9: Challenge value, bytes: 48 - 55
94 * arg10: Challenge value, bytes: 56 - 63
95 * ret0: Status / error
96 */
97#define SMC_RSI_MEASUREMENT_EXTEND SMC64_RSI_FID(U(0x3))
98
99/*
100 * Initialize the operation to retrieve an attestation token.
101 * arg1: The IPA of token buffer
102 * arg2: Challenge value, bytes: 0 - 7
103 * arg3: Challenge value, bytes: 7 - 15
104 * arg4: Challenge value, bytes: 16 - 23
105 * arg5: Challenge value, bytes: 24 - 31
106 * arg6: Challenge value, bytes: 32 - 39
107 * arg7: Challenge value, bytes: 40 - 47
108 * arg8: Challenge value, bytes: 48 - 55
109 * arg9: Challenge value, bytes: 56 - 63
110 * ret0: Status / error
111 * ret1: Size of completed token in bytes
112 */
113#define SMC_RSI_ATTEST_TOKEN_INIT SMC64_RSI_FID(U(0x4))
114
115/*
116 * Continue the operation to retrieve an attestation token.
117 * arg1: The IPA of token buffer
118 * ret0: Status / error
119 * ret1: Size of completed token in bytes
120 */
121#define SMC_RSI_ATTEST_TOKEN_CONTINUE SMC64_RSI_FID(U(0x5))
122
123struct rsi_realm_config {
124 /* IPA width in bits */
125 SET_MEMBER(unsigned long ipa_width, 0, 0x1000); /* Offset 0 */
126};
127
128COMPILER_ASSERT(sizeof(struct rsi_realm_config) == 0x1000);
129
130COMPILER_ASSERT(offsetof(struct rsi_realm_config, ipa_width) == 0);
131
132/*
133 * arg0 == struct rsi_realm_config address
134 */
135#define SMC_RSI_REALM_CONFIG SMC64_RSI_FID(U(0x6))
136
137/*
138 * arg0 == IPA address of target region
139 * arg1 == Size of target region in bytes
140 * arg2 == RIPAS value
141 * ret0 == Status / error
142 * ret1 == Top of modified IPA range
143 */
144#define SMC_RSI_IPA_STATE_SET SMC64_RSI_FID(U(0x7))
145
146/*
147 * arg0 == IPA
148 * ret0 == Status / error
149 * ret1 == RIPAS value
150 */
151#define SMC_RSI_IPA_STATE_GET SMC64_RSI_FID(U(0x8))
152
153#define RSI_HOST_CALL_NR_GPRS 7U
154
155struct rsi_host_call {
156 SET_MEMBER(struct {
157 /* Immediate value */
158 unsigned int imm; /* Offset 0 */
159 /* Registers */
160 unsigned long gprs[RSI_HOST_CALL_NR_GPRS];
161 }, 0, 0x100);
162};
163
164COMPILER_ASSERT(sizeof(struct rsi_host_call) == 0x100);
165
166COMPILER_ASSERT(offsetof(struct rsi_host_call, imm) == 0);
167COMPILER_ASSERT(offsetof(struct rsi_host_call, gprs[0]) == 8);
168COMPILER_ASSERT(offsetof(struct rsi_host_call,
169 gprs[RSI_HOST_CALL_NR_GPRS - 1]) ==
170 8 * RSI_HOST_CALL_NR_GPRS);
171
172/*
173 * arg0 == struct rsi_host_call addr
174 */
175#define SMC_RSI_HOST_CALL SMC64_RSI_FID(U(0x9))
176
177#endif /* SMC_RSI_H */