arch: arc: fix the bug in exception return for secure mode
* current codes use a faked interrupt return to do a thread switch in exception return. * so the different between exception return and interrupt return should be carefully considered. * when secure is enabled, the sec_stat should also be pushed in exception entry. * when secure is enabled, SEC_STAT.IRM must be configured corrrectly for interrupt return. * For the case of faked interrupt return in exception return, the correct value of SEC_STAT.IRM comes from ER_SEC_STAT.ERM. Signed-off-by: Wayne Ren <wei.ren@synopsys.com>
This commit is contained in:
parent
f245ef2aeb
commit
77eb883ab0
@ -71,6 +71,10 @@ SECTION_SUBSEC_FUNC(TEXT,__fault,__ev_maligned)
|
||||
/* save caller saved registers */
|
||||
_create_irq_stack_frame
|
||||
|
||||
#ifdef CONFIG_ARC_HAS_SECURE
|
||||
lr r0,[_ARC_V2_ERSEC_STAT]
|
||||
st_s r0, [sp, ___isf_t_sec_stat_OFFSET]
|
||||
#endif
|
||||
lr r0,[_ARC_V2_ERSTATUS]
|
||||
st_s r0, [sp, ___isf_t_status32_OFFSET]
|
||||
lr r0,[_ARC_V2_ERET]
|
||||
@ -117,6 +121,16 @@ _exc_return:
|
||||
ld_s r2, [r1, _kernel_offset_to_ready_q_cache]
|
||||
st_s r2, [r1, _kernel_offset_to_current]
|
||||
|
||||
#ifdef CONFIG_ARC_HAS_SECURE
|
||||
/* ERM to IRM */
|
||||
lr r3,[_ARC_V2_ERSEC_STAT]
|
||||
btst r3, 31
|
||||
bset.nz r3, r3, 3
|
||||
bclr.z r3, r3, 3
|
||||
/* sflag r3 */
|
||||
/* sflag instruction is not supported in current ARC GNU */
|
||||
.long 0x00ff302f
|
||||
#endif
|
||||
/* clear AE bit to forget this was an exception */
|
||||
lr r3, [_ARC_V2_STATUS32]
|
||||
and r3,r3,(~_ARC_V2_STATUS32_AE)
|
||||
@ -190,6 +204,10 @@ _do_other_trap:
|
||||
/* save caller saved registers */
|
||||
_create_irq_stack_frame
|
||||
|
||||
#ifdef CONFIG_ARC_HAS_SECURE
|
||||
lr r0,[_ARC_V2_ERSEC_STAT]
|
||||
st_s r0, [sp, ___isf_t_sec_stat_OFFSET]
|
||||
#endif
|
||||
lr r0,[_ARC_V2_ERSTATUS]
|
||||
st_s r0, [sp, ___isf_t_status32_OFFSET]
|
||||
lr r0,[_ARC_V2_ERET]
|
||||
|
||||
@ -58,6 +58,9 @@ GEN_OFFSET_SYM(_isf_t, ldi_base);
|
||||
GEN_OFFSET_SYM(_isf_t, jli_base);
|
||||
#endif
|
||||
GEN_OFFSET_SYM(_isf_t, pc);
|
||||
#ifdef CONFIG_ARC_HAS_SECURE
|
||||
GEN_OFFSET_SYM(_isf_t, sec_stat);
|
||||
#endif
|
||||
GEN_OFFSET_SYM(_isf_t, status32);
|
||||
GEN_ABSOLUTE_SYM(___isf_t_SIZEOF, sizeof(_isf_t));
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user