forked from len0rd/rockbox
mips: Use a separate IRQ stack & optimize IRQ handling a little
Should prevent the IRQ-related stack overflows seen on MIPS targets. Change-Id: I447336ef3fe37e11b3276a78ba220ce64c2f87f5
This commit is contained in:
parent
5e8db1662b
commit
36a50dd00f
3 changed files with 60 additions and 38 deletions
|
|
@ -83,6 +83,9 @@ SECTIONS
|
|||
stackbegin = .;
|
||||
. += 0x2000;
|
||||
stackend = .;
|
||||
irqstackbegin = .;
|
||||
. += 0x400;
|
||||
irqstackend = .;
|
||||
} > IRAM
|
||||
|
||||
.bss (NOLOAD):
|
||||
|
|
|
|||
|
|
@ -87,5 +87,8 @@ SECTIONS
|
|||
stackbegin = .;
|
||||
. += 0x2000;
|
||||
stackend = .;
|
||||
irqstackbegin = .;
|
||||
. += 0x400;
|
||||
irqstackend = .;
|
||||
} > IRAM
|
||||
}
|
||||
|
|
|
|||
|
|
@ -164,6 +164,19 @@ _stack_loop:
|
|||
bne t0, sp, _stack_loop
|
||||
sw t2, -4(t0)
|
||||
|
||||
/*
|
||||
----------------------------------------------------
|
||||
Set up interrupt stack
|
||||
----------------------------------------------------
|
||||
*/
|
||||
la k0, irqstackend
|
||||
la t0, irqstackbegin
|
||||
|
||||
_irq_stack_loop:
|
||||
addiu t0, 4
|
||||
bne t0, k0, _irq_stack_loop
|
||||
sw t2, -4(t0)
|
||||
|
||||
/*
|
||||
----------------------------------------------------
|
||||
Jump to C code
|
||||
|
|
@ -200,7 +213,17 @@ _stack_loop:
|
|||
|
||||
.section .vectors, "ax", %progbits
|
||||
real_exception_handler:
|
||||
addiu sp, -0x80
|
||||
|
||||
/* Store stack pointer */
|
||||
move k0, sp
|
||||
/* jump to IRQ stack */
|
||||
la sp, irqstackend
|
||||
|
||||
/* Push crap on frame */
|
||||
addiu sp, -0x84
|
||||
/* store current stack pointer */
|
||||
sw k0, 0x80(sp)
|
||||
|
||||
sw ra, 0(sp)
|
||||
sw fp, 4(sp)
|
||||
sw gp, 8(sp)
|
||||
|
|
@ -236,16 +259,14 @@ real_exception_handler:
|
|||
nop
|
||||
sw k0, 0x74(sp)
|
||||
mfc0 k0, C0_STATUS
|
||||
sll zero, 1
|
||||
sll zero, 1
|
||||
sll zero, 1
|
||||
sll zero, 1
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
sw k0, 0x78(sp)
|
||||
mfc0 k0, C0_EPC
|
||||
sll zero, 1
|
||||
sll zero, 1
|
||||
sll zero, 1
|
||||
sll zero, 1
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
sw k0, 0x7C(sp)
|
||||
|
||||
li k1, M_CauseExcCode
|
||||
|
|
@ -264,15 +285,13 @@ _int:
|
|||
_exception:
|
||||
move a0, sp
|
||||
mfc0 a1, C0_CAUSE
|
||||
sll zero, 1
|
||||
sll zero, 1
|
||||
sll zero, 1
|
||||
sll zero, 1
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
mfc0 a2, C0_EPC
|
||||
sll zero, 1
|
||||
sll zero, 1
|
||||
sll zero, 1
|
||||
sll zero, 1
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
jal exception_handler
|
||||
nop
|
||||
|
||||
|
|
@ -314,18 +333,15 @@ _exception_return:
|
|||
lw k0, 0x78(sp)
|
||||
mtc0 k0, C0_STATUS
|
||||
nop
|
||||
sll zero, 1
|
||||
sll zero, 1
|
||||
sll zero, 1
|
||||
sll zero, 1
|
||||
nop
|
||||
nop
|
||||
lw k0, 0x7C(sp)
|
||||
mtc0 k0, C0_EPC
|
||||
nop
|
||||
sll zero, 1
|
||||
sll zero, 1
|
||||
sll zero, 1
|
||||
sll zero, 1
|
||||
addiu sp, 0x80
|
||||
nop
|
||||
nop
|
||||
/* Restore previous stack pointer */
|
||||
lw sp, 0x80(sp)
|
||||
eret
|
||||
nop
|
||||
.set reorder
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue