ARC: [arcompact] entry.S: Improve early return from exception
The requirement is to - Reenable Exceptions (AE cleared) - Reenable Interrupts (E1/E2 set) We need to do wiggle these bits into ERSTATUS and call RTIE. Prev version used the pre-exception STATUS32 as starting point for what goes into ERSTATUS. This required explicit fixups of U/DE/L bits. Instead, use the current (in-exception) STATUS32 as starting point. Being in exception handler U/DE/L can be safely assumed to be correct. Only AE/E1/E2 need to be fixed. So the new implementation is slightly better -Avoids read form memory -Is 4 bytes smaller for the typical 1 level of intr configuration -Depicts the semantics more clearly Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
This commit is contained in:
parent
9dbd3d9bfd
commit
55a2ae775a
|
@ -110,13 +110,12 @@
|
||||||
|
|
||||||
.macro FAKE_RET_FROM_EXCPN
|
.macro FAKE_RET_FROM_EXCPN
|
||||||
|
|
||||||
ld r9, [sp, PT_status32]
|
lr r9, [status32]
|
||||||
bic r9, r9, (STATUS_U_MASK|STATUS_DE_MASK)
|
bclr r9, r9, STATUS_AE_BIT
|
||||||
bset r9, r9, STATUS_L_BIT
|
or r9, r9, (STATUS_E1_MASK|STATUS_E2_MASK)
|
||||||
sr r9, [erstatus]
|
sr r9, [erstatus]
|
||||||
mov r9, 55f
|
mov r9, 55f
|
||||||
sr r9, [eret]
|
sr r9, [eret]
|
||||||
|
|
||||||
rtie
|
rtie
|
||||||
55:
|
55:
|
||||||
.endm
|
.endm
|
||||||
|
|
|
@ -23,11 +23,13 @@
|
||||||
#define STATUS_E2_BIT 2 /* Int 2 enable */
|
#define STATUS_E2_BIT 2 /* Int 2 enable */
|
||||||
#define STATUS_A1_BIT 3 /* Int 1 active */
|
#define STATUS_A1_BIT 3 /* Int 1 active */
|
||||||
#define STATUS_A2_BIT 4 /* Int 2 active */
|
#define STATUS_A2_BIT 4 /* Int 2 active */
|
||||||
|
#define STATUS_AE_BIT 5 /* Exception active */
|
||||||
|
|
||||||
#define STATUS_E1_MASK (1<<STATUS_E1_BIT)
|
#define STATUS_E1_MASK (1<<STATUS_E1_BIT)
|
||||||
#define STATUS_E2_MASK (1<<STATUS_E2_BIT)
|
#define STATUS_E2_MASK (1<<STATUS_E2_BIT)
|
||||||
#define STATUS_A1_MASK (1<<STATUS_A1_BIT)
|
#define STATUS_A1_MASK (1<<STATUS_A1_BIT)
|
||||||
#define STATUS_A2_MASK (1<<STATUS_A2_BIT)
|
#define STATUS_A2_MASK (1<<STATUS_A2_BIT)
|
||||||
|
#define STATUS_AE_MASK (1<<STATUS_AE_BIT)
|
||||||
#define STATUS_IE_MASK (STATUS_E1_MASK | STATUS_E2_MASK)
|
#define STATUS_IE_MASK (STATUS_E1_MASK | STATUS_E2_MASK)
|
||||||
|
|
||||||
/* Other Interrupt Handling related Aux regs */
|
/* Other Interrupt Handling related Aux regs */
|
||||||
|
|
Loading…
Reference in New Issue