blob: b9baae912aaa27d2e40fb14130b20c4c2f45ee1c [file] [log] [blame]
Mate Toth-Pal4341de02018-10-02 12:55:47 +02001###################
2Secure IRQ handling
3###################
4
5The Armv8-M Architecture makes it possible to configure interrupts to target
6secure state.
7
8TF-M makes it possible for secure partitions to get notified of secure
9interrupts.
10
11By default TF-M sets up interrupts to target NS state. To configure an interrupt
12to target secure state and assign a handler to it, the manifest of the partition
13must be edited.
14
15See the following example:
16
17
18.. code-block:: yaml
19
20 {
21 "name": "...",
22 "type": "...",
23 "priority": "...",
24
25 ...
26
27 "irqs": [
28 {
Jaykumar Pitambarbhai Patelb3799e12019-10-08 17:23:12 +053029 "source": "5",
Mate Toth-Pal4341de02018-10-02 12:55:47 +020030 "signal": "DUAL_TIMER"
31 },
32 {
Jaykumar Pitambarbhai Patelb3799e12019-10-08 17:23:12 +053033 "source": "TFM_IRQ_LINE_TIMER_1",
Mate Toth-Pal4341de02018-10-02 12:55:47 +020034 "signal": "TIMER_1"
Mate Toth-Pal4341de02018-10-02 12:55:47 +020035 }
36 ],
37
38 ...
39
40 }
41
42To set up a handler in a partition, the ``irqs`` node must be added. A single
43secure partition can have handlers registered for multiple IRQs, in this case
44the list ``irqs`` has multiple elements in it.
45
46An IRQ handler is defined by the following nodes:
47
Boris Deleticaf02a712020-09-09 15:17:22 +010048- ``source``: The IRQ number or the name of the IRQ line. With the name of the
49 IRQ line, there must be defined a macro in ``tfm_peripherals_def.h`` which is
50 substituted to the IRQ line num. The IRQ line nums and sources are defined by
51 each platform: for example, they are defined in ``platform_irq.h`` for the
52 Musca-S1 platform. When defining new macros in ``tfm_peripherals_def.h``, it
53 is important the macro name matches the platform's handler function for that
54 IRQ source.
55- ``signal``: The name of the signal for this IRQ.
Mate Toth-Pal4341de02018-10-02 12:55:47 +020056
57.. important::
58
59 The name of the privileged interrupt handler is derived from the node
60 specifying the IRQ line number.
61
Jaykumar Pitambarbhai Patelb3799e12019-10-08 17:23:12 +053062 - In case ``source`` is IRQ number, the name of the handler becomes
63 ``void irq_<number>_Handler(void)``.
64 - In case ``source`` is defined IRQ macro, the name of the handler becomes
65 ``void <macro>_Handler(void)``.
Mate Toth-Pal4341de02018-10-02 12:55:47 +020066
Boris Deleticaf02a712020-09-09 15:17:22 +010067 This is important, because the derived name has to be present in the vector
68 table as the handler of the IRQ. The platform startup functions are specified
69 in the vector table defined in the platform secure startup file. The user
70 should verify the names of the generated handlers match for a given platform
71 IRQ.
Mate Toth-Pal4341de02018-10-02 12:55:47 +020072
73.. Note::
74
Jaykumar Pitambarbhai Patelb3799e12019-10-08 17:23:12 +053075 ``signal`` and ``source`` are mandatory.
Mate Toth-Pal4341de02018-10-02 12:55:47 +020076
Mate Toth-Pal4341de02018-10-02 12:55:47 +020077If an IRQ handler is registered, TF-M will:
78
Jaykumar Pitambarbhai Patelb3799e12019-10-08 17:23:12 +053079- Set the IRQ with number or macro to target secure state
Kevin Peng0979b0e2021-06-15 10:54:53 +080080- Set the priority of IRQ, the number is platform dependent. Platforms can
81 decide the priorities of each IRQ.
82
83.. Note::
84
85 The priority value for IRQ must be smaller than the value of PendSV, which is
86 0x80.
Mate Toth-Pal4341de02018-10-02 12:55:47 +020087
88TF-M configures the interrupt lines to be disabled by default. Interrupts for a
89service can be enabled by the secure service by calling
90``void tfm_enable_irq(psa_signal_t irq_signal)``. The function can be called in
91the service init function.
92
Mate Toth-Pal4341de02018-10-02 12:55:47 +020093Library model
Galanakis, Minoscc8cde72019-11-11 15:41:23 +000094=============
Mate Toth-Pal4341de02018-10-02 12:55:47 +020095
96In Library model a function with the name derived from the value of the
Jaykumar Pitambarbhai Patelb3799e12019-10-08 17:23:12 +053097``source`` property is generated. This function will be put in the vector table
98by the linker (as the handlers in the startup assembly are defined as weak
99symbols). The code generated for this function will forward the call to the
100function with the name of the value of the ``signal`` property post-fixed with
101``_isr``.
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200102
103.. hint::
104
105 for a signal ``"signal": "DUAL_TIMER"`` the name of the handler function is
106 ``DUAL_TIMER_isr``
107
108The signature of the IRQ handler in the partition must be the following:
109
110.. code-block:: c
111
112 void partition_irq_handler(void);
113
114The detailed description on how secure interrupt handling works in the Library
115model see
116`Secure Partition Interrupt Handling design document <https://developer.trustedfirmware.org/w/tf_m/design/secure_partition_interrupt_handling/>`_.
117
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200118IPC model
Galanakis, Minoscc8cde72019-11-11 15:41:23 +0000119=========
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200120
121The detailed description on how secure interrupt handling works in the IPC
122model, see the
123`PSA Firmware Framework and RoT Services specification <https://pages.arm.com/psa-resources-ff.html>`_.
124
Galanakis, Minoscc8cde72019-11-11 15:41:23 +0000125**********************
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200126Implementation details
Galanakis, Minoscc8cde72019-11-11 15:41:23 +0000127**********************
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200128
Galanakis, Minosf56baf62019-11-11 13:57:42 +0000129Library model implementation
Galanakis, Minoscc8cde72019-11-11 15:41:23 +0000130============================
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200131
132As a result of the function call like behaviour of secure services in library
133model, some information that is critical for the SPM to keep track of partition
134states, is stored on the stack of the active partitions. When an interrupt
135happens, and a handler partition is set to running state, it has access to its
136whole stack, and could corrupt the data stacked by the SPM. To prevent this, a
137separate Context stack is introduced for each secure partition, that is used by
138the SPM to save this information before starting to execute secure partition
139code.
140
141A stack frame to this context stack is pushed when the execution in the
142partition is interrupted, and when a handler in the partition interrupts another
143service. So the maximal stack usage can happen in the following situation:
144
145Consider secure partition 'A'. 'A' is running, and then it is interrupted by
146an other partition. Then the lowest priority interrupt of 'A' is triggered.
147Then before the handler returns, the partition is interrupted by another
148partition's handler. Then before the running handler returns, the second
149lowest interrupt of 'A' is triggered. This can go until the highest priority
150interrupt of 'A' is triggered, and then this last handler is interrupted. At
151this point the context stack looks like this:
152
David Hu050756f2021-04-13 17:53:01 +0800153.. code-block:: rst
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200154
155 +------------+
156 | [intr_ctx] |
157 | [hndl_ctx] |
158 | . |
159 | . |
160 | . |
161 | [intr_ctx] |
162 | [hndl_ctx] |
163 | [intr_ctx] |
164 +------------+
165
166 Legend:
167 [intr_ctx]: Frame pushed when the partition is interrupted
168 [hndl_ctx]: Frame pushed when the partition is handling an interrupt
169
170So the max stack size can be calculated as a function of the IRQ count of 'A':
171
David Hu050756f2021-04-13 17:53:01 +0800172.. code-block:: c
Mate Toth-Pal4341de02018-10-02 12:55:47 +0200173
174 max_stack_size = intr_ctx_size + (IRQ_CNT * (intr_ctx_size + hndl_ctx_size))
175
176--------------
177
David Hu050756f2021-04-13 17:53:01 +0800178*Copyright (c) 2018-2021, Arm Limited. All rights reserved.*