]> git.baikalelectronics.ru Git - arm-tf.git/commitdiff
feat: pass SMCCCv1.3 SVE hint bit to dispatchers
authorOlivier Deprez <olivier.deprez@arm.com>
Tue, 11 Oct 2022 13:38:27 +0000 (15:38 +0200)
committerOlivier Deprez <olivier.deprez@arm.com>
Tue, 8 Nov 2022 08:28:36 +0000 (09:28 +0100)
SMCCCv1.3 introduces the SVE hint bit added to the SMC FID (bit 16)
denoting that the world issuing an SMC doesn't expect the callee to
preserve the SVE state (FFR, predicates, Zn vector bits greater than
127). Update the generic SMC handler to copy the SVE hint bit state
to SMC flags and mask out the bit by default for the services called
by the standard dispatcher. It is permitted by the SMCCC standard to
ignore the bit as long as the SVE state is preserved. In any case a
callee must preserve the NEON state (FPCR/FPSR, Vn 128b vectors)
whichever the SVE hint bit state.

Signed-off-by: Olivier Deprez <olivier.deprez@arm.com>
Change-Id: I2b163ed83dc311b8f81f96b23c942829ae9fa1b5

bl31/aarch64/runtime_exceptions.S
docs/design/firmware-design.rst
include/lib/smccc.h

index bf5bd8d8d3cc2e9bf6dea6143307a29d75e523cc..0283553961a08f639cfe6de425c6808cd2ae8954 100644 (file)
@@ -512,7 +512,7 @@ smc_handler64:
 
        /*
         * Shift copied SCR_EL3.NSE bit by 5 to create space for
-        * SCR_EL3.NS bit. Bit 5 of the flag correspondes to
+        * SCR_EL3.NS bit. Bit 5 of the flag corresponds to
         * the SCR_EL3.NSE bit.
         */
        lsl     x7, x7, #5
@@ -521,6 +521,16 @@ smc_handler64:
        /* Copy SCR_EL3.NS bit to the flag to indicate caller's security */
        bfi     x7, x18, #0, #1
 
+       /*
+        * Per SMCCCv1.3 a caller can set the SVE hint bit in the SMC FID
+        * passed through x0. Copy the SVE hint bit to flags and mask the
+        * bit in smc_fid passed to the standard service dispatcher.
+        * A service/dispatcher can retrieve the SVE hint bit state from
+        * flags using the appropriate helper.
+        */
+       bfi     x7, x0, #FUNCID_SVE_HINT_SHIFT, #FUNCID_SVE_HINT_MASK
+       bic     x0, x0, #(FUNCID_SVE_HINT_MASK << FUNCID_SVE_HINT_SHIFT)
+
        mov     sp, x12
 
        /* Get the unique owning entity number */
index 71fdfcb238a2df97a5623e5a8aea5e5c1e1947d1..84bba18e6be62d8db5535a63dd8a6c5a809b5851 100644 (file)
@@ -990,9 +990,10 @@ The service's ``handle()`` callback is provided with five of the SMC parameters
 directly, the others are saved into memory for retrieval (if needed) by the
 handler. The handler is also provided with an opaque ``handle`` for use with the
 supporting library for parameter retrieval, setting return values and context
-manipulation; and with ``flags`` indicating the security state of the caller. The
-framework finally sets up the execution stack for the handler, and invokes the
-services ``handle()`` function.
+manipulation. The ``flags`` parameter indicates the security state of the caller
+and the state of the SVE hint bit per the SMCCCv1.3. The framework finally sets
+up the execution stack for the handler, and invokes the services ``handle()``
+function.
 
 On return from the handler the result registers are populated in X0-X7 as needed
 before restoring the stack and CPU state and returning from the original SMC.
index 9940ea90ccfa5ddec4a69f9b3314c62757901439..cce91afe25700f133645220de8034301503a94d5 100644 (file)
 #define FUNCID_OEN_MASK                        U(0x3f)
 #define FUNCID_OEN_WIDTH               U(6)
 
+#define FUNCID_SVE_HINT_SHIFT          U(16)
+#define FUNCID_SVE_HINT_MASK           U(1)
+#define FUNCID_SVE_HINT_WIDTH          U(1)
+
 #define FUNCID_NUM_SHIFT               U(0)
 #define FUNCID_NUM_MASK                        U(0xffff)
 #define FUNCID_NUM_WIDTH               U(16)
  *   0        0      SMC_FROM_SECURE
  *   0        1      SMC_FROM_NON_SECURE
  *   1        1      SMC_FROM_REALM
+ *
+ * Bit 16 of flags records the caller's SMC
+ * SVE hint bit according to SMCCCv1.3.
+ * It can be consumed by dispatchers using
+ * is_sve_hint_set macro.
+ *
  */
 
 #define SMC_FROM_SECURE                (U(0) << 0)
 #define is_caller_secure(_f)           (!is_caller_non_secure(_f))
 #endif /* ENABLE_RME */
 
+#define is_sve_hint_set(_f)            (((_f) & (FUNCID_SVE_HINT_MASK \
+                                               << FUNCID_SVE_HINT_SHIFT)) != U(0))
+
 /* The macro below is used to identify a Standard Service SMC call */
 #define is_std_svc_call(_fid)          (GET_SMC_OEN(_fid) == OEN_STD_START)