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