AArch32: Rework SMC context save and restore mechanism
authorSoby Mathew <soby.mathew@arm.com>
Thu, 30 Mar 2017 13:42:54 +0000 (14:42 +0100)
committerdp-arm <dimitris.papastamos@arm.com>
Fri, 12 May 2017 10:54:12 +0000 (11:54 +0100)
commitb6285d64c12ae653c39ecdc3a4c47369aca9d7b0
tree372287d79aea7f149b6c4e1b31103a66c547b903
parentd801fbb0fc1834f7e7f6840d9a302beee5021f75
AArch32: Rework SMC context save and restore mechanism

The current SMC context data structure `smc_ctx_t` and related helpers are
optimized for case when SMC call does not result in world switch. This was
the case for SP_MIN and BL1 cold boot flow. But the firmware update usecase
requires world switch as a result of SMC and the current SMC context helpers
were not helping very much in this regard. Therefore this patch does the
following changes to improve this:

1. Add monitor stack pointer, `spmon` to `smc_ctx_t`

The C Runtime stack pointer in monitor mode, `sp_mon` is added to the
SMC context, and the `smc_ctx_t` pointer is cached in `sp_mon` prior
to exit from Monitor mode. This makes is easier to retrieve the
context when the next SMC call happens. As a result of this change,
the SMC context helpers no longer depend on the stack to save and
restore the register.

This aligns it with the context save and restore mechanism in AArch64.

2. Add SCR in `smc_ctx_t`

Adding the SCR register to `smc_ctx_t` makes it easier to manage this
register state when switching between non secure and secure world as a
result of an SMC call.

Change-Id: I5e12a7056107c1701b457b8f7363fdbf892230bf
Signed-off-by: Soby Mathew <soby.mathew@arm.com>
Signed-off-by: dp-arm <dimitris.papastamos@arm.com>
bl1/aarch32/bl1_context_mgmt.c
bl1/aarch32/bl1_entrypoint.S
bl32/sp_min/aarch32/entrypoint.S
bl32/sp_min/sp_min_main.c
include/lib/aarch32/smcc_helpers.h
include/lib/aarch32/smcc_macros.S