Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Arm Trusted Firmware
Commits
15e59585
Unverified
Commit
15e59585
authored
7 years ago
by
davidcunado-arm
Committed by
GitHub
7 years ago
Browse files
Options
Download
Plain Diff
Merge pull request #1256 from jeenu-arm/tsp-ehf
TSP changes for EHF
parents
e47a8323
fb750ee1
master
v2.5
v2.5-rc1
v2.5-rc0
v2.4
v2.4-rc2
v2.4-rc1
v2.4-rc0
v2.3
v2.3-rc2
v2.3-rc1
v2.3-rc0
v2.2
v2.2-rc2
v2.2-rc1
v2.2-rc0
v2.1
v2.1-rc1
v2.1-rc0
v2.0
v2.0-rc0
v1.6
v1.6-rc1
v1.6-rc0
v1.5
v1.5-rc3
v1.5-rc2
v1.5-rc1
v1.5-rc0
arm_cca_v0.2
arm_cca_v0.1
No related merge requests found
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
Makefile
+2
-0
Makefile
docs/interrupt-framework-design.rst
+21
-16
docs/interrupt-framework-design.rst
docs/user-guide.rst
+4
-1
docs/user-guide.rst
include/bl31/interrupt_mgmt.h
+11
-1
include/bl31/interrupt_mgmt.h
services/spd/tspd/tspd.mk
+7
-1
services/spd/tspd/tspd.mk
services/spd/tspd/tspd_main.c
+21
-2
services/spd/tspd/tspd_main.c
with
66 additions
and
21 deletions
+66
-21
Makefile
View file @
15e59585
...
...
@@ -482,6 +482,7 @@ $(eval $(call assert_boolean,CTX_INCLUDE_AARCH32_REGS))
$(eval $(call assert_boolean,CTX_INCLUDE_FPREGS))
$(eval $(call assert_boolean,DEBUG))
$(eval $(call assert_boolean,DISABLE_PEDANTIC))
$(eval $(call assert_boolean,EL3_EXCEPTION_HANDLING))
$(eval $(call assert_boolean,ENABLE_AMU))
$(eval $(call assert_boolean,ENABLE_ASSERTIONS))
$(eval $(call assert_boolean,ENABLE_PLAT_COMPAT))
...
...
@@ -525,6 +526,7 @@ $(eval $(call add_define,ARM_GIC_ARCH))
$(eval $(call add_define,COLD_BOOT_SINGLE_CPU))
$(eval $(call add_define,CTX_INCLUDE_AARCH32_REGS))
$(eval $(call add_define,CTX_INCLUDE_FPREGS))
$(eval $(call add_define,EL3_EXCEPTION_HANDLING))
$(eval $(call add_define,ENABLE_AMU))
$(eval $(call add_define,ENABLE_ASSERTIONS))
$(eval $(call add_define,ENABLE_PLAT_COMPAT))
...
...
This diff is collapsed.
Click to expand it.
docs/interrupt-framework-design.rst
View file @
15e59585
...
...
@@ -135,7 +135,7 @@ Non-secure interrupts
former
's state is correctly saved by the latter.
#. **CSS=1, TEL3=0**. Interrupt is routed to FEL when execution is in
non-secure state. This is a
n
valid routing model as a non-secure interrupt
non-secure state. This is a valid routing model as a non-secure interrupt
is handled by non-secure software.
#. **CSS=1, TEL3=1**. Interrupt is routed to EL3 when execution is in
...
...
@@ -151,6 +151,10 @@ EL3 interrupts
in Secure-EL1/Secure-EL0 is in control of how its execution is preempted
by EL3 interrupt and can handover the interrupt to EL3 for handling.
However, when ``EL3_EXCEPTION_HANDLING`` is ``1``, this routing model is
invalid as EL3 interrupts are unconditionally routed to EL3, and EL3
interrupts will always preempt Secure EL1/EL0 execution.
#. **CSS=0, TEL3=1**. Interrupt is routed to EL3 when execution is in
Secure-EL1/Secure-EL0. This is a valid routing model as secure software
in EL3 can handle the interrupt.
...
...
@@ -212,17 +216,14 @@ The framework makes the following assumptions to simplify its implementation.
#. Interrupt exceptions (``PSTATE.I`` and ``F`` bits) are masked during execution
in EL3.
#. .. rubric:: Interrupt management
:name: interrupt-management
The following sections describe how interrupts are managed by the interrupt
handling framework. This entails:
#. Interrupt management: the following sections describe how interrupts are
managed by the interrupt handling framework. This entails:
#. Providing an interface to allow registration of a handler and
specification
of the routing model for a type of interrupt.
#. Providing an interface to allow registration of a handler and
specification
of the routing model for a type of interrupt.
#. Implementing support to hand control of an interrupt type to its
registered
handler when the interrupt is generated.
#. Implementing support to hand control of an interrupt type to its
registered
handler when the interrupt is generated.
Both aspects of interrupt management involve various components in the secure
software stack spanning from EL3 to Secure-EL1. These components are described
...
...
@@ -415,6 +416,9 @@ runtime.
Test secure payload dispatcher behavior
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Note:** where this document discusses ``TSP_NS_INTR_ASYNC_PREEMPT`` as being
``1``, the same results also apply when ``EL3_EXCEPTION_HANDLING`` is ``1``.
The TSPD only handles Secure-EL1 interrupts and is provided with the following
routing model at build time.
...
...
@@ -678,14 +682,14 @@ the handler function for that type of interrupt. The SPD service is responsible
for the following:
#. Validating the interrupt. This involves ensuring that the interrupt was
generat
ing
according to the interrupt routing model specified by the SPD
generat
ed
according to the interrupt routing model specified by the SPD
service during registration. It should use the security state of the
exception level (passed in the ``flags`` parameter of the handler) where
the interrupt was taken from to determine this. If the interrupt is not
recognised then the handler should treat it as an irrecoverable error
condition.
A SPD service can register a handler for Secure-EL1 and/or Non-secure
A
n
SPD service can register a handler for Secure-EL1 and/or Non-secure
interrupts. A non-secure interrupt should never be routed to EL3 from
from non-secure state. Also if a routing model is chosen where Secure-EL1
interrupts are routed to S-EL1 when execution is in Secure state, then a
...
...
@@ -809,9 +813,10 @@ Test secure payload dispatcher non-secure interrupt handling
The TSP in Secure-EL1 can be preempted by a non-secure interrupt during
``yielding`` SMC processing or by a higher priority EL3 interrupt during
Secure-EL1 interrupt processing. Currently only non-secure interrupts can
cause preemption of TSP since there are no EL3 interrupts in the
system.
Secure-EL1 interrupt processing. When ``EL3_EXCEPTION_HANDLING`` is ``0``, only
non-secure interrupts can cause preemption of TSP since there are no EL3
interrupts in the system. With ``EL3_EXCEPTION_HANDLING=1`` however, any EL3
interrupt may preempt Secure execution.
It should be noted that while TSP is preempted, the TSPD only allows entry into
the TSP either for Secure-EL1 interrupt handling or for resuming the preempted
...
...
@@ -994,7 +999,7 @@ TSP by returning ``SMC_UNK`` error.
--------------
*Copyright (c) 2014-201
5
, ARM Limited and Contributors. All rights reserved.*
*Copyright (c) 2014-201
8
, ARM Limited and Contributors. All rights reserved.*
.. _Porting Guide: ./porting-guide.rst
.. _SMC calling convention: http://infocenter.arm.com/help/topic/com.arm.doc.den0028a/index.html
...
...
This diff is collapsed.
Click to expand it.
docs/user-guide.rst
View file @
15e59585
...
...
@@ -617,6 +617,9 @@ Common build options
interrupts
to
TSP
allowing
it
to
save
its
context
and
hand
over
synchronously
to
EL3
via
an
SMC
.
Note
:
when
``
EL3_EXCEPTION_HANDLING
``
is
``
1
``,
``
TSP_NS_INTR_ASYNC_PREEMPT
``
must
also
be
set
to
``
1
``.
-
``
USE_COHERENT_MEM
``:
This
flag
determines
whether
to
include
the
coherent
memory
region
in
the
BL
memory
map
or
not
(
see
"Use of Coherent memory in
Trusted Firmware"
section
in
`
Firmware
Design
`
_
).
It
can
take
the
value
1
...
...
@@ -1867,7 +1870,7 @@ wakeup interrupt from RTC.
--------------
*Copyright (c) 2013-201
7
, ARM Limited and Contributors. All rights reserved.*
*Copyright (c) 2013-201
8
, ARM Limited and Contributors. All rights reserved.*
.. _Linaro: `Linaro Release Notes`_
.. _Linaro Release: `Linaro Release Notes`_
...
...
This diff is collapsed.
Click to expand it.
include/bl31/interrupt_mgmt.h
View file @
15e59585
/*
* Copyright (c) 2014-201
7
, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2014-201
8
, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
...
...
@@ -80,9 +80,19 @@
((x) == INTR_NS_VALID_RM1 ? 0 :\
-EINVAL))
#if EL3_EXCEPTION_HANDLING
/*
* With EL3 exception handling, EL3 interrupts are always routed to EL3 from
* both Secure and Non-secure, and therefore INTR_EL3_VALID_RM1 is the only
* valid routing model.
*/
#define validate_el3_interrupt_rm(x) ((x) == INTR_EL3_VALID_RM1 ? 0 : \
-EINVAL)
#else
#define validate_el3_interrupt_rm(x) ((x) == INTR_EL3_VALID_RM0 ? 0 : \
((x) == INTR_EL3_VALID_RM1 ? 0 :\
-EINVAL))
#endif
/*******************************************************************************
* Macros to set the 'flags' parameter passed to an interrupt type handler. Only
...
...
This diff is collapsed.
Click to expand it.
services/spd/tspd/tspd.mk
View file @
15e59585
#
# Copyright (c) 2013-201
4
, ARM Limited and Contributors. All rights reserved.
# Copyright (c) 2013-201
8
, ARM Limited and Contributors. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
...
...
@@ -43,5 +43,11 @@ $(warning "TSPD_ROUTE_IRQ_TO_EL3 is deprecated. Please use the new build flag TS
TSP_NS_INTR_ASYNC_PREEMPT
:=
${TSPD_ROUTE_IRQ_TO_EL3}
endif
ifeq
($(EL3_EXCEPTION_HANDLING),1)
ifeq
($(TSP_NS_INTR_ASYNC_PREEMPT),0)
$(error
When
EL3_EXCEPTION_HANDLING
=
1, TSP_NS_INTR_ASYNC_PREEMPT must also be 1
)
endif
endif
$(eval
$(call
assert_boolean,TSP_NS_INTR_ASYNC_PREEMPT))
$(eval
$(call
add_define,TSP_NS_INTR_ASYNC_PREEMPT))
This diff is collapsed.
Click to expand it.
services/spd/tspd/tspd_main.c
View file @
15e59585
/*
* Copyright (c) 2013-201
7
, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2013-201
8
, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
...
...
@@ -20,6 +20,7 @@
#include <bl_common.h>
#include <context_mgmt.h>
#include <debug.h>
#include <ehf.h>
#include <errno.h>
#include <platform.h>
#include <runtime_svc.h>
...
...
@@ -540,6 +541,18 @@ uint64_t tspd_smc_handler(uint32_t smc_fid,
*/
enable_intr_rm_local
(
INTR_TYPE_NS
,
SECURE
);
#endif
#if EL3_EXCEPTION_HANDLING
/*
* With EL3 exception handling, while an SMC is
* being processed, Non-secure interrupts can't
* preempt Secure execution. However, for
* yielding SMCs, we want preemption to happen;
* so explicitly allow NS preemption in this
* case.
*/
ehf_allow_ns_preemption
();
#endif
}
cm_el1_sysregs_context_restore
(
SECURE
);
...
...
@@ -646,7 +659,13 @@ uint64_t tspd_smc_handler(uint32_t smc_fid,
enable_intr_rm_local
(
INTR_TYPE_NS
,
SECURE
);
#endif
#if EL3_EXCEPTION_HANDLING
/*
* Allow the resumed yielding SMC processing to be preempted by
* Non-secure interrupts.
*/
ehf_allow_ns_preemption
();
#endif
/* We just need to return to the preempted point in
* TSP and the execution will resume as normal.
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment
Menu
Projects
Groups
Snippets
Help