Commit 55a2ae77 authored by Vineet Gupta's avatar Vineet Gupta

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: default avatarVineet Gupta <vgupta@synopsys.com>
parent 9dbd3d9b
...@@ -110,13 +110,12 @@ ...@@ -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 @@ ...@@ -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 */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment