xref: /rk3399_ARM-atf/docs/design/interrupt-framework-design.rst (revision 6d95ccda41a15d8662bf27961ea4e7c86c5738ab)
1Trusted Firmware-A interrupt management design guide
2====================================================
3
4
5
6
7.. contents::
8
9This framework is responsible for managing interrupts routed to EL3. It also
10allows EL3 software to configure the interrupt routing behavior. Its main
11objective is to implement the following two requirements.
12
13#. It should be possible to route interrupts meant to be handled by secure
14   software (Secure interrupts) to EL3, when execution is in non-secure state
15   (normal world). The framework should then take care of handing control of
16   the interrupt to either software in EL3 or Secure-EL1 depending upon the
17   software configuration and the GIC implementation. This requirement ensures
18   that secure interrupts are under the control of the secure software with
19   respect to their delivery and handling without the possibility of
20   intervention from non-secure software.
21
22#. It should be possible to route interrupts meant to be handled by
23   non-secure software (Non-secure interrupts) to the last executed exception
24   level in the normal world when the execution is in secure world at
25   exception levels lower than EL3. This could be done with or without the
26   knowledge of software executing in Secure-EL1/Secure-EL0. The choice of
27   approach should be governed by the secure software. This requirement
28   ensures that non-secure software is able to execute in tandem with the
29   secure software without overriding it.
30
31Concepts
32--------
33
34Interrupt types
35~~~~~~~~~~~~~~~
36
37The framework categorises an interrupt to be one of the following depending upon
38the exception level(s) it is handled in.
39
40#. Secure EL1 interrupt. This type of interrupt can be routed to EL3 or
41   Secure-EL1 depending upon the security state of the current execution
42   context. It is always handled in Secure-EL1.
43
44#. Non-secure interrupt. This type of interrupt can be routed to EL3,
45   Secure-EL1, Non-secure EL1 or EL2 depending upon the security state of the
46   current execution context. It is always handled in either Non-secure EL1
47   or EL2.
48
49#. EL3 interrupt. This type of interrupt can be routed to EL3 or Secure-EL1
50   depending upon the security state of the current execution context. It is
51   always handled in EL3.
52
53The following constants define the various interrupt types in the framework
54implementation.
55
56::
57
58    #define INTR_TYPE_S_EL1      0
59    #define INTR_TYPE_EL3        1
60    #define INTR_TYPE_NS         2
61
62Routing model
63~~~~~~~~~~~~~
64
65A type of interrupt can be either generated as an FIQ or an IRQ. The target
66exception level of an interrupt type is configured through the FIQ and IRQ bits
67in the Secure Configuration Register at EL3 (``SCR_EL3.FIQ`` and ``SCR_EL3.IRQ``
68bits). When ``SCR_EL3.FIQ``\ =1, FIQs are routed to EL3. Otherwise they are routed
69to the First Exception Level (FEL) capable of handling interrupts. When
70``SCR_EL3.IRQ``\ =1, IRQs are routed to EL3. Otherwise they are routed to the
71FEL. This register is configured independently by EL3 software for each security
72state prior to entry into a lower exception level in that security state.
73
74A routing model for a type of interrupt (generated as FIQ or IRQ) is defined as
75its target exception level for each security state. It is represented by a
76single bit for each security state. A value of ``0`` means that the interrupt
77should be routed to the FEL. A value of ``1`` means that the interrupt should be
78routed to EL3. A routing model is applicable only when execution is not in EL3.
79
80The default routing model for an interrupt type is to route it to the FEL in
81either security state.
82
83Valid routing models
84~~~~~~~~~~~~~~~~~~~~
85
86The framework considers certain routing models for each type of interrupt to be
87incorrect as they conflict with the requirements mentioned in Section 1. The
88following sub-sections describe all the possible routing models and specify
89which ones are valid or invalid. EL3 interrupts are currently supported only
90for GIC version 3.0 (Arm GICv3) and only the Secure-EL1 and Non-secure interrupt
91types are supported for GIC version 2.0 (Arm GICv2) (see `Assumptions in
92Interrupt Management Framework`_). The terminology used in the following
93sub-sections is explained below.
94
95#. **CSS**. Current Security State. ``0`` when secure and ``1`` when non-secure
96
97#. **TEL3**. Target Exception Level 3. ``0`` when targeted to the FEL. ``1`` when
98   targeted to EL3.
99
100Secure-EL1 interrupts
101^^^^^^^^^^^^^^^^^^^^^
102
103#. **CSS=0, TEL3=0**. Interrupt is routed to the FEL when execution is in
104   secure state. This is a valid routing model as secure software is in
105   control of handling secure interrupts.
106
107#. **CSS=0, TEL3=1**. Interrupt is routed to EL3 when execution is in secure
108   state. This is a valid routing model as secure software in EL3 can
109   handover the interrupt to Secure-EL1 for handling.
110
111#. **CSS=1, TEL3=0**. Interrupt is routed to the FEL when execution is in
112   non-secure state. This is an invalid routing model as a secure interrupt
113   is not visible to the secure software which violates the motivation behind
114   the Arm Security Extensions.
115
116#. **CSS=1, TEL3=1**. Interrupt is routed to EL3 when execution is in
117   non-secure state. This is a valid routing model as secure software in EL3
118   can handover the interrupt to Secure-EL1 for handling.
119
120Non-secure interrupts
121^^^^^^^^^^^^^^^^^^^^^
122
123#. **CSS=0, TEL3=0**. Interrupt is routed to the FEL when execution is in
124   secure state. This allows the secure software to trap non-secure
125   interrupts, perform its book-keeping and hand the interrupt to the
126   non-secure software through EL3. This is a valid routing model as secure
127   software is in control of how its execution is preempted by non-secure
128   interrupts.
129
130#. **CSS=0, TEL3=1**. Interrupt is routed to EL3 when execution is in secure
131   state. This is a valid routing model as secure software in EL3 can save
132   the state of software in Secure-EL1/Secure-EL0 before handing the
133   interrupt to non-secure software. This model requires additional
134   coordination between Secure-EL1 and EL3 software to ensure that the
135   former's state is correctly saved by the latter.
136
137#. **CSS=1, TEL3=0**. Interrupt is routed to FEL when execution is in
138   non-secure state. This is a valid routing model as a non-secure interrupt
139   is handled by non-secure software.
140
141#. **CSS=1, TEL3=1**. Interrupt is routed to EL3 when execution is in
142   non-secure state. This is an invalid routing model as there is no valid
143   reason to route the interrupt to EL3 software and then hand it back to
144   non-secure software for handling.
145
146EL3 interrupts
147^^^^^^^^^^^^^^
148
149#. **CSS=0, TEL3=0**. Interrupt is routed to the FEL when execution is in
150   Secure-EL1/Secure-EL0. This is a valid routing model as secure software
151   in Secure-EL1/Secure-EL0 is in control of how its execution is preempted
152   by EL3 interrupt and can handover the interrupt to EL3 for handling.
153
154   However, when ``EL3_EXCEPTION_HANDLING`` is ``1``, this routing model is
155   invalid as EL3 interrupts are unconditionally routed to EL3, and EL3
156   interrupts will always preempt Secure EL1/EL0 execution. See `exception
157   handling`__ documentation.
158
159   .. __: exception-handling.rst#interrupt-handling
160
161#. **CSS=0, TEL3=1**. Interrupt is routed to EL3 when execution is in
162   Secure-EL1/Secure-EL0. This is a valid routing model as secure software
163   in EL3 can handle the interrupt.
164
165#. **CSS=1, TEL3=0**. Interrupt is routed to the FEL when execution is in
166   non-secure state. This is an invalid routing model as a secure interrupt
167   is not visible to the secure software which violates the motivation behind
168   the Arm Security Extensions.
169
170#. **CSS=1, TEL3=1**. Interrupt is routed to EL3 when execution is in
171   non-secure state. This is a valid routing model as secure software in EL3
172   can handle the interrupt.
173
174Mapping of interrupt type to signal
175~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
176
177The framework is meant to work with any interrupt controller implemented by a
178platform. A interrupt controller could generate a type of interrupt as either an
179FIQ or IRQ signal to the CPU depending upon the current security state. The
180mapping between the type and signal is known only to the platform. The framework
181uses this information to determine whether the IRQ or the FIQ bit should be
182programmed in ``SCR_EL3`` while applying the routing model for a type of
183interrupt. The platform provides this information through the
184``plat_interrupt_type_to_line()`` API (described in the
185`Porting Guide`_). For example, on the FVP port when the platform uses an Arm GICv2
186interrupt controller, Secure-EL1 interrupts are signaled through the FIQ signal
187while Non-secure interrupts are signaled through the IRQ signal. This applies
188when execution is in either security state.
189
190Effect of mapping of several interrupt types to one signal
191^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
192
193It should be noted that if more than one interrupt type maps to a single
194interrupt signal, and if any one of the interrupt type sets **TEL3=1** for a
195particular security state, then interrupt signal will be routed to EL3 when in
196that security state. This means that all the other interrupt types using the
197same interrupt signal will be forced to the same routing model. This should be
198borne in mind when choosing the routing model for an interrupt type.
199
200For example, in Arm GICv3, when the execution context is Secure-EL1/
201Secure-EL0, both the EL3 and the non secure interrupt types map to the FIQ
202signal. So if either one of the interrupt type sets the routing model so
203that **TEL3=1** when **CSS=0**, the FIQ bit in ``SCR_EL3`` will be programmed to
204route the FIQ signal to EL3 when executing in Secure-EL1/Secure-EL0, thereby
205effectively routing the other interrupt type also to EL3.
206
207Assumptions in Interrupt Management Framework
208---------------------------------------------
209
210The framework makes the following assumptions to simplify its implementation.
211
212#. Although the framework has support for 2 types of secure interrupts (EL3
213   and Secure-EL1 interrupt), only interrupt controller architectures
214   like Arm GICv3 has architectural support for EL3 interrupts in the form of
215   Group 0 interrupts. In Arm GICv2, all secure interrupts are assumed to be
216   handled in Secure-EL1. They can be delivered to Secure-EL1 via EL3 but they
217   cannot be handled in EL3.
218
219#. Interrupt exceptions (``PSTATE.I`` and ``F`` bits) are masked during execution
220   in EL3.
221
222#. Interrupt management: the following sections describe how interrupts are
223   managed by the interrupt handling framework. This entails:
224
225   #. Providing an interface to allow registration of a handler and
226      specification of the routing model for a type of interrupt.
227
228   #. Implementing support to hand control of an interrupt type to its
229      registered handler when the interrupt is generated.
230
231Both aspects of interrupt management involve various components in the secure
232software stack spanning from EL3 to Secure-EL1. These components are described
233in the section `Software components`_. The framework stores information
234associated with each type of interrupt in the following data structure.
235
236.. code:: c
237
238    typedef struct intr_type_desc {
239            interrupt_type_handler_t handler;
240            uint32_t flags;
241            uint32_t scr_el3[2];
242    } intr_type_desc_t;
243
244The ``flags`` field stores the routing model for the interrupt type in
245bits[1:0]. Bit[0] stores the routing model when execution is in the secure
246state. Bit[1] stores the routing model when execution is in the non-secure
247state. As mentioned in Section `Routing model`_, a value of ``0`` implies that
248the interrupt should be targeted to the FEL. A value of ``1`` implies that it
249should be targeted to EL3. The remaining bits are reserved and SBZ. The helper
250macro ``set_interrupt_rm_flag()`` should be used to set the bits in the
251``flags`` parameter.
252
253The ``scr_el3[2]`` field also stores the routing model but as a mapping of the
254model in the ``flags`` field to the corresponding bit in the ``SCR_EL3`` for each
255security state.
256
257The framework also depends upon the platform port to configure the interrupt
258controller to distinguish between secure and non-secure interrupts. The platform
259is expected to be aware of the secure devices present in the system and their
260associated interrupt numbers. It should configure the interrupt controller to
261enable the secure interrupts, ensure that their priority is always higher than
262the non-secure interrupts and target them to the primary CPU. It should also
263export the interface described in the `Porting Guide`_ to enable
264handling of interrupts.
265
266In the remainder of this document, for the sake of simplicity a Arm GICv2 system
267is considered and it is assumed that the FIQ signal is used to generate Secure-EL1
268interrupts and the IRQ signal is used to generate non-secure interrupts in either
269security state. EL3 interrupts are not considered.
270
271Software components
272-------------------
273
274Roles and responsibilities for interrupt management are sub-divided between the
275following components of software running in EL3 and Secure-EL1. Each component is
276briefly described below.
277
278#. EL3 Runtime Firmware. This component is common to all ports of TF-A.
279
280#. Secure Payload Dispatcher (SPD) service. This service interfaces with the
281   Secure Payload (SP) software which runs in Secure-EL1/Secure-EL0 and is
282   responsible for switching execution between secure and non-secure states.
283   A switch is triggered by a Secure Monitor Call and it uses the APIs
284   exported by the Context management library to implement this functionality.
285   Switching execution between the two security states is a requirement for
286   interrupt management as well. This results in a significant dependency on
287   the SPD service. TF-A implements an example Test Secure Payload Dispatcher
288   (TSPD) service.
289
290   An SPD service plugs into the EL3 runtime firmware and could be common to
291   some ports of TF-A.
292
293#. Secure Payload (SP). On a production system, the Secure Payload corresponds
294   to a Secure OS which runs in Secure-EL1/Secure-EL0. It interfaces with the
295   SPD service to manage communication with non-secure software. TF-A
296   implements an example secure payload called Test Secure Payload (TSP)
297   which runs only in Secure-EL1.
298
299   A Secure payload implementation could be common to some ports of TF-A,
300   just like the SPD service.
301
302Interrupt registration
303----------------------
304
305This section describes in detail the role of each software component (see
306`Software components`_) during the registration of a handler for an interrupt
307type.
308
309EL3 runtime firmware
310~~~~~~~~~~~~~~~~~~~~
311
312This component declares the following prototype for a handler of an interrupt type.
313
314.. code:: c
315
316        typedef uint64_t (*interrupt_type_handler_t)(uint32_t id,
317                                                     uint32_t flags,
318                                                     void *handle,
319                                                     void *cookie);
320
321The ``id`` is parameter is reserved and could be used in the future for passing
322the interrupt id of the highest pending interrupt only if there is a foolproof
323way of determining the id. Currently it contains ``INTR_ID_UNAVAILABLE``.
324
325The ``flags`` parameter contains miscellaneous information as follows.
326
327#. Security state, bit[0]. This bit indicates the security state of the lower
328   exception level when the interrupt was generated. A value of ``1`` means
329   that it was in the non-secure state. A value of ``0`` indicates that it was
330   in the secure state. This bit can be used by the handler to ensure that
331   interrupt was generated and routed as per the routing model specified
332   during registration.
333
334#. Reserved, bits[31:1]. The remaining bits are reserved for future use.
335
336The ``handle`` parameter points to the ``cpu_context`` structure of the current CPU
337for the security state specified in the ``flags`` parameter.
338
339Once the handler routine completes, execution will return to either the secure
340or non-secure state. The handler routine must return a pointer to
341``cpu_context`` structure of the current CPU for the target security state. On
342AArch64, this return value is currently ignored by the caller as the
343appropriate ``cpu_context`` to be used is expected to be set by the handler
344via the context management library APIs.
345A portable interrupt handler implementation must set the target context both in
346the structure pointed to by the returned pointer and via the context management
347library APIs. The handler should treat all error conditions as critical errors
348and take appropriate action within its implementation e.g. use assertion
349failures.
350
351The runtime firmware provides the following API for registering a handler for a
352particular type of interrupt. A Secure Payload Dispatcher service should use
353this API to register a handler for Secure-EL1 and optionally for non-secure
354interrupts. This API also requires the caller to specify the routing model for
355the type of interrupt.
356
357.. code:: c
358
359    int32_t register_interrupt_type_handler(uint32_t type,
360                                            interrupt_type_handler handler,
361                                            uint64_t flags);
362
363The ``type`` parameter can be one of the three interrupt types listed above i.e.
364``INTR_TYPE_S_EL1``, ``INTR_TYPE_NS`` & ``INTR_TYPE_EL3``. The ``flags`` parameter
365is as described in Section 2.
366
367The function will return ``0`` upon a successful registration. It will return
368``-EALREADY`` in case a handler for the interrupt type has already been
369registered. If the ``type`` is unrecognised or the ``flags`` or the ``handler`` are
370invalid it will return ``-EINVAL``.
371
372Interrupt routing is governed by the configuration of the ``SCR_EL3.FIQ/IRQ`` bits
373prior to entry into a lower exception level in either security state. The
374context management library maintains a copy of the ``SCR_EL3`` system register for
375each security state in the ``cpu_context`` structure of each CPU. It exports the
376following APIs to let EL3 Runtime Firmware program and retrieve the routing
377model for each security state for the current CPU. The value of ``SCR_EL3`` stored
378in the ``cpu_context`` is used by the ``el3_exit()`` function to program the
379``SCR_EL3`` register prior to returning from the EL3 exception level.
380
381.. code:: c
382
383        uint32_t cm_get_scr_el3(uint32_t security_state);
384        void cm_write_scr_el3_bit(uint32_t security_state,
385                                  uint32_t bit_pos,
386                                  uint32_t value);
387
388``cm_get_scr_el3()`` returns the value of the ``SCR_EL3`` register for the specified
389security state of the current CPU. ``cm_write_scr_el3()`` writes a ``0`` or ``1`` to
390the bit specified by ``bit_pos``. ``register_interrupt_type_handler()`` invokes
391``set_routing_model()`` API which programs the ``SCR_EL3`` according to the routing
392model using the ``cm_get_scr_el3()`` and ``cm_write_scr_el3_bit()`` APIs.
393
394It is worth noting that in the current implementation of the framework, the EL3
395runtime firmware is responsible for programming the routing model. The SPD is
396responsible for ensuring that the routing model has been adhered to upon
397receiving an interrupt.
398
399.. _spd-int-registration:
400
401Secure payload dispatcher
402~~~~~~~~~~~~~~~~~~~~~~~~~
403
404A SPD service is responsible for determining and maintaining the interrupt
405routing model supported by itself and the Secure Payload. It is also responsible
406for ferrying interrupts between secure and non-secure software depending upon
407the routing model. It could determine the routing model at build time or at
408runtime. It must use this information to register a handler for each interrupt
409type using the ``register_interrupt_type_handler()`` API in EL3 runtime firmware.
410
411If the routing model is not known to the SPD service at build time, then it must
412be provided by the SP as the result of its initialisation. The SPD should
413program the routing model only after SP initialisation has completed e.g. in the
414SPD initialisation function pointed to by the ``bl32_init`` variable.
415
416The SPD should determine the mechanism to pass control to the Secure Payload
417after receiving an interrupt from the EL3 runtime firmware. This information
418could either be provided to the SPD service at build time or by the SP at
419runtime.
420
421Test secure payload dispatcher behavior
422~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
423
424**Note:** where this document discusses ``TSP_NS_INTR_ASYNC_PREEMPT`` as being
425``1``, the same results also apply when ``EL3_EXCEPTION_HANDLING`` is ``1``.
426
427The TSPD only handles Secure-EL1 interrupts and is provided with the following
428routing model at build time.
429
430-  Secure-EL1 interrupts are routed to EL3 when execution is in non-secure
431   state and are routed to the FEL when execution is in the secure state
432   i.e **CSS=0, TEL3=0** & **CSS=1, TEL3=1** for Secure-EL1 interrupts
433
434-  When the build flag ``TSP_NS_INTR_ASYNC_PREEMPT`` is zero, the default routing
435   model is used for non-secure interrupts. They are routed to the FEL in
436   either security state i.e **CSS=0, TEL3=0** & **CSS=1, TEL3=0** for
437   Non-secure interrupts.
438
439-  When the build flag ``TSP_NS_INTR_ASYNC_PREEMPT`` is defined to 1, then the
440   non secure interrupts are routed to EL3 when execution is in secure state
441   i.e **CSS=0, TEL3=1** for non-secure interrupts. This effectively preempts
442   Secure-EL1. The default routing model is used for non secure interrupts in
443   non-secure state. i.e **CSS=1, TEL3=0**.
444
445It performs the following actions in the ``tspd_init()`` function to fulfill the
446requirements mentioned earlier.
447
448#. It passes control to the Test Secure Payload to perform its
449   initialisation. The TSP provides the address of the vector table
450   ``tsp_vectors`` in the SP which also includes the handler for Secure-EL1
451   interrupts in the ``sel1_intr_entry`` field. The TSPD passes control to the TSP at
452   this address when it receives a Secure-EL1 interrupt.
453
454   The handover agreement between the TSP and the TSPD requires that the TSPD
455   masks all interrupts (``PSTATE.DAIF`` bits) when it calls
456   ``tsp_sel1_intr_entry()``. The TSP has to preserve the callee saved general
457   purpose, SP_EL1/Secure-EL0, LR, VFP and system registers. It can use
458   ``x0-x18`` to enable its C runtime.
459
460#. The TSPD implements a handler function for Secure-EL1 interrupts. This
461   function is registered with the EL3 runtime firmware using the
462   ``register_interrupt_type_handler()`` API as follows
463
464   .. code:: c
465
466       /* Forward declaration */
467       interrupt_type_handler tspd_secure_el1_interrupt_handler;
468       int32_t rc, flags = 0;
469       set_interrupt_rm_flag(flags, NON_SECURE);
470       rc = register_interrupt_type_handler(INTR_TYPE_S_EL1,
471                                        tspd_secure_el1_interrupt_handler,
472                                        flags);
473       if (rc)
474           panic();
475
476#. When the build flag ``TSP_NS_INTR_ASYNC_PREEMPT`` is defined to 1, the TSPD
477   implements a handler function for non-secure interrupts. This function is
478   registered with the EL3 runtime firmware using the
479   ``register_interrupt_type_handler()`` API as follows
480
481   .. code:: c
482
483       /* Forward declaration */
484       interrupt_type_handler tspd_ns_interrupt_handler;
485       int32_t rc, flags = 0;
486       set_interrupt_rm_flag(flags, SECURE);
487       rc = register_interrupt_type_handler(INTR_TYPE_NS,
488                                       tspd_ns_interrupt_handler,
489                                       flags);
490       if (rc)
491           panic();
492
493.. _sp-int-registration:
494
495Secure payload
496~~~~~~~~~~~~~~
497
498A Secure Payload must implement an interrupt handling framework at Secure-EL1
499(Secure-EL1 IHF) to support its chosen interrupt routing model. Secure payload
500execution will alternate between the below cases.
501
502#. In the code where IRQ, FIQ or both interrupts are enabled, if an interrupt
503   type is targeted to the FEL, then it will be routed to the Secure-EL1
504   exception vector table. This is defined as the **asynchronous mode** of
505   handling interrupts. This mode applies to both Secure-EL1 and non-secure
506   interrupts.
507
508#. In the code where both interrupts are disabled, if an interrupt type is
509   targeted to the FEL, then execution will eventually migrate to the
510   non-secure state. Any non-secure interrupts will be handled as described
511   in the routing model where **CSS=1 and TEL3=0**. Secure-EL1 interrupts
512   will be routed to EL3 (as per the routing model where **CSS=1 and
513   TEL3=1**) where the SPD service will hand them to the SP. This is defined
514   as the **synchronous mode** of handling interrupts.
515
516The interrupt handling framework implemented by the SP should support one or
517both these interrupt handling models depending upon the chosen routing model.
518
519The following list briefly describes how the choice of a valid routing model
520(see `Valid routing models`_) effects the implementation of the Secure-EL1
521IHF. If the choice of the interrupt routing model is not known to the SPD
522service at compile time, then the SP should pass this information to the SPD
523service at runtime during its initialisation phase.
524
525As mentioned earlier, an Arm GICv2 system is considered and it is assumed that
526the FIQ signal is used to generate Secure-EL1 interrupts and the IRQ signal
527is used to generate non-secure interrupts in either security state.
528
529Secure payload IHF design w.r.t secure-EL1 interrupts
530^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
531
532#. **CSS=0, TEL3=0**. If ``PSTATE.F=0``, Secure-EL1 interrupts will be
533   triggered at one of the Secure-EL1 FIQ exception vectors. The Secure-EL1
534   IHF should implement support for handling FIQ interrupts asynchronously.
535
536   If ``PSTATE.F=1`` then Secure-EL1 interrupts will be handled as per the
537   synchronous interrupt handling model. The SP could implement this scenario
538   by exporting a separate entrypoint for Secure-EL1 interrupts to the SPD
539   service during the registration phase. The SPD service would also need to
540   know the state of the system, general purpose and the ``PSTATE`` registers
541   in which it should arrange to return execution to the SP. The SP should
542   provide this information in an implementation defined way during the
543   registration phase if it is not known to the SPD service at build time.
544
545#. **CSS=1, TEL3=1**. Interrupts are routed to EL3 when execution is in
546   non-secure state. They should be handled through the synchronous interrupt
547   handling model as described in 1. above.
548
549#. **CSS=0, TEL3=1**. Secure-EL1 interrupts are routed to EL3 when execution
550   is in secure state. They will not be visible to the SP. The ``PSTATE.F`` bit
551   in Secure-EL1/Secure-EL0 will not mask FIQs. The EL3 runtime firmware will
552   call the handler registered by the SPD service for Secure-EL1 interrupts.
553   Secure-EL1 IHF should then handle all Secure-EL1 interrupt through the
554   synchronous interrupt handling model described in 1. above.
555
556Secure payload IHF design w.r.t non-secure interrupts
557^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
558
559#. **CSS=0, TEL3=0**. If ``PSTATE.I=0``, non-secure interrupts will be
560   triggered at one of the Secure-EL1 IRQ exception vectors . The Secure-EL1
561   IHF should co-ordinate with the SPD service to transfer execution to the
562   non-secure state where the interrupt should be handled e.g the SP could
563   allocate a function identifier to issue a SMC64 or SMC32 to the SPD
564   service which indicates that the SP execution has been preempted by a
565   non-secure interrupt. If this function identifier is not known to the SPD
566   service at compile time then the SP could provide it during the
567   registration phase.
568
569   If ``PSTATE.I=1`` then the non-secure interrupt will pend until execution
570   resumes in the non-secure state.
571
572#. **CSS=0, TEL3=1**. Non-secure interrupts are routed to EL3. They will not
573   be visible to the SP. The ``PSTATE.I`` bit in Secure-EL1/Secure-EL0 will
574   have not effect. The SPD service should register a non-secure interrupt
575   handler which should save the SP state correctly and resume execution in
576   the non-secure state where the interrupt will be handled. The Secure-EL1
577   IHF does not need to take any action.
578
579#. **CSS=1, TEL3=0**. Non-secure interrupts are handled in the FEL in
580   non-secure state (EL1/EL2) and are not visible to the SP. This routing
581   model does not affect the SP behavior.
582
583A Secure Payload must also ensure that all Secure-EL1 interrupts are correctly
584configured at the interrupt controller by the platform port of the EL3 runtime
585firmware. It should configure any additional Secure-EL1 interrupts which the EL3
586runtime firmware is not aware of through its platform port.
587
588Test secure payload behavior
589~~~~~~~~~~~~~~~~~~~~~~~~~~~~
590
591The routing model for Secure-EL1 and non-secure interrupts chosen by the TSP is
592described in Section `Secure Payload Dispatcher`__. It is known to the TSPD
593service at build time.
594
595.. __: #spd-int-registration
596
597The TSP implements an entrypoint (``tsp_sel1_intr_entry()``) for handling Secure-EL1
598interrupts taken in non-secure state and routed through the TSPD service
599(synchronous handling model). It passes the reference to this entrypoint via
600``tsp_vectors`` to the TSPD service.
601
602The TSP also replaces the default exception vector table referenced through the
603``early_exceptions`` variable, with a vector table capable of handling FIQ and IRQ
604exceptions taken at the same (Secure-EL1) exception level. This table is
605referenced through the ``tsp_exceptions`` variable and programmed into the
606VBAR_EL1. It caters for the asynchronous handling model.
607
608The TSP also programs the Secure Physical Timer in the Arm Generic Timer block
609to raise a periodic interrupt (every half a second) for the purpose of testing
610interrupt management across all the software components listed in `Software
611components`_.
612
613Interrupt handling
614------------------
615
616This section describes in detail the role of each software component (see
617Section `Software components`_) in handling an interrupt of a particular type.
618
619EL3 runtime firmware
620~~~~~~~~~~~~~~~~~~~~
621
622The EL3 runtime firmware populates the IRQ and FIQ exception vectors referenced
623by the ``runtime_exceptions`` variable as follows.
624
625#. IRQ and FIQ exceptions taken from the current exception level with
626   ``SP_EL0`` or ``SP_EL3`` are reported as irrecoverable error conditions. As
627   mentioned earlier, EL3 runtime firmware always executes with the
628   ``PSTATE.I`` and ``PSTATE.F`` bits set.
629
630#. The following text describes how the IRQ and FIQ exceptions taken from a
631   lower exception level using AArch64 or AArch32 are handled.
632
633When an interrupt is generated, the vector for each interrupt type is
634responsible for:
635
636#. Saving the entire general purpose register context (x0-x30) immediately
637   upon exception entry. The registers are saved in the per-cpu ``cpu_context``
638   data structure referenced by the ``SP_EL3``\ register.
639
640#. Saving the ``ELR_EL3``, ``SP_EL0`` and ``SPSR_EL3`` system registers in the
641   per-cpu ``cpu_context`` data structure referenced by the ``SP_EL3`` register.
642
643#. Switching to the C runtime stack by restoring the ``CTX_RUNTIME_SP`` value
644   from the per-cpu ``cpu_context`` data structure in ``SP_EL0`` and
645   executing the ``msr spsel, #0`` instruction.
646
647#. Determining the type of interrupt. Secure-EL1 interrupts will be signaled
648   at the FIQ vector. Non-secure interrupts will be signaled at the IRQ
649   vector. The platform should implement the following API to determine the
650   type of the pending interrupt.
651
652   .. code:: c
653
654       uint32_t plat_ic_get_interrupt_type(void);
655
656   It should return either ``INTR_TYPE_S_EL1`` or ``INTR_TYPE_NS``.
657
658#. Determining the handler for the type of interrupt that has been generated.
659   The following API has been added for this purpose.
660
661   .. code:: c
662
663       interrupt_type_handler get_interrupt_type_handler(uint32_t interrupt_type);
664
665   It returns the reference to the registered handler for this interrupt
666   type. The ``handler`` is retrieved from the ``intr_type_desc_t`` structure as
667   described in Section 2. ``NULL`` is returned if no handler has been
668   registered for this type of interrupt. This scenario is reported as an
669   irrecoverable error condition.
670
671#. Calling the registered handler function for the interrupt type generated.
672   The ``id`` parameter is set to ``INTR_ID_UNAVAILABLE`` currently. The id along
673   with the current security state and a reference to the ``cpu_context_t``
674   structure for the current security state are passed to the handler function
675   as its arguments.
676
677   The handler function returns a reference to the per-cpu ``cpu_context_t``
678   structure for the target security state.
679
680#. Calling ``el3_exit()`` to return from EL3 into a lower exception level in
681   the security state determined by the handler routine. The ``el3_exit()``
682   function is responsible for restoring the register context from the
683   ``cpu_context_t`` data structure for the target security state.
684
685Secure payload dispatcher
686~~~~~~~~~~~~~~~~~~~~~~~~~
687
688Interrupt entry
689^^^^^^^^^^^^^^^
690
691The SPD service begins handling an interrupt when the EL3 runtime firmware calls
692the handler function for that type of interrupt. The SPD service is responsible
693for the following:
694
695#. Validating the interrupt. This involves ensuring that the interrupt was
696   generated according to the interrupt routing model specified by the SPD
697   service during registration. It should use the security state of the
698   exception level (passed in the ``flags`` parameter of the handler) where
699   the interrupt was taken from to determine this. If the interrupt is not
700   recognised then the handler should treat it as an irrecoverable error
701   condition.
702
703   An SPD service can register a handler for Secure-EL1 and/or Non-secure
704   interrupts. A non-secure interrupt should never be routed to EL3 from
705   from non-secure state. Also if a routing model is chosen where Secure-EL1
706   interrupts are routed to S-EL1 when execution is in Secure state, then a
707   S-EL1 interrupt should never be routed to EL3 from secure state. The handler
708   could use the security state flag to check this.
709
710#. Determining whether a context switch is required. This depends upon the
711   routing model and interrupt type. For non secure and S-EL1 interrupt,
712   if the security state of the execution context where the interrupt was
713   generated is not the same as the security state required for handling
714   the interrupt, a context switch is required. The following 2 cases
715   require a context switch from secure to non-secure or vice-versa:
716
717   #. A Secure-EL1 interrupt taken from the non-secure state should be
718      routed to the Secure Payload.
719
720   #. A non-secure interrupt taken from the secure state should be routed
721      to the last known non-secure exception level.
722
723   The SPD service must save the system register context of the current
724   security state. It must then restore the system register context of the
725   target security state. It should use the ``cm_set_next_eret_context()`` API
726   to ensure that the next ``cpu_context`` to be restored is of the target
727   security state.
728
729   If the target state is secure then execution should be handed to the SP as
730   per the synchronous interrupt handling model it implements. A Secure-EL1
731   interrupt can be routed to EL3 while execution is in the SP. This implies
732   that SP execution can be preempted while handling an interrupt by a
733   another higher priority Secure-EL1 interrupt or a EL3 interrupt. The SPD
734   service should be able to handle this preemption or manage secure interrupt
735   priorities before handing control to the SP.
736
737#. Setting the return value of the handler to the per-cpu ``cpu_context`` if
738   the interrupt has been successfully validated and ready to be handled at a
739   lower exception level.
740
741The routing model allows non-secure interrupts to interrupt Secure-EL1 when in
742secure state if it has been configured to do so. The SPD service and the SP
743should implement a mechanism for routing these interrupts to the last known
744exception level in the non-secure state. The former should save the SP context,
745restore the non-secure context and arrange for entry into the non-secure state
746so that the interrupt can be handled.
747
748Interrupt exit
749^^^^^^^^^^^^^^
750
751When the Secure Payload has finished handling a Secure-EL1 interrupt, it could
752return control back to the SPD service through a SMC32 or SMC64. The SPD service
753should handle this secure monitor call so that execution resumes in the
754exception level and the security state from where the Secure-EL1 interrupt was
755originally taken.
756
757Test secure payload dispatcher Secure-EL1 interrupt handling
758^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
759
760The example TSPD service registers a handler for Secure-EL1 interrupts taken
761from the non-secure state. During execution in S-EL1, the TSPD expects that the
762Secure-EL1 interrupts are handled in S-EL1 by TSP. Its handler
763``tspd_secure_el1_interrupt_handler()`` expects only to be invoked for Secure-EL1
764originating from the non-secure state. It takes the following actions upon being
765invoked.
766
767#. It uses the security state provided in the ``flags`` parameter to ensure
768   that the secure interrupt originated from the non-secure state. It asserts
769   if this is not the case.
770
771#. It saves the system register context for the non-secure state by calling
772   ``cm_el1_sysregs_context_save(NON_SECURE);``.
773
774#. It sets the ``ELR_EL3`` system register to ``tsp_sel1_intr_entry`` and sets the
775   ``SPSR_EL3.DAIF`` bits in the secure CPU context. It sets ``x0`` to
776   ``TSP_HANDLE_SEL1_INTR_AND_RETURN``. If the TSP was preempted earlier by a non
777   secure interrupt during ``yielding`` SMC processing, save the registers that
778   will be trashed, which is the ``ELR_EL3`` and ``SPSR_EL3``, in order to be able
779   to re-enter TSP for Secure-EL1 interrupt processing. It does not need to
780   save any other secure context since the TSP is expected to preserve it
781   (see section `Test secure payload dispatcher behavior`_).
782
783#. It restores the system register context for the secure state by calling
784   ``cm_el1_sysregs_context_restore(SECURE);``.
785
786#. It ensures that the secure CPU context is used to program the next
787   exception return from EL3 by calling ``cm_set_next_eret_context(SECURE);``.
788
789#. It returns the per-cpu ``cpu_context`` to indicate that the interrupt can
790   now be handled by the SP. ``x1`` is written with the value of ``elr_el3``
791   register for the non-secure state. This information is used by the SP for
792   debugging purposes.
793
794The figure below describes how the interrupt handling is implemented by the TSPD
795when a Secure-EL1 interrupt is generated when execution is in the non-secure
796state.
797
798|Image 1|
799
800The TSP issues an SMC with ``TSP_HANDLED_S_EL1_INTR`` as the function identifier to
801signal completion of interrupt handling.
802
803The TSPD service takes the following actions in ``tspd_smc_handler()`` function
804upon receiving an SMC with ``TSP_HANDLED_S_EL1_INTR`` as the function identifier:
805
806#. It ensures that the call originated from the secure state otherwise
807   execution returns to the non-secure state with ``SMC_UNK`` in ``x0``.
808
809#. It restores the saved ``ELR_EL3`` and ``SPSR_EL3`` system registers back to
810   the secure CPU context (see step 3 above) in case the TSP had been preempted
811   by a non secure interrupt earlier.
812
813#. It restores the system register context for the non-secure state by
814   calling ``cm_el1_sysregs_context_restore(NON_SECURE)``.
815
816#. It ensures that the non-secure CPU context is used to program the next
817   exception return from EL3 by calling ``cm_set_next_eret_context(NON_SECURE)``.
818
819#. ``tspd_smc_handler()`` returns a reference to the non-secure ``cpu_context``
820   as the return value.
821
822Test secure payload dispatcher non-secure interrupt handling
823^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
824
825The TSP in Secure-EL1 can be preempted by a non-secure interrupt during
826``yielding`` SMC processing or by a higher priority EL3 interrupt during
827Secure-EL1 interrupt processing. When ``EL3_EXCEPTION_HANDLING`` is ``0``, only
828non-secure interrupts can cause preemption of TSP since there are no EL3
829interrupts in the system. With ``EL3_EXCEPTION_HANDLING=1`` however, any EL3
830interrupt may preempt Secure execution.
831
832It should be noted that while TSP is preempted, the TSPD only allows entry into
833the TSP either for Secure-EL1 interrupt handling or for resuming the preempted
834``yielding`` SMC in response to the ``TSP_FID_RESUME`` SMC from the normal world.
835(See Section `Implication of preempted SMC on Non-Secure Software`_).
836
837The non-secure interrupt triggered in Secure-EL1 during ``yielding`` SMC
838processing can be routed to either EL3 or Secure-EL1 and is controlled by build
839option ``TSP_NS_INTR_ASYNC_PREEMPT`` (see Section `Test secure payload
840dispatcher behavior`_). If the build option is set, the TSPD will set the
841routing model for the non-secure interrupt to be routed to EL3 from secure state
842i.e. **TEL3=1, CSS=0** and registers ``tspd_ns_interrupt_handler()`` as the
843non-secure interrupt handler. The ``tspd_ns_interrupt_handler()`` on being
844invoked ensures that the interrupt originated from the secure state and disables
845routing of non-secure interrupts from secure state to EL3. This is to prevent
846further preemption (by a non-secure interrupt) when TSP is reentered for
847handling Secure-EL1 interrupts that triggered while execution was in the normal
848world. The ``tspd_ns_interrupt_handler()`` then invokes
849``tspd_handle_sp_preemption()`` for further handling.
850
851If the ``TSP_NS_INTR_ASYNC_PREEMPT`` build option is zero (default), the default
852routing model for non-secure interrupt in secure state is in effect
853i.e. **TEL3=0, CSS=0**. During ``yielding`` SMC processing, the IRQ
854exceptions are unmasked i.e. ``PSTATE.I=0``, and a non-secure interrupt will
855trigger at Secure-EL1 IRQ exception vector. The TSP saves the general purpose
856register context and issues an SMC with ``TSP_PREEMPTED`` as the function
857identifier to signal preemption of TSP. The TSPD SMC handler,
858``tspd_smc_handler()``, ensures that the SMC call originated from the
859secure state otherwise execution returns to the non-secure state with
860``SMC_UNK`` in ``x0``. It then invokes ``tspd_handle_sp_preemption()`` for
861further handling.
862
863The ``tspd_handle_sp_preemption()`` takes the following actions upon being
864invoked:
865
866#. It saves the system register context for the secure state by calling
867   ``cm_el1_sysregs_context_save(SECURE)``.
868
869#. It restores the system register context for the non-secure state by
870   calling ``cm_el1_sysregs_context_restore(NON_SECURE)``.
871
872#. It ensures that the non-secure CPU context is used to program the next
873   exception return from EL3 by calling ``cm_set_next_eret_context(NON_SECURE)``.
874
875#. ``SMC_PREEMPTED`` is set in x0 and return to non secure state after
876   restoring non secure context.
877
878The Normal World is expected to resume the TSP after the ``yielding`` SMC
879preemption by issuing an SMC with ``TSP_FID_RESUME`` as the function identifier
880(see section `Implication of preempted SMC on Non-Secure Software`_).  The TSPD
881service takes the following actions in ``tspd_smc_handler()`` function upon
882receiving this SMC:
883
884#. It ensures that the call originated from the non secure state. An
885   assertion is raised otherwise.
886
887#. Checks whether the TSP needs a resume i.e check if it was preempted. It
888   then saves the system register context for the non-secure state by calling
889   ``cm_el1_sysregs_context_save(NON_SECURE)``.
890
891#. Restores the secure context by calling
892   ``cm_el1_sysregs_context_restore(SECURE)``
893
894#. It ensures that the secure CPU context is used to program the next
895   exception return from EL3 by calling ``cm_set_next_eret_context(SECURE)``.
896
897#. ``tspd_smc_handler()`` returns a reference to the secure ``cpu_context`` as the
898   return value.
899
900The figure below describes how the TSP/TSPD handle a non-secure interrupt when
901it is generated during execution in the TSP with ``PSTATE.I`` = 0 when the
902``TSP_NS_INTR_ASYNC_PREEMPT`` build flag is 0.
903
904|Image 2|
905
906Secure payload
907~~~~~~~~~~~~~~
908
909The SP should implement one or both of the synchronous and asynchronous
910interrupt handling models depending upon the interrupt routing model it has
911chosen (as described in section `Secure Payload`__).
912
913.. __: #sp-int-registration
914
915In the synchronous model, it should begin handling a Secure-EL1 interrupt after
916receiving control from the SPD service at an entrypoint agreed upon during build
917time or during the registration phase. Before handling the interrupt, the SP
918should save any Secure-EL1 system register context which is needed for resuming
919normal execution in the SP later e.g. ``SPSR_EL1``, ``ELR_EL1``. After handling
920the interrupt, the SP could return control back to the exception level and
921security state where the interrupt was originally taken from. The SP should use
922an SMC32 or SMC64 to ask the SPD service to do this.
923
924In the asynchronous model, the Secure Payload is responsible for handling
925non-secure and Secure-EL1 interrupts at the IRQ and FIQ vectors in its exception
926vector table when ``PSTATE.I`` and ``PSTATE.F`` bits are 0. As described earlier,
927when a non-secure interrupt is generated, the SP should coordinate with the SPD
928service to pass control back to the non-secure state in the last known exception
929level. This will allow the non-secure interrupt to be handled in the non-secure
930state.
931
932Test secure payload behavior
933^^^^^^^^^^^^^^^^^^^^^^^^^^^^
934
935The TSPD hands control of a Secure-EL1 interrupt to the TSP at the
936``tsp_sel1_intr_entry()``. The TSP handles the interrupt while ensuring that the
937handover agreement described in Section `Test secure payload dispatcher
938behavior`_ is maintained. It updates some statistics by calling
939``tsp_update_sync_sel1_intr_stats()``. It then calls
940``tsp_common_int_handler()`` which.
941
942#. Checks whether the interrupt is the secure physical timer interrupt. It
943   uses the platform API ``plat_ic_get_pending_interrupt_id()`` to get the
944   interrupt number. If it is not the secure physical timer interrupt, then
945   that means that a higher priority interrupt has preempted it. Invoke
946   ``tsp_handle_preemption()`` to handover control back to EL3 by issuing
947   an SMC with ``TSP_PREEMPTED`` as the function identifier.
948
949#. Handles the secure timer interrupt interrupt by acknowledging it using the
950   ``plat_ic_acknowledge_interrupt()`` platform API, calling
951   ``tsp_generic_timer_handler()`` to reprogram the secure physical generic
952   timer and calling the ``plat_ic_end_of_interrupt()`` platform API to signal
953   end of interrupt processing.
954
955The TSP passes control back to the TSPD by issuing an SMC64 with
956``TSP_HANDLED_S_EL1_INTR`` as the function identifier.
957
958The TSP handles interrupts under the asynchronous model as follows.
959
960#. Secure-EL1 interrupts are handled by calling the ``tsp_common_int_handler()``
961   function. The function has been described above.
962
963#. Non-secure interrupts are handled by calling the ``tsp_common_int_handler()``
964   function which ends up invoking ``tsp_handle_preemption()`` and issuing an
965   SMC64 with ``TSP_PREEMPTED`` as the function identifier. Execution resumes at
966   the instruction that follows this SMC instruction when the TSPD hands control
967   to the TSP in response to an SMC with ``TSP_FID_RESUME`` as the function
968   identifier from the non-secure state (see section `Test secure payload
969   dispatcher non-secure interrupt handling`_).
970
971Other considerations
972--------------------
973
974Implication of preempted SMC on Non-Secure Software
975~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
976
977A ``yielding`` SMC call to Secure payload can be preempted by a non-secure
978interrupt and the execution can return to the non-secure world for handling
979the interrupt (For details on ``yielding`` SMC refer `SMC calling convention`_).
980In this case, the SMC call has not completed its execution and the execution
981must return back to the secure payload to resume the preempted SMC call.
982This can be achieved by issuing an SMC call which instructs to resume the
983preempted SMC.
984
985A ``fast`` SMC cannot be preempted and hence this case will not happen for
986a fast SMC call.
987
988In the Test Secure Payload implementation, ``TSP_FID_RESUME`` is designated
989as the resume SMC FID. It is important to note that ``TSP_FID_RESUME`` is a
990``yielding`` SMC which means it too can be be preempted. The typical non
991secure software sequence for issuing a ``yielding`` SMC would look like this,
992assuming ``P.STATE.I=0`` in the non secure state :
993
994.. code:: c
995
996    int rc;
997    rc = smc(TSP_YIELD_SMC_FID, ...);     /* Issue a Yielding SMC call */
998    /* The pending non-secure interrupt is handled by the interrupt handler
999       and returns back here. */
1000    while (rc == SMC_PREEMPTED) {       /* Check if the SMC call is preempted */
1001        rc = smc(TSP_FID_RESUME);       /* Issue resume SMC call */
1002    }
1003
1004The ``TSP_YIELD_SMC_FID`` is any ``yielding`` SMC function identifier and the smc()
1005function invokes a SMC call with the required arguments. The pending non-secure
1006interrupt causes an IRQ exception and the IRQ handler registered at the
1007exception vector handles the non-secure interrupt and returns. The return value
1008from the SMC call is tested for ``SMC_PREEMPTED`` to check whether it is
1009preempted. If it is, then the resume SMC call ``TSP_FID_RESUME`` is issued. The
1010return value of the SMC call is tested again to check if it is preempted.
1011This is done in a loop till the SMC call succeeds or fails. If a ``yielding``
1012SMC is preempted, until it is resumed using ``TSP_FID_RESUME`` SMC and
1013completed, the current TSPD prevents any other SMC call from re-entering
1014TSP by returning ``SMC_UNK`` error.
1015
1016--------------
1017
1018*Copyright (c) 2014-2019, Arm Limited and Contributors. All rights reserved.*
1019
1020.. _Porting Guide: ../getting_started/porting-guide.rst
1021.. _SMC calling convention: http://infocenter.arm.com/help/topic/com.arm.doc.den0028a/index.html
1022
1023.. |Image 1| image:: diagrams/sec-int-handling.png?raw=true
1024.. |Image 2| image:: diagrams/non-sec-int-handling.png?raw=true
1025