This is the mail archive of the
ecos-discuss@sources.redhat.com
mailing list for the eCos project.
ecos newbie question: the stack for interrupt_end()
- From: "wyb" <wyb at topsec dot com dot cn>
- To: <ecos-discuss at sources dot redhat dot com>
- Date: Fri, 9 Apr 2004 14:51:12 +0800
- Subject: [ECOS] ecos newbie question: the stack for interrupt_end()
In arm HAL, the following code said that interrupt_end() should be called on
the thread stack.
=========================================
spurious_IRQ:
#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK
// If we are returning from the last nested interrupt, move back
// to the thread stack. interrupt_end() must be called on the
// thread stack since it potentially causes a context switch.
ldr r2,.irq_level
ldr r3,[r2]
subs r1,r3,#1
str r1,[r2]
ldreq sp,[sp] // This should be the saved stack pointer
#endif
==========================================
But if the thread was in user mode, the "ldreq sp, [sp]" still loaded SP
with svc_sp,not usr_sp. because the sp saved in interrupt_stack was svc_sp.
The "ldreq sp, .__interrupt_stack" in following code saved the svc_sp. Mybe
i'm false, can anyone help me.
#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK
// Switch to interrupt stack
ldr r2,.irq_level // current number of nested
interrupts
ldr r0,[r2]
add r1,r0,#1
str r1,[r2] // if was zero, switch stacks
cmp r0,#0
moveq r1,sp // save old stack pointer
ldreq sp,.__interrupt_stack
stmeqfd sp!,{r1}
10:
#endif
--
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss