arm, c5471: Refactor interrupt stack related code
Summary: - Apply the same logic for armv7-a - NOTE: stack pointer alignment is 4-byte Impact: - Affects arm (arm7/9) and c5471 with interrupt stack enabled Testing: - Built with c5471evm.nsh (CONFIG_ARCH_INTERRUPTSTACK=2048) - Built with ea3131:nsh (CONFIG_ARCH_INTERRUPTSTACK=2048) - Not tested but should work Signed-off-by: Masayuki Ishikawa <Masayuki.Ishikawa@jp.sony.com>
This commit is contained in:
parent
6e12f3c782
commit
973a6c49b6
@ -210,18 +210,12 @@ static void up_dumpstate(void)
|
|||||||
* stack?
|
* stack?
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (sp <= istackbase && sp > istackbase - istacksize)
|
if (sp < istackbase && sp > istackbase - istacksize)
|
||||||
{
|
{
|
||||||
/* Yes.. dump the interrupt stack */
|
/* Yes.. dump the interrupt stack */
|
||||||
|
|
||||||
|
_alert("Interrupt Stack\n", sp);
|
||||||
up_stackdump(sp, istackbase);
|
up_stackdump(sp, istackbase);
|
||||||
|
|
||||||
/* Extract the user stack pointer which should lie
|
|
||||||
* at the base of the interrupt stack.
|
|
||||||
*/
|
|
||||||
|
|
||||||
sp = g_intstackbase;
|
|
||||||
_alert("sp: %08x\n", sp);
|
|
||||||
}
|
}
|
||||||
else if (CURRENT_REGS)
|
else if (CURRENT_REGS)
|
||||||
{
|
{
|
||||||
@ -229,6 +223,17 @@ static void up_dumpstate(void)
|
|||||||
up_stackdump(istackbase - istacksize, istackbase);
|
up_stackdump(istackbase - istacksize, istackbase);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Extract the user stack pointer if we are in an interrupt handler.
|
||||||
|
* If we are not in an interrupt handler. Then sp is the user stack
|
||||||
|
* pointer (and the above range check should have failed).
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (CURRENT_REGS)
|
||||||
|
{
|
||||||
|
sp = CURRENT_REGS[REG_R13];
|
||||||
|
_alert("User sp: %08x\n", sp);
|
||||||
|
}
|
||||||
|
|
||||||
/* Show user stack info */
|
/* Show user stack info */
|
||||||
|
|
||||||
_alert("User stack:\n");
|
_alert("User stack:\n");
|
||||||
|
@ -132,7 +132,7 @@ arm_vectorirq:
|
|||||||
|
|
||||||
#if CONFIG_ARCH_INTERRUPTSTACK > 3
|
#if CONFIG_ARCH_INTERRUPTSTACK > 3
|
||||||
ldr sp, .Lirqstackbase /* SP = interrupt stack base */
|
ldr sp, .Lirqstackbase /* SP = interrupt stack base */
|
||||||
str r0, [sp] /* Save the user stack pointer */
|
str r0, [sp, #-4]! /* Save the xcp address at SP-4 then update SP */
|
||||||
bl arm_decodeirq /* Call the handler */
|
bl arm_decodeirq /* Call the handler */
|
||||||
ldr sp, [sp] /* Restore the user stack pointer */
|
ldr sp, [sp] /* Restore the user stack pointer */
|
||||||
#else
|
#else
|
||||||
@ -432,13 +432,13 @@ arm_vectorfiq:
|
|||||||
|
|
||||||
#if CONFIG_ARCH_INTERRUPTSTACK > 3
|
#if CONFIG_ARCH_INTERRUPTSTACK > 3
|
||||||
.bss
|
.bss
|
||||||
.align 4
|
.balign 4
|
||||||
.globl g_intstackalloc
|
.globl g_intstackalloc
|
||||||
.type g_intstackalloc, object
|
.type g_intstackalloc, object
|
||||||
.globl g_intstackbase
|
.globl g_intstackbase
|
||||||
.type g_intstackbase, object
|
.type g_intstackbase, object
|
||||||
g_intstackalloc:
|
g_intstackalloc:
|
||||||
.skip ((CONFIG_ARCH_INTERRUPTSTACK & ~3) - 4)
|
.skip (CONFIG_ARCH_INTERRUPTSTACK & ~3)
|
||||||
g_intstackbase:
|
g_intstackbase:
|
||||||
.skip 4
|
.skip 4
|
||||||
.size g_intstackbase, 4
|
.size g_intstackbase, 4
|
||||||
|
@ -162,7 +162,7 @@ arm_vectorirq:
|
|||||||
|
|
||||||
#if CONFIG_ARCH_INTERRUPTSTACK > 3
|
#if CONFIG_ARCH_INTERRUPTSTACK > 3
|
||||||
ldr sp, .Lirqstackbase /* SP = interrupt stack base */
|
ldr sp, .Lirqstackbase /* SP = interrupt stack base */
|
||||||
str r1, [sp] /* Save the user stack pointer */
|
str r1, [sp, #-4]! /* Save the xcp address at SP-4 then update SP */
|
||||||
bl arm_doirq /* Call the handler */
|
bl arm_doirq /* Call the handler */
|
||||||
ldr sp, [sp] /* Restore the user stack pointer */
|
ldr sp, [sp] /* Restore the user stack pointer */
|
||||||
#else
|
#else
|
||||||
@ -471,13 +471,13 @@ arm_vectoraddrexcptn:
|
|||||||
|
|
||||||
#if CONFIG_ARCH_INTERRUPTSTACK > 3
|
#if CONFIG_ARCH_INTERRUPTSTACK > 3
|
||||||
.bss
|
.bss
|
||||||
.align 4
|
.balign 4
|
||||||
.global g_intstackalloc
|
.global g_intstackalloc
|
||||||
.global g_intstackbase
|
.global g_intstackbase
|
||||||
.type g_intstackalloc, object
|
.type g_intstackalloc, object
|
||||||
.type g_intstackbase, object
|
.type g_intstackbase, object
|
||||||
g_intstackalloc:
|
g_intstackalloc:
|
||||||
.skip ((CONFIG_ARCH_INTERRUPTSTACK & ~3) - 4)
|
.skip (CONFIG_ARCH_INTERRUPTSTACK & ~3)
|
||||||
g_intstackbase:
|
g_intstackbase:
|
||||||
.skip 4
|
.skip 4
|
||||||
.size g_intstackbase, 4
|
.size g_intstackbase, 4
|
||||||
|
Loading…
Reference in New Issue
Block a user