Commit e34cc0ce authored by Madhukar Pappireddy's avatar Madhukar Pappireddy
Browse files

Changes to support updated register usage in SMCCC v1.2

From AArch64 state, arguments are passed in registers W0-W7(X0-X7)
and results are returned in W0-W7(X0-X7) for SMC32(SMC64) calls.
From AArch32 state, arguments are passed in registers R0-R7 and
results are returned in registers R0-R7 for SMC32 calls.

Most of the functions and macros already existed to support using
upto 8 registers for passing/returning parameters/results. Added
few helper macros for SMC calls from AArch32 state.

Link to the specification:
https://developer.arm.com/docs/den0028/c



Change-Id: I87976b42454dc3fc45c8343e9640aa78210e9741
Signed-off-by: default avatarMadhukar Pappireddy <madhukar.pappireddy@arm.com>
parent d537ee79
...@@ -978,8 +978,8 @@ manipulation; and with ``flags`` indicating the security state of the caller. Th ...@@ -978,8 +978,8 @@ manipulation; and with ``flags`` indicating the security state of the caller. Th
framework finally sets up the execution stack for the handler, and invokes the framework finally sets up the execution stack for the handler, and invokes the
services ``handle()`` function. services ``handle()`` function.
On return from the handler the result registers are populated in X0-X3 before On return from the handler the result registers are populated in X0-X7 as needed
restoring the stack and CPU state and returning from the original SMC. before restoring the stack and CPU state and returning from the original SMC.
Exception Handling Framework Exception Handling Framework
---------------------------- ----------------------------
......
...@@ -244,17 +244,35 @@ The handler is responsible for: ...@@ -244,17 +244,35 @@ The handler is responsible for:
TF-A expects owning entities to follow this recommendation. TF-A expects owning entities to follow this recommendation.
#. Returning the result to the caller. The `SMCCC`_ allows for up to 256 bits #. Returning the result to the caller. Based on `SMCCC`_ spec, results are
of return value in SMC64 using X0-X3 and 128 bits in SMC32 using W0-W3. The returned in W0-W7(X0-X7) registers for SMC32(SMC64) calls from AArch64
framework provides a family of macros to set the multi-register return state. Results are returned in R0-R7 registers for SMC32 calls from AArch32
value and complete the handler: state. The framework provides a family of macros to set the multi-register
return value and complete the handler:
.. code:: c .. code:: c
AArch64 state:
SMC_RET1(handle, x0); SMC_RET1(handle, x0);
SMC_RET2(handle, x0, x1); SMC_RET2(handle, x0, x1);
SMC_RET3(handle, x0, x1, x2); SMC_RET3(handle, x0, x1, x2);
SMC_RET4(handle, x0, x1, x2, x3); SMC_RET4(handle, x0, x1, x2, x3);
SMC_RET5(handle, x0, x1, x2, x3, x4);
SMC_RET6(handle, x0, x1, x2, x3, x4, x5);
SMC_RET7(handle, x0, x1, x2, x3, x4, x5, x6);
SMC_RET8(handle, x0, x1, x2, x3, x4, x5, x6, x7);
AArch32 state:
SMC_RET1(handle, r0);
SMC_RET2(handle, r0, r1);
SMC_RET3(handle, r0, r1, r2);
SMC_RET4(handle, r0, r1, r2, r3);
SMC_RET5(handle, r0, r1, r2, r3, r4);
SMC_RET6(handle, r0, r1, r2, r3, r4, r5);
SMC_RET7(handle, r0, r1, r2, r3, r4, r5, r6);
SMC_RET8(handle, r0, r1, r2, r3, r4, r5, r6, r7);
The ``cookie`` parameter to the handler is reserved for future use and can be The ``cookie`` parameter to the handler is reserved for future use and can be
ignored. The ``handle`` is returned by the SMC handler - completion of the ignored. The ``handle`` is returned by the SMC handler - completion of the
......
/* /*
* Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved. * Copyright (c) 2016-2019, ARM Limited and Contributors. All rights reserved.
* *
* SPDX-License-Identifier: BSD-3-Clause * SPDX-License-Identifier: BSD-3-Clause
*/ */
...@@ -130,6 +130,22 @@ CASSERT(SMC_CTX_SIZE == sizeof(smc_ctx_t), assert_smc_ctx_size_mismatch); ...@@ -130,6 +130,22 @@ CASSERT(SMC_CTX_SIZE == sizeof(smc_ctx_t), assert_smc_ctx_size_mismatch);
((smc_ctx_t *)(_h))->r3 = (_r3); \ ((smc_ctx_t *)(_h))->r3 = (_r3); \
SMC_RET3(_h, (_r0), (_r1), (_r2)); \ SMC_RET3(_h, (_r0), (_r1), (_r2)); \
} }
#define SMC_RET5(_h, _r0, _r1, _r2, _r3, _r4) { \
((smc_ctx_t *)(_h))->r4 = (_r4); \
SMC_RET4(_h, (_r0), (_r1), (_r2), (_r3)); \
}
#define SMC_RET6(_h, _r0, _r1, _r2, _r3, _r4, _r5) { \
((smc_ctx_t *)(_h))->r5 = (_r5); \
SMC_RET5(_h, (_r0), (_r1), (_r2), (_r3), (_r4)); \
}
#define SMC_RET7(_h, _r0, _r1, _r2, _r3, _r4, _r5, _r6) { \
((smc_ctx_t *)(_h))->r6 = (_r6); \
SMC_RET6(_h, (_r0), (_r1), (_r2), (_r3), (_r4), (_r5)); \
}
#define SMC_RET8(_h, _r0, _r1, _r2, _r3, _r4, _r5, _r6, _r7) { \
((smc_ctx_t *)(_h))->r7 = (_r7); \
SMC_RET7(_h, (_r0), (_r1), (_r2), (_r3), (_r4), (_r5), (_r6)); \
}
/* /*
* Helper macro to retrieve the SMC parameters from smc_ctx_t. * Helper macro to retrieve the SMC parameters from smc_ctx_t.
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
SMCCC_VERSION_MINOR_SHIFT)) SMCCC_VERSION_MINOR_SHIFT))
#define SMCCC_MAJOR_VERSION U(1) #define SMCCC_MAJOR_VERSION U(1)
#define SMCCC_MINOR_VERSION U(1) #define SMCCC_MINOR_VERSION U(2)
/******************************************************************************* /*******************************************************************************
* Bit definitions inside the function id as per the SMC calling convention * Bit definitions inside the function id as per the SMC calling convention
...@@ -83,6 +83,12 @@ ...@@ -83,6 +83,12 @@
#define SMC_UNK -1 #define SMC_UNK -1
#define SMC_PREEMPTED -2 /* Not defined by the SMCCC */ #define SMC_PREEMPTED -2 /* Not defined by the SMCCC */
/* Return codes for Arm Architecture Service SMC calls */
#define SMC_ARCH_CALL_SUCCESS 0
#define SMC_ARCH_CALL_NOT_SUPPORTED -1
#define SMC_ARCH_CALL_NOT_REQUIRED -2
#define SMC_ARCH_CALL_INVAL_PARAM -3
/* Various flags passed to SMC handlers */ /* Various flags passed to SMC handlers */
#define SMC_FROM_SECURE (U(0) << 0) #define SMC_FROM_SECURE (U(0) << 0)
#define SMC_FROM_NON_SECURE (U(1) << 0) #define SMC_FROM_NON_SECURE (U(1) << 0)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment