@@ -81,6 +81,7 @@ _exc_entry:
8181 _create_irq_stack_frame
8282
8383#ifdef CONFIG_ARC_HAS_SECURE
84+ / * ERSEC_ST AT is IOW/RAZ in normal mode * /
8485 lr r0 ,[ _ARC_V2_ERSEC_ST AT ]
8586 st_s r0 , [ sp , ___isf_t_sec_stat_OFFSET ]
8687#endif
@@ -121,7 +122,7 @@ _exc_return:
121122 st_s r2 , [ r1 , _kernel_offset_to_current ]
122123#endif
123124
124- #ifdef CONFIG_ARC_HAS_SECURE
125+ #ifdef CONFIG_ARC_SECURE_FIRMWARE
125126 / *
126127 * sync up the ERSEC_ST AT .ERM and SEC_ST AT .IRM.
127128 * use a fake interrupt return to simulate an exception turn.
@@ -130,11 +131,9 @@ _exc_return:
130131 * /
131132 lr r3 ,[ _ARC_V2_ERSEC_ST AT ]
132133 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
138137#endif
139138 / * clear AE bit to forget this was an exception , and go to
140139 * register bank0 (if exception is raised in firq with 2 reg
@@ -155,8 +154,23 @@ _exc_return:
155154 * raise exception again. The ignored interrupts will be re - triggered
156155 * if not cleared , or re - triggered by interrupt sources , or just missed
157156 * /
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
159172 sr r3 , [ _ARC_V2_AUX_IRQ_ACT ]
173+ #endif
160174
161175#if defined(CONFIG_ARC_FIRQ) && CONFIG_RGF_NUM_BANKS != 1
162176 mov r2 , ilink
@@ -191,7 +205,7 @@ SECTION_SUBSEC_FUNC(TEXT,__fault,__ev_trap)
191205 mov r6 , K_SYSCALL_BAD
192206
193207valid_syscall_id:
194- #ifdef CONFIG_ARC_HAS_SECURE
208+ #ifdef CONFIG_ARC_SECURE_FIRMWARE
195209 lr ilink , [ _ARC_V2_ERSEC_ST AT ]
196210 push ilink
197211#endif
@@ -268,17 +282,8 @@ exc_nest_handle:
268282 / * check if the current thread needs to be rescheduled * /
269283 ld_s r0 , [ r1 , _kernel_offset_to_ready_q_cache ]
270284 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 ]
279285#endif
280-
281- #ifdef CONFIG_ARC_HAS_SECURE
286+ #ifdef CONFIG_ARC_SECURE_FIRMWARE
282287 / *
283288 * sync up the ERSEC_ST AT .ERM and SEC_ST AT .IRM.
284289 * use a fake interrupt return to simulate an exception turn.
@@ -287,21 +292,42 @@ exc_nest_handle:
287292 * /
288293 lr r3 ,[ _ARC_V2_ERSEC_ST AT ]
289294 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
295298#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+
296308 / * clear AE bit to forget this was an exception * /
297309 lr r3 , [ _ARC_V2_STATUS32 ]
298310 and r3 , r3 , (~_ARC_V2_STATUS32_AE)
299311 kflag r3
300312 / * pretend lowest priority interrupt happened to use common handler * /
301313 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 ]
304314
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
305331 / * Assumption: r2 has current thread * /
306332 b _rirq_common_interrupt_swap
307333#endif
0 commit comments