diff options
author | Vineet Gupta <vgupta@synopsys.com> | 2015-09-06 15:41:12 +0200 |
---|---|---|
committer | Vineet Gupta <vgupta@synopsys.com> | 2015-10-17 14:18:23 +0200 |
commit | 5f888087455c5199195c2ba17b91ac7285a33921 (patch) | |
tree | 6751413f87bccba6a83e240e867ffe9d37705ed9 /arch/arc/kernel | |
parent | ARC: [arcompact] entry.S: Improve early return from exception (diff) | |
download | linux-5f888087455c5199195c2ba17b91ac7285a33921.tar.xz linux-5f888087455c5199195c2ba17b91ac7285a33921.zip |
ARC: [arcompact] entry.S: Document preemption games for L2 intr
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
Diffstat (limited to 'arch/arc/kernel')
-rw-r--r-- | arch/arc/kernel/entry-compact.S | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/arch/arc/kernel/entry-compact.S b/arch/arc/kernel/entry-compact.S index 15d457b4403a..d9087a1236eb 100644 --- a/arch/arc/kernel/entry-compact.S +++ b/arch/arc/kernel/entry-compact.S @@ -175,12 +175,25 @@ ENTRY(handle_interrupt_level2) ;------------------------------------------------------ ; if L2 IRQ interrupted a L1 ISR, disable preemption + ; + ; This is to avoid a potential L1-L2-L1 scenario + ; -L1 IRQ taken + ; -L2 interrupts L1 (before L1 ISR could run) + ; -preemption off IRQ, user task in syscall picked to run + ; -RTIE to userspace + ; Returns from L2 context fine + ; But both L1 and L2 re-enabled, so another L1 can be taken + ; while prev L1 is still unserviced + ; ;------------------------------------------------------ + ; L2 interrupting L1 implies both L2 and L1 active + ; However both A2 and A1 are NOT set in STATUS32, thus + ; need to check STATUS32_L2 to determine if L1 was active + ld r9, [sp, PT_status32] ; get statu32_l2 (saved in pt_regs) bbit0 r9, STATUS_A1_BIT, 1f ; L1 not active when L2 IRQ, so normal - ; A1 is set in status32_l2 ; bump thread_info->preempt_count (Disable preemption) GET_CURR_THR_INFO_FROM_SP r10 ld r9, [r10, THREAD_INFO_PREEMPT_COUNT] |