diff --git a/arch/arc/core/fault_s.S b/arch/arc/core/fault_s.S index e1bc1e95780..aedfdf9e07b 100644 --- a/arch/arc/core/fault_s.S +++ b/arch/arc/core/fault_s.S @@ -295,6 +295,9 @@ exc_nest_handle: bset.nz r3, r3, _ARC_V2_SEC_STAT_IRM_BIT bclr.z r3, r3, _ARC_V2_SEC_STAT_IRM_BIT sflag r3 + /* save _ARC_V2_SEC_STAT */ + and r3, r3, 0xff + push r3 #endif _save_callee_saved_regs diff --git a/arch/arc/core/offsets/offsets.c b/arch/arc/core/offsets/offsets.c index 74227d59746..6e9289ff907 100644 --- a/arch/arc/core/offsets/offsets.c +++ b/arch/arc/core/offsets/offsets.c @@ -85,9 +85,6 @@ GEN_OFFSET_SYM(_callee_saved_stack_t, r24); GEN_OFFSET_SYM(_callee_saved_stack_t, r25); GEN_OFFSET_SYM(_callee_saved_stack_t, r26); GEN_OFFSET_SYM(_callee_saved_stack_t, fp); -#ifdef CONFIG_ARC_SECURE_FIRMWARE -GEN_OFFSET_SYM(_callee_saved_stack_t, sec_stat); -#endif #ifdef CONFIG_USERSPACE #ifdef CONFIG_ARC_HAS_SECURE GEN_OFFSET_SYM(_callee_saved_stack_t, kernel_sp); diff --git a/arch/arc/core/regular_irq.S b/arch/arc/core/regular_irq.S index d7a9894ed93..f56fd4595fe 100644 --- a/arch/arc/core/regular_irq.S +++ b/arch/arc/core/regular_irq.S @@ -94,7 +94,7 @@ SECTION_FUNC(TEXT, _rirq_exit) _check_nest_int_by_irq_act r0, r1 - jne _rirq_return_from_rirq + jne _rirq_no_reschedule #ifdef CONFIG_STACK_SENTINEL bl z_check_stack_sentinel @@ -137,6 +137,11 @@ SECTION_FUNC(TEXT, _rirq_exit) .balign 4 _rirq_reschedule: +#ifdef CONFIG_ARC_SECURE_FIRMWARE + /* here need to remember SEC_STAT.IRM bit */ + lr r3, [_ARC_V2_SEC_STAT] + push r3 +#endif /* _save_callee_saved_regs expects outgoing thread in r2 */ _save_callee_saved_regs @@ -219,19 +224,20 @@ _rirq_return_from_coop: */ st_s r13, [sp, ___isf_t_r13_OFFSET] - /* stack now has the IRQ stack frame layout, pointing to r0 */ - - /* fall through to rtie instruction */ - + /* stack now has the IRQ stack frame layout, pointing to sp */ /* rtie will pop the rest from the stack */ - - /* fall through to rtie instruction */ + rtie #endif /* CONFIG_PREEMPT_ENABLED */ .balign 4 _rirq_return_from_firq: _rirq_return_from_rirq: +#ifdef CONFIG_ARC_SECURE_FIRMWARE + /* here need to recover SEC_STAT.IRM bit */ + pop r3 + sflag r3 +#endif _rirq_no_reschedule: rtie diff --git a/arch/arc/core/switch.S b/arch/arc/core/switch.S index 683b83abfe4..2c0d48d0571 100644 --- a/arch/arc/core/switch.S +++ b/arch/arc/core/switch.S @@ -164,6 +164,11 @@ return_loc: _switch_return_from_rirq: _switch_return_from_firq: +#ifdef CONFIG_ARC_SECURE_FIRMWARE + /* here need to recover SEC_STAT.IRM bit */ + pop r3 + sflag r3 +#endif lr r3, [_ARC_V2_STATUS32] bbit1 r3, _ARC_V2_STATUS32_AE_BIT, _return_from_exc_irq diff --git a/arch/arc/include/kernel_arch_data.h b/arch/arc/include/kernel_arch_data.h index d2c76e0ff59..93667eb3255 100644 --- a/arch/arc/include/kernel_arch_data.h +++ b/arch/arc/include/kernel_arch_data.h @@ -128,10 +128,6 @@ struct _callee_saved_stack { u32_t r26; u32_t fp; /* r27 */ -#ifdef CONFIG_ARC_SECURE_FIRMWARE - u32_t sec_stat; -#endif - #ifdef CONFIG_USERSPACE #ifdef CONFIG_ARC_HAS_SECURE u32_t user_sp; diff --git a/arch/arc/include/swap_macros.h b/arch/arc/include/swap_macros.h index b319446f7f0..258d0fc687b 100644 --- a/arch/arc/include/swap_macros.h +++ b/arch/arc/include/swap_macros.h @@ -38,11 +38,6 @@ st r26, [sp, ___callee_saved_stack_t_r26_OFFSET] st fp, [sp, ___callee_saved_stack_t_fp_OFFSET] -#ifdef CONFIG_ARC_SECURE_FIRMWARE - lr r13, [_ARC_V2_SEC_STAT] - st_s r13, [sp, ___callee_saved_stack_t_sec_stat_OFFSET] -#endif - #ifdef CONFIG_USERSPACE #ifdef CONFIG_ARC_HAS_SECURE #ifdef CONFIG_ARC_SECURE_FIRMWARE @@ -146,12 +141,6 @@ #endif #endif -#ifdef CONFIG_ARC_SECURE_FIRMWARE - ld r13, [sp, ___callee_saved_stack_t_sec_stat_OFFSET] - - sflag r13 -#endif - ld_s r13, [sp, ___callee_saved_stack_t_r13_OFFSET] ld_s r14, [sp, ___callee_saved_stack_t_r14_OFFSET] ld_s r15, [sp, ___callee_saved_stack_t_r15_OFFSET]