@@ -81,6 +81,7 @@ _exc_entry:
81
81
_create_irq_stack_frame
82
82
83
83
#ifdef CONFIG_ARC_HAS_SECURE
84
+ / * ERSEC_ST AT is IOW/RAZ in normal mode * /
84
85
lr r0 ,[ _ARC_V2_ERSEC_ST AT ]
85
86
st_s r0 , [ sp , ___isf_t_sec_stat_OFFSET ]
86
87
#endif
@@ -121,7 +122,7 @@ _exc_return:
121
122
st_s r2 , [ r1 , _kernel_offset_to_current ]
122
123
#endif
123
124
124
- #ifdef CONFIG_ARC_HAS_SECURE
125
+ #ifdef CONFIG_ARC_SECURE_FIRMWARE
125
126
/ *
126
127
* sync up the ERSEC_ST AT .ERM and SEC_ST AT .IRM.
127
128
* use a fake interrupt return to simulate an exception turn.
@@ -130,11 +131,9 @@ _exc_return:
130
131
* /
131
132
lr r3 ,[ _ARC_V2_ERSEC_ST AT ]
132
133
btst r3 , 31
133
- bset.nz r3 , r3 , 3
134
- bclr.z r3 , r3 , 3
135
- / * sflag r3 * /
136
- / * sflag instruction is not supported in current ARC GNU * /
137
- .long 0x00ff302f
134
+ bset.nz r3 , r3 , _ARC_V2_SEC_STAT_IRM_BIT
135
+ bclr.z r3 , r3 , _ARC_V2_SEC_STAT_IRM_BIT
136
+ sflag r3
138
137
#endif
139
138
/ * clear AE bit to forget this was an exception , and go to
140
139
* register bank0 (if exception is raised in firq with 2 reg
@@ -155,8 +154,23 @@ _exc_return:
155
154
* raise exception again. The ignored interrupts will be re - triggered
156
155
* if not cleared , or re - triggered by interrupt sources , or just missed
157
156
* /
158
- mov r3 , ( 1 << (CONFIG_NUM_IRQ_PRIO_LEVELS - 1 )) / * use lowest * /
157
+
158
+ #ifdef CONFIG_ARC_SECURE_FIRMWARE
159
+ mov r3 , ( 1 << (ARC_N_IRQ_START_LEVEL - 1 ))
160
+ #else
161
+ mov r3 , ( 1 << (CONFIG_NUM_IRQ_PRIO_LEVELS - 1 ))
162
+ #endif
163
+
164
+ #ifdef CONFIG_ARC_NORMAL_FIRMWARE
165
+ push r2
166
+ mov r0 , _ARC_V2_AUX_IRQ_ACT
167
+ mov r1 , r3
168
+ mov r6 , ARC_S_CALL_AUX_WRITE
169
+ sjli SJLI_CALL_ARC_SECURE
170
+ pop r2
171
+ #else
159
172
sr r3 , [ _ARC_V2_AUX_IRQ_ACT ]
173
+ #endif
160
174
161
175
#if defined(CONFIG_ARC_FIRQ) && CONFIG_RGF_NUM_BANKS != 1
162
176
mov r2 , ilink
@@ -191,7 +205,7 @@ SECTION_SUBSEC_FUNC(TEXT,__fault,__ev_trap)
191
205
mov r6 , K_SYSCALL_BAD
192
206
193
207
valid_syscall_id:
194
- #ifdef CONFIG_ARC_HAS_SECURE
208
+ #ifdef CONFIG_ARC_SECURE_FIRMWARE
195
209
lr ilink , [ _ARC_V2_ERSEC_ST AT ]
196
210
push ilink
197
211
#endif
@@ -268,17 +282,8 @@ exc_nest_handle:
268
282
/ * check if the current thread needs to be rescheduled * /
269
283
ld_s r0 , [ r1 , _kernel_offset_to_ready_q_cache ]
270
284
breq r0 , r2 , _exc_return_from_irqoffload_trap
271
-
272
- _save_callee_saved_regs
273
-
274
- st _CAUSE_RIRQ , [ r2 , _thread_offset_to_relinquish_cause ]
275
- / * note: Ok to use _CAUSE_RIRQ since everything is saved * /
276
-
277
- ld_s r2 , [ r1 , _kernel_offset_to_ready_q_cache ]
278
- st_s r2 , [ r1 , _kernel_offset_to_current ]
279
285
#endif
280
-
281
- #ifdef CONFIG_ARC_HAS_SECURE
286
+ #ifdef CONFIG_ARC_SECURE_FIRMWARE
282
287
/ *
283
288
* sync up the ERSEC_ST AT .ERM and SEC_ST AT .IRM.
284
289
* use a fake interrupt return to simulate an exception turn.
@@ -287,21 +292,42 @@ exc_nest_handle:
287
292
* /
288
293
lr r3 ,[ _ARC_V2_ERSEC_ST AT ]
289
294
btst r3 , 31
290
- bset.nz r3 , r3 , 3
291
- bclr.z r3 , r3 , 3
292
- / * sflag r3 * /
293
- / * sflag instruction is not supported in current ARC GNU * /
294
- .long 0x00ff302f
295
+ bset.nz r3 , r3 , _ARC_V2_SEC_STAT_IRM_BIT
296
+ bclr.z r3 , r3 , _ARC_V2_SEC_STAT_IRM_BIT
297
+ sflag r3
295
298
#endif
299
+
300
+ _save_callee_saved_regs
301
+
302
+ st _CAUSE_RIRQ , [ r2 , _thread_offset_to_relinquish_cause ]
303
+ / * note: Ok to use _CAUSE_RIRQ since everything is saved * /
304
+
305
+ ld_s r2 , [ r1 , _kernel_offset_to_ready_q_cache ]
306
+ st_s r2 , [ r1 , _kernel_offset_to_current ]
307
+
296
308
/ * clear AE bit to forget this was an exception * /
297
309
lr r3 , [ _ARC_V2_STATUS32 ]
298
310
and r3 , r3 , (~_ARC_V2_STATUS32_AE)
299
311
kflag r3
300
312
/ * pretend lowest priority interrupt happened to use common handler * /
301
313
lr r3 , [ _ARC_V2_AUX_IRQ_ACT ]
302
- or r3 , r3 , ( 1 <<(CONFIG_NUM_IRQ_PRIO_LEVELS - 1 )) / * use lowest * /
303
- sr r3 , [ _ARC_V2_AUX_IRQ_ACT ]
304
314
315
+ #ifdef CONFIG_ARC_SECURE_FIRMWARE
316
+ or r3 , r3 , ( 1 << (ARC_N_IRQ_START_LEVEL - 1 ))
317
+ #else
318
+ or r3 , r3 , ( 1 << (CONFIG_NUM_IRQ_PRIO_LEVELS - 1 ))
319
+ #endif
320
+
321
+ #ifdef CONFIG_ARC_NORMAL_FIRMWARE
322
+ push_s r2
323
+ mov r0 , _ARC_V2_AUX_IRQ_ACT
324
+ mov r1 , r3
325
+ mov r6 , ARC_S_CALL_AUX_WRITE
326
+ sjli SJLI_CALL_ARC_SECURE
327
+ pop_s r2
328
+ #else
329
+ sr r3 , [ _ARC_V2_AUX_IRQ_ACT ]
330
+ #endif
305
331
/ * Assumption: r2 has current thread * /
306
332
b _rirq_common_interrupt_swap
307
333
#endif
0 commit comments