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