169447290SJavier Almansa SobrinoRMM-EL3 Communication interface 269447290SJavier Almansa Sobrino******************************* 369447290SJavier Almansa Sobrino 469447290SJavier Almansa SobrinoThis document defines the communication interface between RMM and EL3. 569447290SJavier Almansa SobrinoThere are two parts in this interface: the boot interface and the runtime 669447290SJavier Almansa Sobrinointerface. 769447290SJavier Almansa Sobrino 869447290SJavier Almansa SobrinoThe Boot Interface defines the ABI between EL3 and RMM when the CPU enters 969447290SJavier Almansa SobrinoR-EL2 for the first time after boot. The cold boot interface defines the ABI 1069447290SJavier Almansa Sobrinofor the cold boot path and the warm boot interface defines the same for the 1169447290SJavier Almansa Sobrinowarm path. 1269447290SJavier Almansa Sobrino 1369447290SJavier Almansa SobrinoThe RMM-EL3 runtime interface defines the ABI for EL3 services which can be 1469447290SJavier Almansa Sobrinoinvoked by RMM as well as the register save-restore convention when handling an 1569447290SJavier Almansa SobrinoSMC call from NS. 1669447290SJavier Almansa Sobrino 1769447290SJavier Almansa SobrinoThe below sections discuss these interfaces more in detail. 1869447290SJavier Almansa Sobrino 1969447290SJavier Almansa Sobrino.. _rmm_el3_ifc_versioning: 2069447290SJavier Almansa Sobrino 2169447290SJavier Almansa SobrinoRMM-EL3 Interface versioning 2269447290SJavier Almansa Sobrino____________________________ 2369447290SJavier Almansa Sobrino 2469447290SJavier Almansa SobrinoThe RMM Boot and Runtime Interface uses a version number to check 2569447290SJavier Almansa Sobrinocompatibility with the register arguments passed as part of Boot Interface and 2669447290SJavier Almansa SobrinoRMM-EL3 runtime interface. 2769447290SJavier Almansa Sobrino 2869447290SJavier Almansa SobrinoThe Boot Manifest, discussed later in section :ref:`rmm_el3_boot_manifest`, 2969447290SJavier Almansa Sobrinouses a separate version number but with the same scheme. 3069447290SJavier Almansa Sobrino 3169447290SJavier Almansa SobrinoThe version number is a 32-bit type with the following fields: 3269447290SJavier Almansa Sobrino 3369447290SJavier Almansa Sobrino.. csv-table:: 3469447290SJavier Almansa Sobrino :header: "Bits", "Value" 3569447290SJavier Almansa Sobrino 3669447290SJavier Almansa Sobrino [0:15],``VERSION_MINOR`` 3769447290SJavier Almansa Sobrino [16:30],``VERSION_MAJOR`` 3869447290SJavier Almansa Sobrino [31],RES0 3969447290SJavier Almansa Sobrino 4069447290SJavier Almansa SobrinoThe version numbers are sequentially increased and the rules for updating them 4169447290SJavier Almansa Sobrinoare explained below: 4269447290SJavier Almansa Sobrino 4369447290SJavier Almansa Sobrino - ``VERSION_MAJOR``: This value is increased when changes break 4469447290SJavier Almansa Sobrino compatibility with previous versions. If the changes 4569447290SJavier Almansa Sobrino on the ABI are compatible with the previous one, ``VERSION_MAJOR`` 4669447290SJavier Almansa Sobrino remains unchanged. 4769447290SJavier Almansa Sobrino 4869447290SJavier Almansa Sobrino - ``VERSION_MINOR``: This value is increased on any change that is backwards 4969447290SJavier Almansa Sobrino compatible with the previous version. When ``VERSION_MAJOR`` is increased, 5069447290SJavier Almansa Sobrino ``VERSION_MINOR`` must be set to 0. 5169447290SJavier Almansa Sobrino 5269447290SJavier Almansa Sobrino - ``RES0``: Bit 31 of the version number is reserved 0 as to maintain 5369447290SJavier Almansa Sobrino consistency with the versioning schemes used in other parts of RMM. 5469447290SJavier Almansa Sobrino 55*b226357bSRaghu KrishnamurthyThis document specifies the 0.4 version of Boot Interface ABI and RMM-EL3 5688f7c87bSHarry Moultonservices specification and the 0.3 version of the Boot Manifest. 5769447290SJavier Almansa Sobrino 5869447290SJavier Almansa Sobrino.. _rmm_el3_boot_interface: 5969447290SJavier Almansa Sobrino 6069447290SJavier Almansa SobrinoRMM Boot Interface 6169447290SJavier Almansa Sobrino__________________ 6269447290SJavier Almansa Sobrino 6369447290SJavier Almansa SobrinoThis section deals with the Boot Interface part of the specification. 6469447290SJavier Almansa Sobrino 6569447290SJavier Almansa SobrinoOne of the goals of the Boot Interface is to allow EL3 firmware to pass 6669447290SJavier Almansa Sobrinodown into RMM certain platform specific information dynamically. This allows 6769447290SJavier Almansa SobrinoRMM to be less platform dependent and be more generic across platform 6869447290SJavier Almansa Sobrinovariations. It also allows RMM to be decoupled from the other boot loader 6969447290SJavier Almansa Sobrinoimages in the boot sequence and remain agnostic of any particular format used 7069447290SJavier Almansa Sobrinofor configuration files. 7169447290SJavier Almansa Sobrino 7269447290SJavier Almansa SobrinoThe Boot Interface ABI defines a set of register conventions and 7369447290SJavier Almansa Sobrinoalso a memory based manifest file to pass information from EL3 to RMM. The 741db295cfSAlexeiFedorovBoot Manifest and the associated platform data in it can be dynamically created 7569447290SJavier Almansa Sobrinoby EL3 and there is no restriction on how the data can be obtained (e.g by DTB, 7669447290SJavier Almansa Sobrinohoblist or other). 7769447290SJavier Almansa Sobrino 7869447290SJavier Almansa SobrinoThe register convention and the manifest are versioned separately to manage 7969447290SJavier Almansa Sobrinofuture enhancements and compatibility. 8069447290SJavier Almansa Sobrino 8169447290SJavier Almansa SobrinoRMM completes the boot by issuing the ``RMM_BOOT_COMPLETE`` SMC (0xC40001CF) 8269447290SJavier Almansa Sobrinoback to EL3. After the RMM has finished the boot process, it can only be 8369447290SJavier Almansa Sobrinoentered from EL3 as part of RMI handling. 8469447290SJavier Almansa Sobrino 8569447290SJavier Almansa SobrinoIf RMM returns an error during boot (in any CPU), then RMM must not be entered 8669447290SJavier Almansa Sobrinofrom any CPU. 8769447290SJavier Almansa Sobrino 8869447290SJavier Almansa Sobrino.. _rmm_cold_boot_interface: 8969447290SJavier Almansa Sobrino 9069447290SJavier Almansa SobrinoCold Boot Interface 9169447290SJavier Almansa Sobrino~~~~~~~~~~~~~~~~~~~ 9269447290SJavier Almansa Sobrino 9369447290SJavier Almansa SobrinoDuring cold boot RMM expects the following register values: 9469447290SJavier Almansa Sobrino 9569447290SJavier Almansa Sobrino.. csv-table:: 9669447290SJavier Almansa Sobrino :header: "Register", "Value" 9769447290SJavier Almansa Sobrino :widths: 1, 5 9869447290SJavier Almansa Sobrino 9969447290SJavier 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). 10069447290SJavier Almansa Sobrino x1,Version for this Boot Interface as defined in :ref:`rmm_el3_ifc_versioning`. 10169447290SJavier Almansa Sobrino x2,Maximum number of CPUs to be supported at runtime. RMM should ensure that it can support this maximum number. 1021db295cfSAlexeiFedorov 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. 10369447290SJavier Almansa Sobrino 104dc0ca64eSJavier Almansa SobrinoDuring cold boot, EL3 firmware needs to allocate a 4KB page that will be 10569447290SJavier Almansa Sobrinopassed to RMM in x3. This memory will be used as shared buffer for communication 10669447290SJavier Almansa Sobrinobetween EL3 and RMM. It must be assigned to Realm world and must be mapped with 10769447290SJavier Almansa SobrinoNormal memory attributes (IWB-OWB-ISH) at EL3. At boot, this memory will be 10869447290SJavier Almansa Sobrinoused to populate the Boot Manifest. Since the Boot Manifest can be accessed by 10969447290SJavier Almansa SobrinoRMM prior to enabling its MMU, EL3 must ensure that proper cache maintenance 11069447290SJavier Almansa Sobrinooperations are performed after the Boot Manifest is populated. 11169447290SJavier Almansa Sobrino 11269447290SJavier Almansa SobrinoEL3 should also ensure that this shared buffer is always available for use by RMM 11369447290SJavier Almansa Sobrinoduring the lifetime of the system and that it can be used for runtime 11469447290SJavier Almansa Sobrinocommunication between RMM and EL3. For example, when RMM invokes attestation 11569447290SJavier Almansa Sobrinoservice commands in EL3, this buffer can be used to exchange data between RMM 11669447290SJavier Almansa Sobrinoand EL3. It is also allowed for RMM to invoke runtime services provided by EL3 11769447290SJavier Almansa Sobrinoutilizing this buffer during the boot phase, prior to return back to EL3 via 11869447290SJavier Almansa SobrinoRMM_BOOT_COMPLETE SMC. 11969447290SJavier Almansa Sobrino 12069447290SJavier Almansa SobrinoRMM should map this memory page into its Stage 1 page-tables using Normal 12169447290SJavier Almansa Sobrinomemory attributes. 12269447290SJavier Almansa Sobrino 12369447290SJavier Almansa SobrinoDuring runtime, it is the RMM which initiates any communication with EL3. If that 12469447290SJavier Almansa Sobrinocommunication requires the use of the shared area, it is expected that RMM needs 12569447290SJavier Almansa Sobrinoto do the necessary concurrency protection to prevent the use of the same buffer 12669447290SJavier Almansa Sobrinoby other PEs. 12769447290SJavier Almansa Sobrino 12869447290SJavier Almansa SobrinoThe following sequence diagram shows how a generic EL3 Firmware would boot RMM. 12969447290SJavier Almansa Sobrino 13069447290SJavier Almansa Sobrino.. image:: ../resources/diagrams/rmm_cold_boot_generic.png 13169447290SJavier Almansa Sobrino 13269447290SJavier Almansa SobrinoWarm Boot Interface 13369447290SJavier Almansa Sobrino~~~~~~~~~~~~~~~~~~~ 13469447290SJavier Almansa Sobrino 13569447290SJavier Almansa SobrinoAt warm boot, RMM is already initialized and only some per-CPU initialization 13669447290SJavier Almansa Sobrinois still pending. The only argument that is required by RMM at this stage is 13769447290SJavier Almansa Sobrinothe CPU Id, which will be passed through register x0 whilst x1 to x3 are RES0. 13869447290SJavier Almansa SobrinoThis is summarized in the following table: 13969447290SJavier Almansa Sobrino 14069447290SJavier Almansa Sobrino.. csv-table:: 14169447290SJavier Almansa Sobrino :header: "Register", "Value" 14269447290SJavier Almansa Sobrino :widths: 1, 5 14369447290SJavier Almansa Sobrino 14469447290SJavier 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). 14569447290SJavier Almansa Sobrino x1 - x3,RES0 14669447290SJavier Almansa Sobrino 14769447290SJavier Almansa SobrinoBoot error handling and return values 14869447290SJavier Almansa Sobrino~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 14969447290SJavier Almansa Sobrino 15069447290SJavier Almansa SobrinoAfter boot up and initialization, RMM returns control back to EL3 through a 15169447290SJavier Almansa Sobrino``RMM_BOOT_COMPLETE`` SMC call. The only argument of this SMC call will 15269447290SJavier Almansa Sobrinobe returned in x1 and it will encode a signed integer with the error reason 15369447290SJavier Almansa Sobrinoas per the following table: 15469447290SJavier Almansa Sobrino 15569447290SJavier Almansa Sobrino.. csv-table:: 15669447290SJavier Almansa Sobrino :header: "Error code", "Description", "ID" 15769447290SJavier Almansa Sobrino :widths: 2 4 1 15869447290SJavier Almansa Sobrino 15969447290SJavier Almansa Sobrino ``E_RMM_BOOT_SUCCESS``,Boot successful,0 16069447290SJavier Almansa Sobrino ``E_RMM_BOOT_ERR_UNKNOWN``,Unknown error,-1 16169447290SJavier Almansa Sobrino ``E_RMM_BOOT_VERSION_NOT_VALID``,Boot Interface version reported by EL3 is not supported by RMM,-2 162ca99680cSJavier Almansa Sobrino ``E_RMM_BOOT_CPUS_OUT_OF_RANGE``,Number of CPUs reported by EL3 larger than maximum supported by RMM,-3 163ca99680cSJavier Almansa Sobrino ``E_RMM_BOOT_CPU_ID_OUT_OF_RANGE``,Current CPU Id is higher or equal than the number of CPUs supported by RMM,-4 16469447290SJavier Almansa Sobrino ``E_RMM_BOOT_INVALID_SHARED_BUFFER``,Invalid pointer to shared memory area,-5 1651db295cfSAlexeiFedorov ``E_RMM_BOOT_MANIFEST_VERSION_NOT_SUPPORTED``,Version reported by the Boot Manifest not supported by RMM,-6 1661db295cfSAlexeiFedorov ``E_RMM_BOOT_MANIFEST_DATA_ERROR``,Error parsing core Boot Manifest,-7 16769447290SJavier Almansa Sobrino 16869447290SJavier Almansa SobrinoFor any error detected in RMM during cold or warm boot, RMM will return back to 16969447290SJavier Almansa SobrinoEL3 using ``RMM_BOOT_COMPLETE`` SMC with an appropriate error code. It is 17069447290SJavier Almansa Sobrinoexpected that EL3 will take necessary action to disable Realm world for further 17169447290SJavier Almansa Sobrinoentry from NS Host on receiving an error. This will be done across all the PEs 17269447290SJavier Almansa Sobrinoin the system so as to present a symmetric view to the NS Host. Any further 17369447290SJavier Almansa Sobrinowarm boot by any PE should not enter RMM using the warm boot interface. 17469447290SJavier Almansa Sobrino 17569447290SJavier Almansa Sobrino.. _rmm_el3_boot_manifest: 17669447290SJavier Almansa Sobrino 17769447290SJavier Almansa SobrinoBoot Manifest 17869447290SJavier Almansa Sobrino~~~~~~~~~~~~~ 17969447290SJavier Almansa Sobrino 1801db295cfSAlexeiFedorovDuring cold boot, EL3 Firmware passes a memory Boot Manifest to RMM containing 18169447290SJavier Almansa Sobrinoplatform information. 18269447290SJavier Almansa Sobrino 1831db295cfSAlexeiFedorovThis Boot Manifest is versioned independently of the Boot Interface, to help 1841db295cfSAlexeiFedorovevolve the former independent of the latter. 18588f7c87bSHarry MoultonThe current version for the Boot Manifest is ``v0.3`` and the rules explained 18669447290SJavier Almansa Sobrinoin :ref:`rmm_el3_ifc_versioning` apply on this version as well. 18769447290SJavier Almansa Sobrino 18888f7c87bSHarry MoultonThe Boot Manifest v0.3 has the following fields: 18969447290SJavier Almansa Sobrino 19088f7c87bSHarry Moulton - version : Version of the Manifest (v0.3) 1911db295cfSAlexeiFedorov - plat_data : Pointer to the platform specific data and not specified by this 1921db295cfSAlexeiFedorov document. These data are optional and can be NULL. 1931db295cfSAlexeiFedorov - plat_dram : Structure encoding the NS DRAM information on the platform. This 19488f7c87bSHarry Moulton field is optional and platform can choose to zero out this structure if 1951db295cfSAlexeiFedorov RMM does not need EL3 to send this information during the boot. 19688f7c87bSHarry Moulton - plat_console : Structure encoding the list of consoles for RMM use on the 19788f7c87bSHarry Moulton platform. This field is optional and platform can choose to not populate 19888f7c87bSHarry Moulton the console list if this is not needed by the RMM for this platform. 19969447290SJavier Almansa Sobrino 2001db295cfSAlexeiFedorovFor the current version of the Boot Manifest, the core manifest contains a pointer 2011db295cfSAlexeiFedorovto the platform data. EL3 must ensure that the whole Boot Manifest, including 2021db295cfSAlexeiFedorovthe platform data, if available, fits inside the RMM EL3 shared buffer. 20369447290SJavier Almansa Sobrino 2041db295cfSAlexeiFedorovFor the data structure specification of Boot Manifest, refer to 20569447290SJavier Almansa Sobrino:ref:`rmm_el3_manifest_struct` 20669447290SJavier Almansa Sobrino 20769447290SJavier Almansa Sobrino.. _runtime_services_and_interface: 20869447290SJavier Almansa Sobrino 209e50fedbcSJavier Almansa SobrinoRMM-EL3 Runtime Interface 21069447290SJavier Almansa Sobrino__________________________ 21169447290SJavier Almansa Sobrino 21269447290SJavier Almansa SobrinoThis section defines the RMM-EL3 runtime interface which specifies the ABI for 21369447290SJavier Almansa SobrinoEL3 services expected by RMM at runtime as well as the register save and 21469447290SJavier Almansa Sobrinorestore convention between EL3 and RMM as part of RMI call handling. It is 21569447290SJavier Almansa Sobrinoimportant to note that RMM is allowed to invoke EL3-RMM runtime interface 21669447290SJavier Almansa Sobrinoservices during the boot phase as well. The EL3 runtime service handling must 21769447290SJavier Almansa Sobrinonot result in a world switch to another world unless specified. Both the RMM 21869447290SJavier Almansa Sobrinoand EL3 are allowed to make suitable optimizations based on this assumption. 21969447290SJavier Almansa Sobrino 22069447290SJavier Almansa SobrinoIf the interface requires the use of memory, then the memory references should 22169447290SJavier Almansa Sobrinobe within the shared buffer communicated as part of the boot interface. See 22269447290SJavier Almansa Sobrino:ref:`rmm_cold_boot_interface` for properties of this shared buffer which both 22369447290SJavier Almansa SobrinoEL3 and RMM must adhere to. 22469447290SJavier Almansa Sobrino 22569447290SJavier Almansa SobrinoRMM-EL3 runtime service return codes 22669447290SJavier Almansa Sobrino~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 22769447290SJavier Almansa Sobrino 22869447290SJavier Almansa SobrinoThe return codes from EL3 to RMM is a 32 bit signed integer which encapsulates 22969447290SJavier Almansa Sobrinoerror condition as described in the following table: 23069447290SJavier Almansa Sobrino 23169447290SJavier Almansa Sobrino.. csv-table:: 23269447290SJavier Almansa Sobrino :header: "Error code", "Description", "ID" 23369447290SJavier Almansa Sobrino :widths: 2 4 1 23469447290SJavier Almansa Sobrino 23569447290SJavier Almansa Sobrino ``E_RMM_OK``,No errors detected,0 23669447290SJavier Almansa Sobrino ``E_RMM_UNK``,Unknown/Generic error,-1 23769447290SJavier Almansa Sobrino ``E_RMM_BAD_ADDR``,The value of an address used as argument was invalid,-2 23869447290SJavier Almansa Sobrino ``E_RMM_BAD_PAS``,Incorrect PAS,-3 23969447290SJavier Almansa Sobrino ``E_RMM_NOMEM``,Not enough memory to perform an operation,-4 24069447290SJavier Almansa Sobrino ``E_RMM_INVAL``,The value of an argument was invalid,-5 24142cf6026SJuan Pablo Conde ``E_RMM_AGAIN``,The resource is busy. Try again.,-6 24269447290SJavier Almansa Sobrino 24369447290SJavier Almansa SobrinoIf multiple failure conditions are detected in an RMM to EL3 command, then EL3 24469447290SJavier Almansa Sobrinois allowed to return an error code corresponding to any of the failure 24569447290SJavier Almansa Sobrinoconditions. 24669447290SJavier Almansa Sobrino 24769447290SJavier Almansa SobrinoRMM-EL3 runtime services 24869447290SJavier Almansa Sobrino~~~~~~~~~~~~~~~~~~~~~~~~ 24969447290SJavier Almansa Sobrino 25069447290SJavier Almansa SobrinoThe following table summarizes the RMM runtime services that need to be 25169447290SJavier Almansa Sobrinoimplemented by EL3 Firmware. 25269447290SJavier Almansa Sobrino 25369447290SJavier Almansa Sobrino.. csv-table:: 25469447290SJavier Almansa Sobrino :header: "FID", "Command" 25569447290SJavier Almansa Sobrino :widths: 2 5 25669447290SJavier Almansa Sobrino 257e50fedbcSJavier Almansa Sobrino 0xC400018F,``RMM_RMI_REQ_COMPLETE`` 258e50fedbcSJavier Almansa Sobrino 0xC40001B0,``RMM_GTSI_DELEGATE`` 259e50fedbcSJavier Almansa Sobrino 0xC40001B1,``RMM_GTSI_UNDELEGATE`` 26069447290SJavier Almansa Sobrino 0xC40001B2,``RMM_ATTEST_GET_REALM_KEY`` 26169447290SJavier Almansa Sobrino 0xC40001B3,``RMM_ATTEST_GET_PLAT_TOKEN`` 262*b226357bSRaghu Krishnamurthy 0xC40001B4,``RMM_EL3_FEATURES`` 263*b226357bSRaghu Krishnamurthy 0xC40001B5,``RMM_EL3_TOKEN_SIGN`` 26469447290SJavier Almansa Sobrino 265e50fedbcSJavier Almansa SobrinoRMM_RMI_REQ_COMPLETE command 266e50fedbcSJavier Almansa Sobrino============================ 267e50fedbcSJavier Almansa Sobrino 268e50fedbcSJavier Almansa SobrinoNotifies the completion of an RMI call to the Non-Secure world. 269e50fedbcSJavier Almansa Sobrino 270e50fedbcSJavier Almansa SobrinoThis call is the only function currently in RMM-EL3 runtime interface which 271e50fedbcSJavier Almansa Sobrinoresults in a world switch to NS. This call is the reply to the original RMI 272e50fedbcSJavier Almansa Sobrinocall and it is forwarded by EL3 to the NS world. 273e50fedbcSJavier Almansa Sobrino 274e50fedbcSJavier Almansa SobrinoFID 275e50fedbcSJavier Almansa Sobrino--- 276e50fedbcSJavier Almansa Sobrino 277e50fedbcSJavier Almansa Sobrino``0xC400018F`` 278e50fedbcSJavier Almansa Sobrino 279e50fedbcSJavier Almansa SobrinoInput values 280e50fedbcSJavier Almansa Sobrino------------ 281e50fedbcSJavier Almansa Sobrino 282e50fedbcSJavier Almansa Sobrino.. csv-table:: 283e50fedbcSJavier Almansa Sobrino :header: "Name", "Register", "Field", "Type", "Description" 284e50fedbcSJavier Almansa Sobrino :widths: 1 1 1 1 5 285e50fedbcSJavier Almansa Sobrino 286e50fedbcSJavier Almansa Sobrino fid,x0,[63:0],UInt64,Command FID 287e50fedbcSJavier Almansa Sobrino err_code,x1,[63:0],RmiCommandReturnCode,Error code returned by the RMI service invoked by NS World. See Realm Management Monitor specification for more info 288e50fedbcSJavier Almansa Sobrino 289e50fedbcSJavier Almansa SobrinoOutput values 290e50fedbcSJavier Almansa Sobrino------------- 291e50fedbcSJavier Almansa Sobrino 292e50fedbcSJavier Almansa SobrinoThis call does not return. 293e50fedbcSJavier Almansa Sobrino 294e50fedbcSJavier Almansa SobrinoFailure conditions 295e50fedbcSJavier Almansa Sobrino------------------ 296e50fedbcSJavier Almansa Sobrino 297e50fedbcSJavier Almansa SobrinoSince this call does not return to RMM, there is no failure condition which 298e50fedbcSJavier Almansa Sobrinocan be notified back to RMM. 299e50fedbcSJavier Almansa Sobrino 300e50fedbcSJavier Almansa SobrinoRMM_GTSI_DELEGATE command 301e50fedbcSJavier Almansa Sobrino========================= 302e50fedbcSJavier Almansa Sobrino 303e50fedbcSJavier Almansa SobrinoDelegate a memory granule by changing its PAS from Non-Secure to Realm. 304e50fedbcSJavier Almansa Sobrino 305e50fedbcSJavier Almansa SobrinoFID 306e50fedbcSJavier Almansa Sobrino--- 307e50fedbcSJavier Almansa Sobrino 308e50fedbcSJavier Almansa Sobrino``0xC40001B0`` 309e50fedbcSJavier Almansa Sobrino 310e50fedbcSJavier Almansa SobrinoInput values 311e50fedbcSJavier Almansa Sobrino------------ 312e50fedbcSJavier Almansa Sobrino 313e50fedbcSJavier Almansa Sobrino.. csv-table:: 314e50fedbcSJavier Almansa Sobrino :header: "Name", "Register", "Field", "Type", "Description" 315e50fedbcSJavier Almansa Sobrino :widths: 1 1 1 1 5 316e50fedbcSJavier Almansa Sobrino 317e50fedbcSJavier Almansa Sobrino fid,x0,[63:0],UInt64,Command FID 318e50fedbcSJavier Almansa Sobrino base_pa,x1,[63:0],Address,PA of the start of the granule to be delegated 319e50fedbcSJavier Almansa Sobrino 320e50fedbcSJavier Almansa SobrinoOutput values 321e50fedbcSJavier Almansa Sobrino------------- 322e50fedbcSJavier Almansa Sobrino 323e50fedbcSJavier Almansa Sobrino.. csv-table:: 324e50fedbcSJavier Almansa Sobrino :header: "Name", "Register", "Field", "Type", "Description" 325e50fedbcSJavier Almansa Sobrino :widths: 1 1 1 2 4 326e50fedbcSJavier Almansa Sobrino 327e50fedbcSJavier Almansa Sobrino Result,x0,[63:0],Error Code,Command return status 328e50fedbcSJavier Almansa Sobrino 329e50fedbcSJavier Almansa SobrinoFailure conditions 330e50fedbcSJavier Almansa Sobrino------------------ 331e50fedbcSJavier Almansa Sobrino 332e50fedbcSJavier Almansa SobrinoThe table below shows all the possible error codes returned in ``Result`` upon 333e50fedbcSJavier Almansa Sobrinoa failure. The errors are ordered by condition check. 334e50fedbcSJavier Almansa Sobrino 335e50fedbcSJavier Almansa Sobrino.. csv-table:: 336e50fedbcSJavier Almansa Sobrino :header: "ID", "Condition" 337e50fedbcSJavier Almansa Sobrino :widths: 1 5 338e50fedbcSJavier Almansa Sobrino 339e50fedbcSJavier Almansa Sobrino ``E_RMM_BAD_ADDR``,``PA`` does not correspond to a valid granule address 340e50fedbcSJavier Almansa Sobrino ``E_RMM_BAD_PAS``,The granule pointed by ``PA`` does not belong to Non-Secure PAS 341e50fedbcSJavier Almansa Sobrino ``E_RMM_OK``,No errors detected 342e50fedbcSJavier Almansa Sobrino 343e50fedbcSJavier Almansa SobrinoRMM_GTSI_UNDELEGATE command 344e50fedbcSJavier Almansa Sobrino=========================== 345e50fedbcSJavier Almansa Sobrino 346e50fedbcSJavier Almansa SobrinoUndelegate a memory granule by changing its PAS from Realm to Non-Secure. 347e50fedbcSJavier Almansa Sobrino 348e50fedbcSJavier Almansa SobrinoFID 349e50fedbcSJavier Almansa Sobrino--- 350e50fedbcSJavier Almansa Sobrino 351e50fedbcSJavier Almansa Sobrino``0xC40001B1`` 352e50fedbcSJavier Almansa Sobrino 353e50fedbcSJavier Almansa SobrinoInput values 354e50fedbcSJavier Almansa Sobrino------------ 355e50fedbcSJavier Almansa Sobrino 356e50fedbcSJavier Almansa Sobrino.. csv-table:: 357e50fedbcSJavier Almansa Sobrino :header: "Name", "Register", "Field", "Type", "Description" 358e50fedbcSJavier Almansa Sobrino :widths: 1 1 1 1 5 359e50fedbcSJavier Almansa Sobrino 360e50fedbcSJavier Almansa Sobrino fid,x0,[63:0],UInt64,Command FID 361e50fedbcSJavier Almansa Sobrino base_pa,x1,[63:0],Address,PA of the start of the granule to be undelegated 362e50fedbcSJavier Almansa Sobrino 363e50fedbcSJavier Almansa SobrinoOutput values 364e50fedbcSJavier Almansa Sobrino------------- 365e50fedbcSJavier Almansa Sobrino 366e50fedbcSJavier Almansa Sobrino.. csv-table:: 367e50fedbcSJavier Almansa Sobrino :header: "Name", "Register", "Field", "Type", "Description" 368e50fedbcSJavier Almansa Sobrino :widths: 1 1 1 2 4 369e50fedbcSJavier Almansa Sobrino 370e50fedbcSJavier Almansa Sobrino Result,x0,[63:0],Error Code,Command return status 371e50fedbcSJavier Almansa Sobrino 372e50fedbcSJavier Almansa SobrinoFailure conditions 373e50fedbcSJavier Almansa Sobrino------------------ 374e50fedbcSJavier Almansa Sobrino 375e50fedbcSJavier Almansa SobrinoThe table below shows all the possible error codes returned in ``Result`` upon 376e50fedbcSJavier Almansa Sobrinoa failure. The errors are ordered by condition check. 377e50fedbcSJavier Almansa Sobrino 378e50fedbcSJavier Almansa Sobrino.. csv-table:: 379e50fedbcSJavier Almansa Sobrino :header: "ID", "Condition" 380e50fedbcSJavier Almansa Sobrino :widths: 1 5 381e50fedbcSJavier Almansa Sobrino 382e50fedbcSJavier Almansa Sobrino ``E_RMM_BAD_ADDR``,``PA`` does not correspond to a valid granule address 383e50fedbcSJavier Almansa Sobrino ``E_RMM_BAD_PAS``,The granule pointed by ``PA`` does not belong to Realm PAS 384e50fedbcSJavier Almansa Sobrino ``E_RMM_OK``,No errors detected 385e50fedbcSJavier Almansa Sobrino 38669447290SJavier Almansa SobrinoRMM_ATTEST_GET_REALM_KEY command 38769447290SJavier Almansa Sobrino================================ 38869447290SJavier Almansa Sobrino 38969447290SJavier Almansa SobrinoRetrieve the Realm Attestation Token Signing key from EL3. 39069447290SJavier Almansa Sobrino 39169447290SJavier Almansa SobrinoFID 39269447290SJavier Almansa Sobrino--- 39369447290SJavier Almansa Sobrino 39469447290SJavier Almansa Sobrino``0xC40001B2`` 39569447290SJavier Almansa Sobrino 39669447290SJavier Almansa SobrinoInput values 39769447290SJavier Almansa Sobrino------------ 39869447290SJavier Almansa Sobrino 39969447290SJavier Almansa Sobrino.. csv-table:: 40069447290SJavier Almansa Sobrino :header: "Name", "Register", "Field", "Type", "Description" 40169447290SJavier Almansa Sobrino :widths: 1 1 1 1 5 40269447290SJavier Almansa Sobrino 40369447290SJavier Almansa Sobrino fid,x0,[63:0],UInt64,Command FID 40469447290SJavier 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 40569447290SJavier 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 40669447290SJavier 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` 40769447290SJavier Almansa Sobrino 40869447290SJavier Almansa SobrinoOutput values 40969447290SJavier Almansa Sobrino------------- 41069447290SJavier Almansa Sobrino 41169447290SJavier Almansa Sobrino.. csv-table:: 41269447290SJavier Almansa Sobrino :header: "Name", "Register", "Field", "Type", "Description" 41369447290SJavier Almansa Sobrino :widths: 1 1 1 1 5 41469447290SJavier Almansa Sobrino 41569447290SJavier Almansa Sobrino Result,x0,[63:0],Error Code,Command return status 41669447290SJavier Almansa Sobrino keySize,x1,[63:0],Size,Size of the Realm Attestation Key 41769447290SJavier Almansa Sobrino 41869447290SJavier Almansa SobrinoFailure conditions 41969447290SJavier Almansa Sobrino------------------ 42069447290SJavier Almansa Sobrino 42169447290SJavier Almansa SobrinoThe table below shows all the possible error codes returned in ``Result`` upon 42269447290SJavier Almansa Sobrinoa failure. The errors are ordered by condition check. 42369447290SJavier Almansa Sobrino 42469447290SJavier Almansa Sobrino.. csv-table:: 42569447290SJavier Almansa Sobrino :header: "ID", "Condition" 42669447290SJavier Almansa Sobrino :widths: 1 5 42769447290SJavier Almansa Sobrino 42869447290SJavier Almansa Sobrino ``E_RMM_BAD_ADDR``,``PA`` is outside the shared buffer 42969447290SJavier Almansa Sobrino ``E_RMM_INVAL``,``PA + BSize`` is outside the shared buffer 43069447290SJavier Almansa Sobrino ``E_RMM_INVAL``,``Curve`` is not one of the listed in :ref:`ecc_curves` 43169447290SJavier Almansa Sobrino ``E_RMM_UNK``,An unknown error occurred whilst processing the command 43269447290SJavier Almansa Sobrino ``E_RMM_OK``,No errors detected 43369447290SJavier Almansa Sobrino 43469447290SJavier Almansa Sobrino.. _ecc_curves: 43569447290SJavier Almansa Sobrino 43669447290SJavier Almansa SobrinoSupported ECC Curves 43769447290SJavier Almansa Sobrino-------------------- 43869447290SJavier Almansa Sobrino 43969447290SJavier Almansa Sobrino.. csv-table:: 44069447290SJavier Almansa Sobrino :header: "ID", "Curve" 44169447290SJavier Almansa Sobrino :widths: 1 5 44269447290SJavier Almansa Sobrino 44369447290SJavier Almansa Sobrino 0,ECC SECP384R1 44469447290SJavier Almansa Sobrino 44569447290SJavier Almansa SobrinoRMM_ATTEST_GET_PLAT_TOKEN command 44669447290SJavier Almansa Sobrino================================= 44769447290SJavier Almansa Sobrino 44842cf6026SJuan Pablo CondeRetrieve the Platform Token from EL3. If the entire token does not fit in the 44942cf6026SJuan Pablo Condebuffer, EL3 returns a hunk of the token (via ``tokenHunkSize`` parameter) and 45042cf6026SJuan Pablo Condeindicates the remaining bytes that are pending retrieval (via ``remainingSize`` 45142cf6026SJuan Pablo Condeparameter). The challenge object for the platform token must be populated in 45242cf6026SJuan Pablo Condethe buffer for the first call of this command and the size of the object is 45342cf6026SJuan Pablo Condeindicated by ``c_size`` parameter. Subsequent calls to retrieve remaining hunks of 45442cf6026SJuan Pablo Condethe token must be made with ``c_size`` as 0. 45542cf6026SJuan Pablo Conde 45642cf6026SJuan Pablo CondeIf ``c_size`` is not 0, this command could cause regeneration of platform token 45742cf6026SJuan Pablo Condeand will return token hunk corresponding to beginning of the token. 45842cf6026SJuan Pablo Conde 45942cf6026SJuan Pablo CondeIt is valid for the calls of this command to return ``E_RMM_AGAIN`` error, 46042cf6026SJuan Pablo Condewhich is an indication to the caller to retry this command again. Depending on the 46142cf6026SJuan Pablo Condeplatform, this mechanism can be used to implement queuing to HES, if HES is 46242cf6026SJuan Pablo Condeinvolved in platform token generation. 46369447290SJavier Almansa Sobrino 46469447290SJavier Almansa SobrinoFID 46569447290SJavier Almansa Sobrino--- 46669447290SJavier Almansa Sobrino 46769447290SJavier Almansa Sobrino``0xC40001B3`` 46869447290SJavier Almansa Sobrino 46969447290SJavier Almansa SobrinoInput values 47069447290SJavier Almansa Sobrino------------ 47169447290SJavier Almansa Sobrino 47269447290SJavier Almansa Sobrino.. csv-table:: 47369447290SJavier Almansa Sobrino :header: "Name", "Register", "Field", "Type", "Description" 47469447290SJavier Almansa Sobrino :widths: 1 1 1 1 5 47569447290SJavier Almansa Sobrino 47669447290SJavier Almansa Sobrino fid,x0,[63:0],UInt64,Command FID 47742cf6026SJuan Pablo Conde buf_pa,x1,[63:0],Address,"PA of the platform attestation token. The challenge object must be passed in this buffer for the first call of this command. Any subsequent calls, if required to retrieve the full token, should not have this object. The PA must belong to the shared buffer." 47869447290SJavier 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 47942cf6026SJuan Pablo Conde 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. Any subsequent calls, if required to retrieve the full token, should set this size to 0." 48069447290SJavier Almansa Sobrino 48169447290SJavier Almansa SobrinoOutput values 48269447290SJavier Almansa Sobrino------------- 48369447290SJavier Almansa Sobrino 48469447290SJavier Almansa Sobrino.. csv-table:: 48569447290SJavier Almansa Sobrino :header: "Name", "Register", "Field", "Type", "Description" 48669447290SJavier Almansa Sobrino :widths: 1 1 1 1 5 48769447290SJavier Almansa Sobrino 48869447290SJavier Almansa Sobrino Result,x0,[63:0],Error Code,Command return status 48942cf6026SJuan Pablo Conde tokenHunkSize,x1,[63:0],Size,Size of the platform token hunk retrieved 49042cf6026SJuan Pablo Conde remainingSize,x2,[63:0],Size,Remaining bytes of the token that are pending retrieval 49169447290SJavier Almansa Sobrino 49269447290SJavier Almansa SobrinoFailure conditions 49369447290SJavier Almansa Sobrino------------------ 49469447290SJavier Almansa Sobrino 49569447290SJavier Almansa SobrinoThe table below shows all the possible error codes returned in ``Result`` upon 49669447290SJavier Almansa Sobrinoa failure. The errors are ordered by condition check. 49769447290SJavier Almansa Sobrino 49869447290SJavier Almansa Sobrino.. csv-table:: 49969447290SJavier Almansa Sobrino :header: "ID", "Condition" 50069447290SJavier Almansa Sobrino :widths: 1 5 50169447290SJavier Almansa Sobrino 50242cf6026SJuan Pablo Conde ``E_RMM_AGAIN``,Resource for Platform token retrieval is busy. Try again. 50369447290SJavier Almansa Sobrino ``E_RMM_BAD_ADDR``,``PA`` is outside the shared buffer 50469447290SJavier Almansa Sobrino ``E_RMM_INVAL``,``PA + BSize`` is outside the shared buffer 50542cf6026SJuan Pablo Conde ``E_RMM_INVAL``,``CSize`` does not represent the size of a supported SHA algorithm for the first call to this command 50642cf6026SJuan Pablo Conde ``E_RMM_INVAL``,``CSize`` is not 0 for subsequent calls to retrieve remaining hunks of the token 50769447290SJavier Almansa Sobrino ``E_RMM_UNK``,An unknown error occurred whilst processing the command 50869447290SJavier Almansa Sobrino ``E_RMM_OK``,No errors detected 50969447290SJavier Almansa Sobrino 510*b226357bSRaghu KrishnamurthyRMM_EL3_FEATURES command 511*b226357bSRaghu Krishnamurthy======================== 512*b226357bSRaghu Krishnamurthy 513*b226357bSRaghu KrishnamurthyThis command provides a mechanism to discover features and ABIs supported by the 514*b226357bSRaghu KrishnamurthyRMM-EL3 interface, for a given version. This command is helpful when there are 515*b226357bSRaghu Krishnamurthyplatform specific optional RMM-EL3 interfaces and features exposed by vendor 516*b226357bSRaghu Krishnamurthyspecific EL3 firmware, and a generic RMM that can modify its behavior based on 517*b226357bSRaghu Krishnamurthydiscovery of EL3 features. 518*b226357bSRaghu Krishnamurthy 519*b226357bSRaghu KrishnamurthyThe features can be discovered by specifying the feature register index that 520*b226357bSRaghu Krishnamurthyhas fields defined to indicate presence or absence of features and other 521*b226357bSRaghu Krishnamurthyrelevant information. The feature register index is specified in the 522*b226357bSRaghu Krishnamurthy``feat_reg_idx`` parameter. Each feature register is a 64 bit register. 523*b226357bSRaghu Krishnamurthy 524*b226357bSRaghu KrishnamurthyThis command is available from v0.4 of the RMM-EL3 interface. 525*b226357bSRaghu Krishnamurthy 526*b226357bSRaghu KrishnamurthyThe following is the register definition for feature register index 0 for 527*b226357bSRaghu Krishnamurthyv0.4 of the interface: 528*b226357bSRaghu Krishnamurthy 529*b226357bSRaghu KrishnamurthyRMM-EL3 Feature Resister 0 530*b226357bSRaghu Krishnamurthy-------------------------- 531*b226357bSRaghu Krishnamurthy 532*b226357bSRaghu Krishnamurthy.. code-block:: none 533*b226357bSRaghu Krishnamurthy 534*b226357bSRaghu Krishnamurthy 63 32 31 16 15 8 7 1 0 535*b226357bSRaghu Krishnamurthy +-------+-------+-------+-------+-------+-------+-------+-------+ 536*b226357bSRaghu Krishnamurthy | | | | | | | | | 537*b226357bSRaghu Krishnamurthy | | | | | | | | | 538*b226357bSRaghu Krishnamurthy +-------+-------+-------+-------+-------+-------+-------+-------+ 539*b226357bSRaghu Krishnamurthy ^ 540*b226357bSRaghu Krishnamurthy | 541*b226357bSRaghu Krishnamurthy RMMD_EL3_TOKEN_SIGN 542*b226357bSRaghu Krishnamurthy 543*b226357bSRaghu Krishnamurthy**Bit Fields:** 544*b226357bSRaghu Krishnamurthy 545*b226357bSRaghu Krishnamurthy- **Bit 0**: `RMMD_EL3_TOKEN_SIGN` 546*b226357bSRaghu Krishnamurthy - When set to 1, the `RMMD_EL3_TOKEN_SIGN` feature is enabled. 547*b226357bSRaghu Krishnamurthy - When cleared (0), the feature is disabled. 548*b226357bSRaghu Krishnamurthy- **Bits [1:63]**: Reserved (must be zero) 549*b226357bSRaghu Krishnamurthy 550*b226357bSRaghu KrishnamurthyFID 551*b226357bSRaghu Krishnamurthy--- 552*b226357bSRaghu Krishnamurthy 553*b226357bSRaghu Krishnamurthy``0xC40001B4`` 554*b226357bSRaghu Krishnamurthy 555*b226357bSRaghu Krishnamurthy 556*b226357bSRaghu KrishnamurthyInput values 557*b226357bSRaghu Krishnamurthy------------ 558*b226357bSRaghu Krishnamurthy 559*b226357bSRaghu Krishnamurthy.. csv-table:: Input values for RMM_EL3_FEATURES 560*b226357bSRaghu Krishnamurthy :header: "Name", "Register", "Field", "Type", "Description" 561*b226357bSRaghu Krishnamurthy :widths: 1 1 1 1 5 562*b226357bSRaghu Krishnamurthy 563*b226357bSRaghu Krishnamurthy fid,x0,[63:0],UInt64,Command FID 564*b226357bSRaghu Krishnamurthy feat_reg_idx,x1,[63:0],UInt64, "Feature register index. For v0.4, a value of 0 is the only 565*b226357bSRaghu Krishnamurthy acceptable value" 566*b226357bSRaghu Krishnamurthy 567*b226357bSRaghu Krishnamurthy 568*b226357bSRaghu KrishnamurthyOutput values 569*b226357bSRaghu Krishnamurthy------------- 570*b226357bSRaghu Krishnamurthy 571*b226357bSRaghu Krishnamurthy.. csv-table:: Output values for RMM_EL3_FEATURES 572*b226357bSRaghu Krishnamurthy :header: "Name", "Register", "Field", "Type", "Description" 573*b226357bSRaghu Krishnamurthy :widths: 1 1 1 1 5 574*b226357bSRaghu Krishnamurthy 575*b226357bSRaghu Krishnamurthy Result,x0,[63:0],Error Code,Command return status 576*b226357bSRaghu Krishnamurthy feat_reg,x1,[63:0],Value,Value of the register as defined above 577*b226357bSRaghu Krishnamurthy 578*b226357bSRaghu KrishnamurthyFailure conditions 579*b226357bSRaghu Krishnamurthy------------------ 580*b226357bSRaghu Krishnamurthy 581*b226357bSRaghu KrishnamurthyThe table below shows all the possible error codes returned in ``Result`` upon 582*b226357bSRaghu Krishnamurthya failure. The errors are ordered by condition check. 583*b226357bSRaghu Krishnamurthy 584*b226357bSRaghu Krishnamurthy.. csv-table:: Failure conditions for RMM_EL3_FEATURES 585*b226357bSRaghu Krishnamurthy :header: "ID", "Condition" 586*b226357bSRaghu Krishnamurthy :widths: 1 5 587*b226357bSRaghu Krishnamurthy 588*b226357bSRaghu Krishnamurthy ``E_RMM_INVAL``,``feat_reg_idx`` is out of valid range 589*b226357bSRaghu Krishnamurthy ``E_RMM_UNK``,"if the SMC is not present, if interface version is <0.4" 590*b226357bSRaghu Krishnamurthy ``E_RMM_OK``,No errors detected 591*b226357bSRaghu Krishnamurthy 592*b226357bSRaghu KrishnamurthyRMM_EL3_TOKEN_SIGN command 593*b226357bSRaghu Krishnamurthy========================== 594*b226357bSRaghu Krishnamurthy 595*b226357bSRaghu KrishnamurthyThis command is an optional command that can be discovered using the RMM_EL3_FEATURES command. 596*b226357bSRaghu KrishnamurthyThis command is used to send requests related to realm attestation token signing requests to EL3. 597*b226357bSRaghu KrishnamurthyThe command supports 3 opcodes: 598*b226357bSRaghu Krishnamurthy 599*b226357bSRaghu Krishnamurthy - RMM_EL3_TOKEN_SIGN_PUSH_REQ_OP 600*b226357bSRaghu Krishnamurthy - RMM_EL3_TOKEN_SIGN_PULL_RESP_OP 601*b226357bSRaghu Krishnamurthy - RMM_EL3_TOKEN_SIGN_GET_RAK_PUB_OP 602*b226357bSRaghu Krishnamurthy 603*b226357bSRaghu KrishnamurthyThe above opcodes can be used to send realm attestation token signing requests to EL3 and get their 604*b226357bSRaghu Krishnamurthyresponse, so that the realm attestation token can be constructed. 605*b226357bSRaghu Krishnamurthy 606*b226357bSRaghu KrishnamurthyThis command is useful when the RMM may not have access to the private portion of the realm 607*b226357bSRaghu Krishnamurthyattestation key and needs signing services from EL3 or CCA HES, or other platform specific 608*b226357bSRaghu Krishnamurthymechanisms to perform signing. 609*b226357bSRaghu Krishnamurthy 610*b226357bSRaghu KrishnamurthyThe RMM-EL3 interface for this command is modeled as two separate queues, one for signing requests 611*b226357bSRaghu Krishnamurthyand one for retrieving the signed responses. It is possible that the queue in EL3 is full or EL3 is busy and 612*b226357bSRaghu Krishnamurthyunable to service the RMM requests, in which case the RMM is expected to retry the push operation 613*b226357bSRaghu Krishnamurthyfor requests and pop operation for responses. 614*b226357bSRaghu Krishnamurthy 615*b226357bSRaghu KrishnamurthyFID 616*b226357bSRaghu Krishnamurthy--- 617*b226357bSRaghu Krishnamurthy 618*b226357bSRaghu Krishnamurthy``0xC40001B5`` 619*b226357bSRaghu Krishnamurthy 620*b226357bSRaghu KrishnamurthyInput values 621*b226357bSRaghu Krishnamurthy------------ 622*b226357bSRaghu Krishnamurthy 623*b226357bSRaghu Krishnamurthy.. csv-table:: Input values for RMM_EL3_TOKEN_SIGN 624*b226357bSRaghu Krishnamurthy :header: "Name", "Register", "Field", "Type", "Description" 625*b226357bSRaghu Krishnamurthy :widths: 1 1 1 1 5 626*b226357bSRaghu Krishnamurthy 627*b226357bSRaghu Krishnamurthy fid,x0,[63:0],UInt64,Command FID 628*b226357bSRaghu Krishnamurthy opcode,x1,[63:0],UInt64," 629*b226357bSRaghu Krishnamurthy Opcode that is one of: 630*b226357bSRaghu Krishnamurthy 631*b226357bSRaghu Krishnamurthy - RMM_EL3_TOKEN_SIGN_PUSH_REQ_OP: 0x1 - 632*b226357bSRaghu Krishnamurthy Opcode to push a token signing request to EL3 using struct el3_token_sign_request as described above 633*b226357bSRaghu Krishnamurthy - RMM_EL3_TOKEN_SIGN_PULL_RESP_OP: 0x2 - 634*b226357bSRaghu Krishnamurthy Opcode to pull a token signing response from EL3 using struct el3_token_sign_response as described above 635*b226357bSRaghu Krishnamurthy - RMM_EL3_TOKEN_SIGN_GET_RAK_PUB_OP: 0x3 - 636*b226357bSRaghu Krishnamurthy Opcode to get the realm attestation public key 637*b226357bSRaghu Krishnamurthy 638*b226357bSRaghu Krishnamurthy " 639*b226357bSRaghu Krishnamurthy buf_pa,x2,[63:0],Address,"PA where the request structure is stored for the opcode RMM_EL3_TOKEN_SIGN_PUSH_REQ_OP, the response structure needs to be populated for the opcode RMM_EL3_TOKEN_SIGN_PULL_RESP_OP, or where the public key must be populated for the opcode RMM_EL3_TOKEN_SIGN_GET_RAK_PUB_OP. The PA must belong to the RMM-EL3 shared buffer" 640*b226357bSRaghu Krishnamurthy buf_size,x3,[63:0],Size,Size in bytes of the input buffer in ``buf_pa``. ``buf_pa + buf_size`` must lie within the shared buffer 641*b226357bSRaghu Krishnamurthy ecc_curve,x4,[63:0],Enum,Type of the elliptic curve to which the requested attestation key belongs to. See :ref:`ecc_curves`. This parameter is valid on for the opcode RMM_EL3_TOKEN_SIGN_GET_RAK_PUB_OP 642*b226357bSRaghu Krishnamurthy 643*b226357bSRaghu KrishnamurthyOutput values 644*b226357bSRaghu Krishnamurthy------------- 645*b226357bSRaghu Krishnamurthy 646*b226357bSRaghu Krishnamurthy.. csv-table:: Output values for RMM_EL3_TOKEN_SIGN 647*b226357bSRaghu Krishnamurthy :header: "Name", "Register", "Field", "Type", "Description" 648*b226357bSRaghu Krishnamurthy :widths: 1 1 1 1 5 649*b226357bSRaghu Krishnamurthy 650*b226357bSRaghu Krishnamurthy Result,x0,[63:0],Error Code,Command return status. Valid for all opcodes listed in input values 651*b226357bSRaghu Krishnamurthy retval1,x1,[63:0],Value, "If opcode is RMM_EL3_TOKEN_SIGN_GET_RAK_PUB_OP, then returns length of 652*b226357bSRaghu Krishnamurthy public key returned. Otherwise, reserved" 653*b226357bSRaghu Krishnamurthy 654*b226357bSRaghu Krishnamurthy 655*b226357bSRaghu KrishnamurthyFailure conditions 656*b226357bSRaghu Krishnamurthy------------------ 657*b226357bSRaghu Krishnamurthy 658*b226357bSRaghu KrishnamurthyThe table below shows all the possible error codes returned in ``Result`` upon 659*b226357bSRaghu Krishnamurthya failure. The errors are ordered by condition check. 660*b226357bSRaghu Krishnamurthy 661*b226357bSRaghu Krishnamurthy.. csv-table:: Failure conditions for RMM_EL3_TOKEN_SIGN 662*b226357bSRaghu Krishnamurthy :header: "ID", "Condition" 663*b226357bSRaghu Krishnamurthy :widths: 1 5 664*b226357bSRaghu Krishnamurthy 665*b226357bSRaghu Krishnamurthy ``E_RMM_INVAL``,"if opcode is invalid or buffer address and length passed to the EL3 are not in valid range 666*b226357bSRaghu Krishnamurthy corresponding to the RMM-EL3 shared buffer, or if the curve used for opcode 667*b226357bSRaghu Krishnamurthy RMM_EL3_TOKEN_SIGN_GET_RAK_PUB_OP is not the ECC P384 curve" 668*b226357bSRaghu Krishnamurthy ``E_RMM_UNK``,"if the SMC is not present, if interface version is <0.4" 669*b226357bSRaghu Krishnamurthy ``E_RMM_AGAIN``,"For opcode RMM_EL3_TOKEN_SIGN_PUSH_REQ_OP, if the request is not queued since 670*b226357bSRaghu Krishnamurthy the EL3 queue is full, or if the response is not ready yet, for other opcodes" 671*b226357bSRaghu Krishnamurthy ``E_RMM_OK``,No errors detected 672*b226357bSRaghu Krishnamurthy 673*b226357bSRaghu Krishnamurthy 67469447290SJavier Almansa SobrinoRMM-EL3 world switch register save restore convention 67569447290SJavier Almansa Sobrino_____________________________________________________ 67669447290SJavier Almansa Sobrino 67769447290SJavier Almansa SobrinoAs part of NS world switch, EL3 is expected to maintain a register context 67869447290SJavier Almansa Sobrinospecific to each world and will save and restore the registers 67969447290SJavier Almansa Sobrinoappropriately. This section captures the contract between EL3 and RMM on the 68069447290SJavier Almansa Sobrinoregister set to be saved and restored. 68169447290SJavier Almansa Sobrino 68269447290SJavier Almansa SobrinoEL3 must maintain a separate register context for the following: 68369447290SJavier Almansa Sobrino 68469447290SJavier Almansa Sobrino #. General purpose registers (x0-x30) and ``sp_el0``, ``sp_el2`` stack pointers 68569447290SJavier 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. 68669447290SJavier Almansa Sobrino 6878e51cccaSAlexeiFedorovAs part of SMC forwarding between the NS world and Realm world, EL3 allows x0-x7 to be passed 6888e51cccaSAlexeiFedorovas arguments to Realm and x0-x4 to be used for return arguments back to Non Secure. 6898e51cccaSAlexeiFedorovAs per SMCCCv1.2, x4 must be preserved if not being used as return argument by the SMC function 6908e51cccaSAlexeiFedorovand it is the responsibility of RMM to preserve this or use this as a return argument. 6918e51cccaSAlexeiFedorovEL3 will always copy x0-x4 from Realm context to NS Context. 69269447290SJavier Almansa Sobrino 69313cc1aa7SShruti GuptaEL3 must save and restore the following as part of world switch: 69413cc1aa7SShruti Gupta #. EL2 system registers with the exception of ``zcr_el2`` register. 69513cc1aa7SShruti Gupta #. PAuth key registers (APIA, APIB, APDA, APDB, APGA). 69613cc1aa7SShruti Gupta 69769447290SJavier Almansa SobrinoEL3 will not save some registers as mentioned in the below list. It is the 69869447290SJavier Almansa Sobrinoresponsibility of RMM to ensure that these are appropriately saved if the 69969447290SJavier Almansa SobrinoRealm World makes use of them: 70069447290SJavier Almansa Sobrino 70169447290SJavier Almansa Sobrino #. FP/SIMD registers 70269447290SJavier Almansa Sobrino #. SVE registers 70369447290SJavier Almansa Sobrino #. SME registers 70413cc1aa7SShruti Gupta #. EL1/0 registers with the exception of PAuth key registers as mentioned above. 70513cc1aa7SShruti Gupta #. zcr_el2 register. 70669447290SJavier Almansa Sobrino 70713cc1aa7SShruti GuptaIt is essential that EL3 honors this contract to maintain the Confidentiality and integrity 70813cc1aa7SShruti Guptaof the Realm world. 7098e51cccaSAlexeiFedorov 71069447290SJavier Almansa SobrinoSMCCC v1.3 allows NS world to specify whether SVE context is in use. In this 71169447290SJavier Almansa Sobrinocase, RMM could choose to not save the incoming SVE context but must ensure 71269447290SJavier Almansa Sobrinoto clear SVE registers if they have been used in Realm World. The same applies 71369447290SJavier Almansa Sobrinoto SME registers. 71469447290SJavier Almansa Sobrino 71569447290SJavier Almansa SobrinoTypes 71669447290SJavier Almansa Sobrino_____ 71769447290SJavier Almansa Sobrino 71869447290SJavier Almansa Sobrino.. _rmm_el3_manifest_struct: 71969447290SJavier Almansa Sobrino 720dc0ca64eSJavier Almansa SobrinoRMM-EL3 Boot Manifest structure 721dc0ca64eSJavier Almansa Sobrino~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72269447290SJavier Almansa Sobrino 72388f7c87bSHarry MoultonThe RMM-EL3 Boot Manifest v0.3 structure contains platform boot information passed 72488f7c87bSHarry Moultonfrom EL3 to RMM. The size of the Boot Manifest is 64 bytes. 72569447290SJavier Almansa Sobrino 72669447290SJavier Almansa SobrinoThe members of the RMM-EL3 Boot Manifest structure are shown in the following 72769447290SJavier Almansa Sobrinotable: 72869447290SJavier Almansa Sobrino 72988f7c87bSHarry Moulton+--------------+--------+----------------+----------------------------------------+ 7301db295cfSAlexeiFedorov| Name | Offset | Type | Description | 73188f7c87bSHarry Moulton+==============+========+================+========================================+ 7321db295cfSAlexeiFedorov| version | 0 | uint32_t | Boot Manifest version | 73388f7c87bSHarry Moulton+--------------+--------+----------------+----------------------------------------+ 7341db295cfSAlexeiFedorov| padding | 4 | uint32_t | Reserved, set to 0 | 73588f7c87bSHarry Moulton+--------------+--------+----------------+----------------------------------------+ 7361db295cfSAlexeiFedorov| plat_data | 8 | uintptr_t | Pointer to Platform Data section | 73788f7c87bSHarry Moulton+--------------+--------+----------------+----------------------------------------+ 7381db295cfSAlexeiFedorov| plat_dram | 16 | ns_dram_info | NS DRAM Layout Info structure | 73988f7c87bSHarry Moulton+--------------+--------+----------------+----------------------------------------+ 74088f7c87bSHarry Moulton| plat_console | 40 | console_list | List of consoles available to RMM | 74188f7c87bSHarry Moulton+--------------+--------+----------------+----------------------------------------+ 74269447290SJavier Almansa Sobrino 7431db295cfSAlexeiFedorov.. _ns_dram_info_struct: 7441db295cfSAlexeiFedorov 7451db295cfSAlexeiFedorovNS DRAM Layout Info structure 7461db295cfSAlexeiFedorov~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 7471db295cfSAlexeiFedorov 7481db295cfSAlexeiFedorovNS DRAM Layout Info structure contains information about platform Non-secure 7491db295cfSAlexeiFedorovDRAM layout. The members of this structure are shown in the table below: 7501db295cfSAlexeiFedorov 7511db295cfSAlexeiFedorov+-----------+--------+----------------+----------------------------------------+ 7521db295cfSAlexeiFedorov| Name | Offset | Type | Description | 7531db295cfSAlexeiFedorov+===========+========+================+========================================+ 7541db295cfSAlexeiFedorov| num_banks | 0 | uint64_t | Number of NS DRAM banks | 7551db295cfSAlexeiFedorov+-----------+--------+----------------+----------------------------------------+ 7561db295cfSAlexeiFedorov| banks | 8 | ns_dram_bank * | Pointer to 'ns_dram_bank'[] array | 7571db295cfSAlexeiFedorov+-----------+--------+----------------+----------------------------------------+ 7581db295cfSAlexeiFedorov| checksum | 16 | uint64_t | Checksum | 7591db295cfSAlexeiFedorov+-----------+--------+----------------+----------------------------------------+ 7601db295cfSAlexeiFedorov 7611db295cfSAlexeiFedorovChecksum is calculated as two's complement sum of 'num_banks', 'banks' pointer 7621db295cfSAlexeiFedorovand DRAM banks data array pointed by it. 7631db295cfSAlexeiFedorov 7641db295cfSAlexeiFedorov.. _ns_dram_bank_struct: 7651db295cfSAlexeiFedorov 7661db295cfSAlexeiFedorovNS DRAM Bank structure 7671db295cfSAlexeiFedorov~~~~~~~~~~~~~~~~~~~~~~ 7681db295cfSAlexeiFedorov 7691db295cfSAlexeiFedorovNS DRAM Bank structure contains information about each Non-secure DRAM bank: 7701db295cfSAlexeiFedorov 7711db295cfSAlexeiFedorov+-----------+--------+----------------+----------------------------------------+ 7721db295cfSAlexeiFedorov| Name | Offset | Type | Description | 7731db295cfSAlexeiFedorov+===========+========+================+========================================+ 7741db295cfSAlexeiFedorov| base | 0 | uintptr_t | Base address | 7751db295cfSAlexeiFedorov+-----------+--------+----------------+----------------------------------------+ 7761db295cfSAlexeiFedorov| size | 8 | uint64_t | Size of bank in bytes | 7771db295cfSAlexeiFedorov+-----------+--------+----------------+----------------------------------------+ 7781db295cfSAlexeiFedorov 77988f7c87bSHarry Moulton.. _console_list_struct: 7801db295cfSAlexeiFedorov 78188f7c87bSHarry MoultonConsole List structure 78288f7c87bSHarry Moulton~~~~~~~~~~~~~~~~~~~~~~ 78388f7c87bSHarry Moulton 78488f7c87bSHarry MoultonConsole List structure contains information about the available consoles for RMM. 78588f7c87bSHarry MoultonThe members of this structure are shown in the table below: 78688f7c87bSHarry Moulton 78788f7c87bSHarry Moulton+--------------+--------+----------------+----------------------------------------+ 78888f7c87bSHarry Moulton| Name | Offset | Type | Description | 78988f7c87bSHarry Moulton+==============+========+================+========================================+ 79088f7c87bSHarry Moulton| num_consoles | 0 | uint64_t | Number of consoles | 79188f7c87bSHarry Moulton+--------------+--------+----------------+----------------------------------------+ 79288f7c87bSHarry Moulton| consoles | 8 | console_info * | Pointer to 'console_info'[] array | 79388f7c87bSHarry Moulton+--------------+--------+----------------+----------------------------------------+ 79488f7c87bSHarry Moulton| checksum | 16 | uint64_t | Checksum | 79588f7c87bSHarry Moulton+--------------+--------+----------------+----------------------------------------+ 79688f7c87bSHarry Moulton 79788f7c87bSHarry MoultonChecksum is calculated as two's complement sum of 'num_consoles', 'consoles' 79888f7c87bSHarry Moultonpointer and the consoles array pointed by it. 79988f7c87bSHarry Moulton 80088f7c87bSHarry Moulton.. _console_info_struct: 80188f7c87bSHarry Moulton 80288f7c87bSHarry MoultonConsole Info structure 80388f7c87bSHarry Moulton~~~~~~~~~~~~~~~~~~~~~~ 80488f7c87bSHarry Moulton 80588f7c87bSHarry MoultonConsole Info structure contains information about each Console available to RMM. 80688f7c87bSHarry Moulton 80788f7c87bSHarry Moulton+-----------+--------+---------------+----------------------------------------+ 80888f7c87bSHarry Moulton| Name | Offset | Type | Description | 80988f7c87bSHarry Moulton+===========+========+===============+========================================+ 81088f7c87bSHarry Moulton| base | 0 | uintptr_t | Console Base address | 81188f7c87bSHarry Moulton+-----------+--------+---------------+----------------------------------------+ 81288f7c87bSHarry Moulton| map_pages | 8 | uint64_t | Num of pages to map for console MMIO | 81388f7c87bSHarry Moulton+-----------+--------+---------------+----------------------------------------+ 81488f7c87bSHarry Moulton| name | 16 | char[] | Name of console | 81588f7c87bSHarry Moulton+-----------+--------+---------------+----------------------------------------+ 81688f7c87bSHarry Moulton| clk_in_hz | 24 | uint64_t | UART clock (in hz) for console | 81788f7c87bSHarry Moulton+-----------+--------+---------------+----------------------------------------+ 81888f7c87bSHarry Moulton| baud_rate | 32 | uint64_t | Baud rate | 81988f7c87bSHarry Moulton+-----------+--------+---------------+----------------------------------------+ 82088f7c87bSHarry Moulton| flags | 40 | uint64_t | Additional flags (RES0) | 82188f7c87bSHarry Moulton+-----------+--------+---------------+----------------------------------------+ 8221db295cfSAlexeiFedorov 823*b226357bSRaghu Krishnamurthy.. _el3_token_sign_request_struct: 824*b226357bSRaghu Krishnamurthy 825*b226357bSRaghu KrishnamurthyEL3 Token Sign Request structure 826*b226357bSRaghu Krishnamurthy~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 827*b226357bSRaghu Krishnamurthy 828*b226357bSRaghu KrishnamurthyThis structure represents a realm attestation toekn signing request. 829*b226357bSRaghu Krishnamurthy 830*b226357bSRaghu Krishnamurthy+-------------+--------+---------------+-----------------------------------------+ 831*b226357bSRaghu Krishnamurthy| Name | Offset | Type | Description | 832*b226357bSRaghu Krishnamurthy+=============+========+===============+=========================================+ 833*b226357bSRaghu Krishnamurthy| sig_alg_id | 0 | uint32_t | Algorithm idenfier for the sign request.| 834*b226357bSRaghu Krishnamurthy| | | | - 0x0: ECC SECP384R1 (ECDSA) | 835*b226357bSRaghu Krishnamurthy| | | | - Other values reserved | 836*b226357bSRaghu Krishnamurthy+-------------+--------+---------------+-----------------------------------------+ 837*b226357bSRaghu Krishnamurthy| rec_granule | 8 | uint64_t | Identifier used by RMM to associate | 838*b226357bSRaghu Krishnamurthy| | | | a signing request to a realm. Must not | 839*b226357bSRaghu Krishnamurthy| | | | be interpreted or modified. | 840*b226357bSRaghu Krishnamurthy+-------------+--------+---------------+-----------------------------------------+ 841*b226357bSRaghu Krishnamurthy| req_ticket | 16 | uint64_t | Value used by RMM to associate request | 842*b226357bSRaghu Krishnamurthy| | | | and responses. Must not be interpreted | 843*b226357bSRaghu Krishnamurthy| | | | or modified. | 844*b226357bSRaghu Krishnamurthy+-------------+--------+---------------+-----------------------------------------+ 845*b226357bSRaghu Krishnamurthy| hash_alg_id | 24 | uint32_t | Hash algorithm for data in `hash_buf` | 846*b226357bSRaghu Krishnamurthy| | | | - 0x1: SHA2-384 | 847*b226357bSRaghu Krishnamurthy| | | | - All other values reserved. | 848*b226357bSRaghu Krishnamurthy+-------------+--------+---------------+-----------------------------------------+ 849*b226357bSRaghu Krishnamurthy| hash_buf | 32 | uint8_t[] | TBS (to-be-signed) Hash of length | 850*b226357bSRaghu Krishnamurthy| | | | defined by hash algorithm `hash_alg_id` | 851*b226357bSRaghu Krishnamurthy+-------------+--------+---------------+-----------------------------------------+ 852*b226357bSRaghu Krishnamurthy 853*b226357bSRaghu Krishnamurthy.. _el3_token_sign_response_struct: 854*b226357bSRaghu Krishnamurthy 855*b226357bSRaghu KrishnamurthyEL3 Token Sign Response structure 856*b226357bSRaghu Krishnamurthy~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 857*b226357bSRaghu Krishnamurthy 858*b226357bSRaghu KrishnamurthyThis structure represents a realm attestation token signing response. 859*b226357bSRaghu Krishnamurthy 860*b226357bSRaghu Krishnamurthy+---------------+--------+---------------+-----------------------------------------+ 861*b226357bSRaghu Krishnamurthy| Name | Offset | Type | Description | 862*b226357bSRaghu Krishnamurthy+===============+========+===============+=========================================+ 863*b226357bSRaghu Krishnamurthy| rec_granule | 0 | uint64_t | Identifier used by RMM to associate | 864*b226357bSRaghu Krishnamurthy| | | | a signing request to a realm. Must not | 865*b226357bSRaghu Krishnamurthy| | | | be interpreted or modified. | 866*b226357bSRaghu Krishnamurthy+---------------+--------+---------------+-----------------------------------------+ 867*b226357bSRaghu Krishnamurthy| req_ticket | 8 | uint64_t | Value used by RMM to associate request | 868*b226357bSRaghu Krishnamurthy| | | | and responses. Must not be interpreted | 869*b226357bSRaghu Krishnamurthy| | | | or modified. | 870*b226357bSRaghu Krishnamurthy+---------------+--------+---------------+-----------------------------------------+ 871*b226357bSRaghu Krishnamurthy| sig_len | 16 | uint16_t | Length of the `signature_buf` field | 872*b226357bSRaghu Krishnamurthy+---------------+--------+---------------+-----------------------------------------+ 873*b226357bSRaghu Krishnamurthy| signature_buf | 18 | uint8_t[] | Signature | 874*b226357bSRaghu Krishnamurthy+---------------+--------+---------------+-----------------------------------------+ 875