xref: /rk3399_ARM-atf/docs/components/rmm-el3-comms-spec.rst (revision 69447290863426c3f1360d89811ade6263a22814)
1*69447290SJavier Almansa SobrinoRMM-EL3 Communication interface
2*69447290SJavier Almansa Sobrino*******************************
3*69447290SJavier Almansa Sobrino
4*69447290SJavier Almansa SobrinoThis document defines the communication interface between RMM and EL3.
5*69447290SJavier Almansa SobrinoThere are two parts in this interface: the boot interface and the runtime
6*69447290SJavier Almansa Sobrinointerface.
7*69447290SJavier Almansa Sobrino
8*69447290SJavier Almansa SobrinoThe Boot Interface defines the ABI between EL3 and RMM when the CPU enters
9*69447290SJavier Almansa SobrinoR-EL2 for the first time after boot. The cold boot interface defines the ABI
10*69447290SJavier Almansa Sobrinofor the cold boot path and the warm boot interface defines the same for the
11*69447290SJavier Almansa Sobrinowarm path.
12*69447290SJavier Almansa Sobrino
13*69447290SJavier Almansa SobrinoThe RMM-EL3 runtime interface defines the ABI for EL3 services which can be
14*69447290SJavier Almansa Sobrinoinvoked by RMM as well as the register save-restore convention when handling an
15*69447290SJavier Almansa SobrinoSMC call from NS.
16*69447290SJavier Almansa Sobrino
17*69447290SJavier Almansa SobrinoThe below sections discuss these interfaces more in detail.
18*69447290SJavier Almansa Sobrino
19*69447290SJavier Almansa Sobrino.. _rmm_el3_ifc_versioning:
20*69447290SJavier Almansa Sobrino
21*69447290SJavier Almansa SobrinoRMM-EL3 Interface versioning
22*69447290SJavier Almansa Sobrino____________________________
23*69447290SJavier Almansa Sobrino
24*69447290SJavier Almansa SobrinoThe RMM Boot and Runtime Interface uses a version number to check
25*69447290SJavier Almansa Sobrinocompatibility with the register arguments passed as part of Boot Interface and
26*69447290SJavier Almansa SobrinoRMM-EL3 runtime interface.
27*69447290SJavier Almansa Sobrino
28*69447290SJavier Almansa SobrinoThe Boot Manifest, discussed later in section :ref:`rmm_el3_boot_manifest`,
29*69447290SJavier Almansa Sobrinouses a separate version number but with the same scheme.
30*69447290SJavier Almansa Sobrino
31*69447290SJavier Almansa SobrinoThe version number is a 32-bit type with the following fields:
32*69447290SJavier Almansa Sobrino
33*69447290SJavier Almansa Sobrino.. csv-table::
34*69447290SJavier Almansa Sobrino   :header: "Bits", "Value"
35*69447290SJavier Almansa Sobrino
36*69447290SJavier Almansa Sobrino   [0:15],``VERSION_MINOR``
37*69447290SJavier Almansa Sobrino   [16:30],``VERSION_MAJOR``
38*69447290SJavier Almansa Sobrino   [31],RES0
39*69447290SJavier Almansa Sobrino
40*69447290SJavier Almansa SobrinoThe version numbers are sequentially increased and the rules for updating them
41*69447290SJavier Almansa Sobrinoare explained below:
42*69447290SJavier Almansa Sobrino
43*69447290SJavier Almansa Sobrino  - ``VERSION_MAJOR``: This value is increased when changes break
44*69447290SJavier Almansa Sobrino    compatibility with previous versions. If the changes
45*69447290SJavier Almansa Sobrino    on the ABI are compatible with the previous one, ``VERSION_MAJOR``
46*69447290SJavier Almansa Sobrino    remains unchanged.
47*69447290SJavier Almansa Sobrino
48*69447290SJavier Almansa Sobrino  - ``VERSION_MINOR``: This value is increased on any change that is backwards
49*69447290SJavier Almansa Sobrino    compatible with the previous version. When ``VERSION_MAJOR`` is increased,
50*69447290SJavier Almansa Sobrino    ``VERSION_MINOR`` must be set to 0.
51*69447290SJavier Almansa Sobrino
52*69447290SJavier Almansa Sobrino  - ``RES0``: Bit 31 of the version number is reserved 0 as to maintain
53*69447290SJavier Almansa Sobrino    consistency with the versioning schemes used in other parts of RMM.
54*69447290SJavier Almansa Sobrino
55*69447290SJavier Almansa SobrinoThis document specifies the 0.1 version of Boot Interface ABI and RMM-EL3
56*69447290SJavier Almansa Sobrinoservices specification and the 0.1 version of the Boot Manifest.
57*69447290SJavier Almansa Sobrino
58*69447290SJavier Almansa Sobrino.. _rmm_el3_boot_interface:
59*69447290SJavier Almansa Sobrino
60*69447290SJavier Almansa SobrinoRMM Boot Interface
61*69447290SJavier Almansa Sobrino__________________
62*69447290SJavier Almansa Sobrino
63*69447290SJavier Almansa SobrinoThis section deals with the Boot Interface part of the specification.
64*69447290SJavier Almansa Sobrino
65*69447290SJavier Almansa SobrinoOne of the goals of the Boot Interface is to allow EL3 firmware to pass
66*69447290SJavier Almansa Sobrinodown into RMM certain platform specific information dynamically. This allows
67*69447290SJavier Almansa SobrinoRMM to be less platform dependent and be more generic across platform
68*69447290SJavier Almansa Sobrinovariations. It also allows RMM to be decoupled from the other boot loader
69*69447290SJavier Almansa Sobrinoimages in the boot sequence and remain agnostic of any particular format used
70*69447290SJavier Almansa Sobrinofor configuration files.
71*69447290SJavier Almansa Sobrino
72*69447290SJavier Almansa SobrinoThe Boot Interface ABI defines a set of register conventions and
73*69447290SJavier Almansa Sobrinoalso a memory based manifest file to pass information from EL3 to RMM. The
74*69447290SJavier Almansa Sobrinoboot manifest and the associated platform data in it can be dynamically created
75*69447290SJavier Almansa Sobrinoby EL3 and there is no restriction on how the data can be obtained (e.g by DTB,
76*69447290SJavier Almansa Sobrinohoblist or other).
77*69447290SJavier Almansa Sobrino
78*69447290SJavier Almansa SobrinoThe register convention and the manifest are versioned separately to manage
79*69447290SJavier Almansa Sobrinofuture enhancements and compatibility.
80*69447290SJavier Almansa Sobrino
81*69447290SJavier Almansa SobrinoRMM completes the boot by issuing the ``RMM_BOOT_COMPLETE`` SMC (0xC40001CF)
82*69447290SJavier Almansa Sobrinoback to EL3. After the RMM has finished the boot process, it can only be
83*69447290SJavier Almansa Sobrinoentered from EL3 as part of RMI handling.
84*69447290SJavier Almansa Sobrino
85*69447290SJavier Almansa SobrinoIf RMM returns an error during boot (in any CPU), then RMM must not be entered
86*69447290SJavier Almansa Sobrinofrom any CPU.
87*69447290SJavier Almansa Sobrino
88*69447290SJavier Almansa Sobrino.. _rmm_cold_boot_interface:
89*69447290SJavier Almansa Sobrino
90*69447290SJavier Almansa SobrinoCold Boot Interface
91*69447290SJavier Almansa Sobrino~~~~~~~~~~~~~~~~~~~
92*69447290SJavier Almansa Sobrino
93*69447290SJavier Almansa SobrinoDuring cold boot RMM expects the following register values:
94*69447290SJavier Almansa Sobrino
95*69447290SJavier Almansa Sobrino.. csv-table::
96*69447290SJavier Almansa Sobrino   :header: "Register", "Value"
97*69447290SJavier Almansa Sobrino   :widths: 1, 5
98*69447290SJavier Almansa Sobrino
99*69447290SJavier Almansa Sobrino   x0,Linear index of this PE. This index starts from 0 and must be less than the maximum number of CPUs to be supported at runtime (see x2).
100*69447290SJavier Almansa Sobrino   x1,Version for this Boot Interface as defined in :ref:`rmm_el3_ifc_versioning`.
101*69447290SJavier Almansa Sobrino   x2,Maximum number of CPUs to be supported at runtime. RMM should ensure that it can support this maximum number.
102*69447290SJavier Almansa Sobrino   x3,Base address for the shared buffer used for communication between EL3 firmware and RMM. This buffer must be of 4KB size (1 page). The boot manifest must be present at the base of this shared buffer during cold boot.
103*69447290SJavier Almansa Sobrino
104*69447290SJavier Almansa SobrinoDuring cold boot, EL3 firmware needs to allocate a 4K page that will be
105*69447290SJavier Almansa Sobrinopassed to RMM in x3. This memory will be used as shared buffer for communication
106*69447290SJavier Almansa Sobrinobetween EL3 and RMM. It must be assigned to Realm world and must be mapped with
107*69447290SJavier Almansa SobrinoNormal memory attributes (IWB-OWB-ISH) at EL3. At boot, this memory will be
108*69447290SJavier Almansa Sobrinoused to populate the Boot Manifest. Since the Boot Manifest can be accessed by
109*69447290SJavier Almansa SobrinoRMM prior to enabling its MMU, EL3 must ensure that proper cache maintenance
110*69447290SJavier Almansa Sobrinooperations are performed after the Boot Manifest is populated.
111*69447290SJavier Almansa Sobrino
112*69447290SJavier Almansa SobrinoEL3 should also ensure that this shared buffer is always available for use by RMM
113*69447290SJavier Almansa Sobrinoduring the lifetime of the system and that it can be used for runtime
114*69447290SJavier Almansa Sobrinocommunication between RMM and EL3. For example, when RMM invokes attestation
115*69447290SJavier Almansa Sobrinoservice commands in EL3, this buffer can be used to exchange data between RMM
116*69447290SJavier Almansa Sobrinoand EL3. It is also allowed for RMM to invoke runtime services provided by EL3
117*69447290SJavier Almansa Sobrinoutilizing this buffer during the boot phase, prior to return back to EL3 via
118*69447290SJavier Almansa SobrinoRMM_BOOT_COMPLETE SMC.
119*69447290SJavier Almansa Sobrino
120*69447290SJavier Almansa SobrinoRMM should map this memory page into its Stage 1 page-tables using Normal
121*69447290SJavier Almansa Sobrinomemory attributes.
122*69447290SJavier Almansa Sobrino
123*69447290SJavier Almansa SobrinoDuring runtime, it is the RMM which initiates any communication with EL3. If that
124*69447290SJavier Almansa Sobrinocommunication requires the use of the shared area, it is expected that RMM needs
125*69447290SJavier Almansa Sobrinoto do the necessary concurrency protection to prevent the use of the same buffer
126*69447290SJavier Almansa Sobrinoby other PEs.
127*69447290SJavier Almansa Sobrino
128*69447290SJavier Almansa SobrinoThe following sequence diagram shows how a generic EL3 Firmware would boot RMM.
129*69447290SJavier Almansa Sobrino
130*69447290SJavier Almansa Sobrino.. image:: ../resources/diagrams/rmm_cold_boot_generic.png
131*69447290SJavier Almansa Sobrino
132*69447290SJavier Almansa SobrinoWarm Boot Interface
133*69447290SJavier Almansa Sobrino~~~~~~~~~~~~~~~~~~~
134*69447290SJavier Almansa Sobrino
135*69447290SJavier Almansa SobrinoAt warm boot, RMM is already initialized and only some per-CPU initialization
136*69447290SJavier Almansa Sobrinois still pending. The only argument that is required by RMM at this stage is
137*69447290SJavier Almansa Sobrinothe CPU Id, which will be passed through register x0 whilst x1 to x3 are RES0.
138*69447290SJavier Almansa SobrinoThis is summarized in the following table:
139*69447290SJavier Almansa Sobrino
140*69447290SJavier Almansa Sobrino.. csv-table::
141*69447290SJavier Almansa Sobrino   :header: "Register", "Value"
142*69447290SJavier Almansa Sobrino   :widths: 1, 5
143*69447290SJavier Almansa Sobrino
144*69447290SJavier Almansa Sobrino   x0,Linear index of this PE. This index starts from 0 and must be less than the maximum number of CPUs to be supported at runtime (see x2).
145*69447290SJavier Almansa Sobrino   x1 - x3,RES0
146*69447290SJavier Almansa Sobrino
147*69447290SJavier Almansa SobrinoBoot error handling and return values
148*69447290SJavier Almansa Sobrino~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
149*69447290SJavier Almansa Sobrino
150*69447290SJavier Almansa SobrinoAfter boot up and initialization, RMM returns control back to EL3 through a
151*69447290SJavier Almansa Sobrino``RMM_BOOT_COMPLETE`` SMC call. The only argument of this SMC call will
152*69447290SJavier Almansa Sobrinobe returned in x1 and it will encode a signed integer with the error reason
153*69447290SJavier Almansa Sobrinoas per the following table:
154*69447290SJavier Almansa Sobrino
155*69447290SJavier Almansa Sobrino.. csv-table::
156*69447290SJavier Almansa Sobrino   :header: "Error code", "Description", "ID"
157*69447290SJavier Almansa Sobrino   :widths: 2 4 1
158*69447290SJavier Almansa Sobrino
159*69447290SJavier Almansa Sobrino   ``E_RMM_BOOT_SUCCESS``,Boot successful,0
160*69447290SJavier Almansa Sobrino   ``E_RMM_BOOT_ERR_UNKNOWN``,Unknown error,-1
161*69447290SJavier Almansa Sobrino   ``E_RMM_BOOT_VERSION_NOT_VALID``,Boot Interface version reported by EL3 is not supported by RMM,-2
162*69447290SJavier Almansa Sobrino   ``E_RMM_BOOT_CPUS_OUT_OF_RAGE``,Number of CPUs reported by EL3 larger than maximum supported by RMM,-3
163*69447290SJavier Almansa Sobrino   ``E_RMM_BOOT_CPU_ID_OUT_OF_RAGE``,Current CPU Id is higher or equal than the number of CPUs supported by RMM,-4
164*69447290SJavier Almansa Sobrino   ``E_RMM_BOOT_INVALID_SHARED_BUFFER``,Invalid pointer to shared memory area,-5
165*69447290SJavier Almansa Sobrino   ``E_RMM_BOOT_MANIFEST_VERSION_NOT_SUPPORTED``,Version reported by the boot manifest not supported by RMM,-6
166*69447290SJavier Almansa Sobrino   ``E_RMM_BOOT_MANIFEST_DATA_ERROR``,Error parsing core boot manifest,-7
167*69447290SJavier Almansa Sobrino
168*69447290SJavier Almansa SobrinoFor any error detected in RMM during cold or warm boot, RMM will return back to
169*69447290SJavier Almansa SobrinoEL3 using ``RMM_BOOT_COMPLETE`` SMC with an appropriate error code. It is
170*69447290SJavier Almansa Sobrinoexpected that EL3 will take necessary action to disable Realm world for further
171*69447290SJavier Almansa Sobrinoentry from NS Host on receiving an error. This will be done across all the PEs
172*69447290SJavier Almansa Sobrinoin the system so as to present a symmetric view to the NS Host. Any further
173*69447290SJavier Almansa Sobrinowarm boot by any PE should not enter RMM using the warm boot interface.
174*69447290SJavier Almansa Sobrino
175*69447290SJavier Almansa Sobrino.. _rmm_el3_boot_manifest:
176*69447290SJavier Almansa Sobrino
177*69447290SJavier Almansa SobrinoBoot Manifest
178*69447290SJavier Almansa Sobrino~~~~~~~~~~~~~
179*69447290SJavier Almansa Sobrino
180*69447290SJavier Almansa SobrinoDuring cold boot, EL3 Firmware passes a memory boot manifest to RMM containing
181*69447290SJavier Almansa Sobrinoplatform information.
182*69447290SJavier Almansa Sobrino
183*69447290SJavier Almansa SobrinoThis boot manifest is versioned independently of the boot interface, to help
184*69447290SJavier Almansa Sobrinoevolve the boot manifest independent of the rest of Boot Manifest.
185*69447290SJavier Almansa SobrinoThe current version for the boot manifest is ``v0.1`` and the rules explained
186*69447290SJavier Almansa Sobrinoin :ref:`rmm_el3_ifc_versioning` apply on this version as well.
187*69447290SJavier Almansa Sobrino
188*69447290SJavier Almansa SobrinoThe boot manifest is divided into two different components:
189*69447290SJavier Almansa Sobrino
190*69447290SJavier Almansa Sobrino   - Core Manifest: This is the generic parameters passed to RMM by EL3 common to all platforms.
191*69447290SJavier Almansa Sobrino   - Platform data: This is defined by the platform owner and contains information specific to that platform.
192*69447290SJavier Almansa Sobrino
193*69447290SJavier Almansa SobrinoFor the current version of the manifest, the core manifest contains a pointer
194*69447290SJavier Almansa Sobrinoto the platform data. EL3 must ensure that the whole boot manifest,
195*69447290SJavier Almansa Sobrinoincluding the platform data, if available, fits inside the RMM EL3 shared
196*69447290SJavier Almansa Sobrinobuffer.
197*69447290SJavier Almansa Sobrino
198*69447290SJavier Almansa SobrinoFor the type specification of the RMM Boot Manifest v0.1, refer to
199*69447290SJavier Almansa Sobrino:ref:`rmm_el3_manifest_struct`
200*69447290SJavier Almansa Sobrino
201*69447290SJavier Almansa Sobrino.. _runtime_services_and_interface:
202*69447290SJavier Almansa Sobrino
203*69447290SJavier Almansa SobrinoRMMM-EL3 Runtime Interface
204*69447290SJavier Almansa Sobrino__________________________
205*69447290SJavier Almansa Sobrino
206*69447290SJavier Almansa SobrinoThis section defines the RMM-EL3 runtime interface which specifies the ABI for
207*69447290SJavier Almansa SobrinoEL3 services expected by RMM at runtime as well as the register save and
208*69447290SJavier Almansa Sobrinorestore convention between EL3 and RMM as part of RMI call handling. It is
209*69447290SJavier Almansa Sobrinoimportant to note that RMM is allowed to invoke EL3-RMM runtime interface
210*69447290SJavier Almansa Sobrinoservices during the boot phase as well. The EL3 runtime service handling must
211*69447290SJavier Almansa Sobrinonot result in a world switch to another world unless specified. Both the RMM
212*69447290SJavier Almansa Sobrinoand EL3 are allowed to make suitable optimizations based on this assumption.
213*69447290SJavier Almansa Sobrino
214*69447290SJavier Almansa SobrinoIf the interface requires the use of memory, then the memory references should
215*69447290SJavier Almansa Sobrinobe within the shared buffer communicated as part of the boot interface. See
216*69447290SJavier Almansa Sobrino:ref:`rmm_cold_boot_interface` for properties of this shared buffer which both
217*69447290SJavier Almansa SobrinoEL3 and RMM must adhere to.
218*69447290SJavier Almansa Sobrino
219*69447290SJavier Almansa SobrinoRMM-EL3 runtime service return codes
220*69447290SJavier Almansa Sobrino~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
221*69447290SJavier Almansa Sobrino
222*69447290SJavier Almansa SobrinoThe return codes from EL3 to RMM is a 32 bit signed integer which encapsulates
223*69447290SJavier Almansa Sobrinoerror condition as described in the following table:
224*69447290SJavier Almansa Sobrino
225*69447290SJavier Almansa Sobrino.. csv-table::
226*69447290SJavier Almansa Sobrino   :header: "Error code", "Description", "ID"
227*69447290SJavier Almansa Sobrino   :widths: 2 4 1
228*69447290SJavier Almansa Sobrino
229*69447290SJavier Almansa Sobrino   ``E_RMM_OK``,No errors detected,0
230*69447290SJavier Almansa Sobrino   ``E_RMM_UNK``,Unknown/Generic error,-1
231*69447290SJavier Almansa Sobrino   ``E_RMM_BAD_ADDR``,The value of an address used as argument was invalid,-2
232*69447290SJavier Almansa Sobrino   ``E_RMM_BAD_PAS``,Incorrect PAS,-3
233*69447290SJavier Almansa Sobrino   ``E_RMM_NOMEM``,Not enough memory to perform an operation,-4
234*69447290SJavier Almansa Sobrino   ``E_RMM_INVAL``,The value of an argument was invalid,-5
235*69447290SJavier Almansa Sobrino
236*69447290SJavier Almansa SobrinoIf multiple failure conditions are detected in an RMM to EL3 command, then EL3
237*69447290SJavier Almansa Sobrinois allowed to return an error code corresponding to any of the failure
238*69447290SJavier Almansa Sobrinoconditions.
239*69447290SJavier Almansa Sobrino
240*69447290SJavier Almansa SobrinoRMM-EL3 runtime services
241*69447290SJavier Almansa Sobrino~~~~~~~~~~~~~~~~~~~~~~~~
242*69447290SJavier Almansa Sobrino
243*69447290SJavier Almansa SobrinoThe following table summarizes the RMM runtime services that need to be
244*69447290SJavier Almansa Sobrinoimplemented by EL3 Firmware.
245*69447290SJavier Almansa Sobrino
246*69447290SJavier Almansa Sobrino.. csv-table::
247*69447290SJavier Almansa Sobrino   :header: "FID", "Command"
248*69447290SJavier Almansa Sobrino   :widths: 2 5
249*69447290SJavier Almansa Sobrino
250*69447290SJavier Almansa Sobrino   0xC40001B2,``RMM_ATTEST_GET_REALM_KEY``
251*69447290SJavier Almansa Sobrino   0xC40001B3,``RMM_ATTEST_GET_PLAT_TOKEN``
252*69447290SJavier Almansa Sobrino
253*69447290SJavier Almansa SobrinoRMM_ATTEST_GET_REALM_KEY command
254*69447290SJavier Almansa Sobrino================================
255*69447290SJavier Almansa Sobrino
256*69447290SJavier Almansa SobrinoRetrieve the Realm Attestation Token Signing key from EL3.
257*69447290SJavier Almansa Sobrino
258*69447290SJavier Almansa SobrinoFID
259*69447290SJavier Almansa Sobrino---
260*69447290SJavier Almansa Sobrino
261*69447290SJavier Almansa Sobrino``0xC40001B2``
262*69447290SJavier Almansa Sobrino
263*69447290SJavier Almansa SobrinoInput values
264*69447290SJavier Almansa Sobrino------------
265*69447290SJavier Almansa Sobrino
266*69447290SJavier Almansa Sobrino.. csv-table::
267*69447290SJavier Almansa Sobrino   :header: "Name", "Register", "Field", "Type", "Description"
268*69447290SJavier Almansa Sobrino   :widths: 1 1 1 1 5
269*69447290SJavier Almansa Sobrino
270*69447290SJavier Almansa Sobrino   fid,x0,[63:0],UInt64,Command FID
271*69447290SJavier Almansa Sobrino   buf_pa,x1,[63:0],Address,PA where the Realm Attestation Key must be stored by EL3. The PA must belong to the shared buffer
272*69447290SJavier Almansa Sobrino   buf_size,x2,[63:0],Size,Size in bytes of the Realm Attestation Key buffer. ``bufPa + bufSize`` must lie within the shared buffer
273*69447290SJavier Almansa Sobrino   ecc_curve,x3,[63:0],Enum,Type of the elliptic curve to which the requested attestation key belongs to. See :ref:`ecc_curves`
274*69447290SJavier Almansa Sobrino
275*69447290SJavier Almansa SobrinoOutput values
276*69447290SJavier Almansa Sobrino-------------
277*69447290SJavier Almansa Sobrino
278*69447290SJavier Almansa Sobrino.. csv-table::
279*69447290SJavier Almansa Sobrino   :header: "Name", "Register", "Field", "Type", "Description"
280*69447290SJavier Almansa Sobrino   :widths: 1 1 1 1 5
281*69447290SJavier Almansa Sobrino
282*69447290SJavier Almansa Sobrino   Result,x0,[63:0],Error Code,Command return status
283*69447290SJavier Almansa Sobrino   keySize,x1,[63:0],Size,Size of the Realm Attestation Key
284*69447290SJavier Almansa Sobrino
285*69447290SJavier Almansa SobrinoFailure conditions
286*69447290SJavier Almansa Sobrino------------------
287*69447290SJavier Almansa Sobrino
288*69447290SJavier Almansa SobrinoThe table below shows all the possible error codes returned in ``Result`` upon
289*69447290SJavier Almansa Sobrinoa failure. The errors are ordered by condition check.
290*69447290SJavier Almansa Sobrino
291*69447290SJavier Almansa Sobrino.. csv-table::
292*69447290SJavier Almansa Sobrino   :header: "ID", "Condition"
293*69447290SJavier Almansa Sobrino   :widths: 1 5
294*69447290SJavier Almansa Sobrino
295*69447290SJavier Almansa Sobrino   ``E_RMM_BAD_ADDR``,``PA`` is outside the shared buffer
296*69447290SJavier Almansa Sobrino   ``E_RMM_INVAL``,``PA + BSize`` is outside the shared buffer
297*69447290SJavier Almansa Sobrino   ``E_RMM_INVAL``,``Curve`` is not one of the listed in :ref:`ecc_curves`
298*69447290SJavier Almansa Sobrino   ``E_RMM_UNK``,An unknown error occurred whilst processing the command
299*69447290SJavier Almansa Sobrino   ``E_RMM_OK``,No errors detected
300*69447290SJavier Almansa Sobrino
301*69447290SJavier Almansa Sobrino.. _ecc_curves:
302*69447290SJavier Almansa Sobrino
303*69447290SJavier Almansa SobrinoSupported ECC Curves
304*69447290SJavier Almansa Sobrino--------------------
305*69447290SJavier Almansa Sobrino
306*69447290SJavier Almansa Sobrino.. csv-table::
307*69447290SJavier Almansa Sobrino   :header: "ID", "Curve"
308*69447290SJavier Almansa Sobrino   :widths: 1 5
309*69447290SJavier Almansa Sobrino
310*69447290SJavier Almansa Sobrino   0,ECC SECP384R1
311*69447290SJavier Almansa Sobrino
312*69447290SJavier Almansa SobrinoRMM_ATTEST_GET_PLAT_TOKEN command
313*69447290SJavier Almansa Sobrino=================================
314*69447290SJavier Almansa Sobrino
315*69447290SJavier Almansa SobrinoRetrieve the Platform Token from EL3.
316*69447290SJavier Almansa Sobrino
317*69447290SJavier Almansa SobrinoFID
318*69447290SJavier Almansa Sobrino---
319*69447290SJavier Almansa Sobrino
320*69447290SJavier Almansa Sobrino``0xC40001B3``
321*69447290SJavier Almansa Sobrino
322*69447290SJavier Almansa SobrinoInput values
323*69447290SJavier Almansa Sobrino------------
324*69447290SJavier Almansa Sobrino
325*69447290SJavier Almansa Sobrino.. csv-table::
326*69447290SJavier Almansa Sobrino   :header: "Name", "Register", "Field", "Type", "Description"
327*69447290SJavier Almansa Sobrino   :widths: 1 1 1 1 5
328*69447290SJavier Almansa Sobrino
329*69447290SJavier Almansa Sobrino   fid,x0,[63:0],UInt64,Command FID
330*69447290SJavier Almansa Sobrino   buf_pa,x1,[63:0],Address,PA of the platform attestation token. The challenge object is passed in this buffer. The PA must belong to the shared buffer
331*69447290SJavier Almansa Sobrino   buf_size,x2,[63:0],Size,Size in bytes of the platform attestation token buffer. ``bufPa + bufSize`` must lie within the shared buffer
332*69447290SJavier Almansa Sobrino   c_size,x3,[63:0],Size,Size in bytes of the challenge object. It corresponds to the size of one of the defined SHA algorithms
333*69447290SJavier Almansa Sobrino
334*69447290SJavier Almansa SobrinoOutput values
335*69447290SJavier Almansa Sobrino-------------
336*69447290SJavier Almansa Sobrino
337*69447290SJavier Almansa Sobrino.. csv-table::
338*69447290SJavier Almansa Sobrino   :header: "Name", "Register", "Field", "Type", "Description"
339*69447290SJavier Almansa Sobrino   :widths: 1 1 1 1 5
340*69447290SJavier Almansa Sobrino
341*69447290SJavier Almansa Sobrino   Result,x0,[63:0],Error Code,Command return status
342*69447290SJavier Almansa Sobrino   tokenSize,x1,[63:0],Size,Size of the platform token
343*69447290SJavier Almansa Sobrino
344*69447290SJavier Almansa SobrinoFailure conditions
345*69447290SJavier Almansa Sobrino------------------
346*69447290SJavier Almansa Sobrino
347*69447290SJavier Almansa SobrinoThe table below shows all the possible error codes returned in ``Result`` upon
348*69447290SJavier Almansa Sobrinoa failure. The errors are ordered by condition check.
349*69447290SJavier Almansa Sobrino
350*69447290SJavier Almansa Sobrino.. csv-table::
351*69447290SJavier Almansa Sobrino   :header: "ID", "Condition"
352*69447290SJavier Almansa Sobrino   :widths: 1 5
353*69447290SJavier Almansa Sobrino
354*69447290SJavier Almansa Sobrino   ``E_RMM_BAD_ADDR``,``PA`` is outside the shared buffer
355*69447290SJavier Almansa Sobrino   ``E_RMM_INVAL``,``PA + BSize`` is outside the shared buffer
356*69447290SJavier Almansa Sobrino   ``E_RMM_INVAL``,``CSize`` does not represent the size of a supported SHA algorithm
357*69447290SJavier Almansa Sobrino   ``E_RMM_UNK``,An unknown error occurred whilst processing the command
358*69447290SJavier Almansa Sobrino   ``E_RMM_OK``,No errors detected
359*69447290SJavier Almansa Sobrino
360*69447290SJavier Almansa SobrinoRMM-EL3 world switch register save restore convention
361*69447290SJavier Almansa Sobrino_____________________________________________________
362*69447290SJavier Almansa Sobrino
363*69447290SJavier Almansa SobrinoAs part of NS world switch, EL3 is expected to maintain a register context
364*69447290SJavier Almansa Sobrinospecific to each world and will save and restore the registers
365*69447290SJavier Almansa Sobrinoappropriately. This section captures the contract between EL3 and RMM on the
366*69447290SJavier Almansa Sobrinoregister set to be saved and restored.
367*69447290SJavier Almansa Sobrino
368*69447290SJavier Almansa SobrinoEL3 must maintain a separate register context for the following:
369*69447290SJavier Almansa Sobrino
370*69447290SJavier Almansa Sobrino   #. General purpose registers (x0-x30) and ``sp_el0``, ``sp_el2`` stack pointers
371*69447290SJavier Almansa Sobrino   #. EL2 system register context for all enabled features by EL3. These include system registers with the ``_EL2`` prefix. The EL2 physical and virtual timer registers must not be included in this.
372*69447290SJavier Almansa Sobrino
373*69447290SJavier Almansa SobrinoIt is the responsibility of EL3 that the above registers will not be leaked to
374*69447290SJavier Almansa Sobrinothe NS Host and to maintain the confidentiality of the Realm World.
375*69447290SJavier Almansa Sobrino
376*69447290SJavier Almansa SobrinoEL3 will not save some registers as mentioned in the below list. It is the
377*69447290SJavier Almansa Sobrinoresponsibility of RMM to ensure that these are appropriately saved if the
378*69447290SJavier Almansa SobrinoRealm World makes use of them:
379*69447290SJavier Almansa Sobrino
380*69447290SJavier Almansa Sobrino   #. FP/SIMD registers
381*69447290SJavier Almansa Sobrino   #. SVE registers
382*69447290SJavier Almansa Sobrino   #. SME registers
383*69447290SJavier Almansa Sobrino   #. EL1/0 registers
384*69447290SJavier Almansa Sobrino
385*69447290SJavier Almansa SobrinoSMCCC v1.3 allows NS world to specify whether SVE context is in use. In this
386*69447290SJavier Almansa Sobrinocase, RMM could choose to not save the incoming SVE context but must ensure
387*69447290SJavier Almansa Sobrinoto clear SVE registers if they have been used in Realm World. The same applies
388*69447290SJavier Almansa Sobrinoto SME registers.
389*69447290SJavier Almansa Sobrino
390*69447290SJavier Almansa SobrinoTypes
391*69447290SJavier Almansa Sobrino_____
392*69447290SJavier Almansa Sobrino
393*69447290SJavier Almansa Sobrino.. _rmm_el3_manifest_struct:
394*69447290SJavier Almansa Sobrino
395*69447290SJavier Almansa SobrinoRMM-EL3 Boot Manifest Version
396*69447290SJavier Almansa Sobrino~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
397*69447290SJavier Almansa Sobrino
398*69447290SJavier Almansa SobrinoThe RMM-EL3 Boot Manifest structure contains platform boot information passed
399*69447290SJavier Almansa Sobrinofrom EL3 to RMM. The width of the Boot Manifest is 128 bits
400*69447290SJavier Almansa Sobrino
401*69447290SJavier Almansa Sobrino.. image:: ../resources/diagrams/rmm_el3_manifest_struct.png
402*69447290SJavier Almansa Sobrino
403*69447290SJavier Almansa SobrinoThe members of the RMM-EL3 Boot Manifest structure are shown in the following
404*69447290SJavier Almansa Sobrinotable:
405*69447290SJavier Almansa Sobrino
406*69447290SJavier Almansa Sobrino.. csv-table::
407*69447290SJavier Almansa Sobrino   :header: "Name", "Range", "Type", Description
408*69447290SJavier Almansa Sobrino   :widths: 2 1 1 4
409*69447290SJavier Almansa Sobrino
410*69447290SJavier Almansa Sobrino   ``Version Minor``,15:0,uint16_t,Version Minor part of the Boot Manifest Version.
411*69447290SJavier Almansa Sobrino   ``Version Major``,30:16,uint16_t,Version Major part of the Boot Manifest Version.
412*69447290SJavier Almansa Sobrino   ``RES0``,31,bit,Reserved. Set to 0.
413*69447290SJavier Almansa Sobrino   ``Platform Data``,127:64,Address,Pointer to the Platform Data section of the Boot Manifest.
414