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 = .;
|
stackbegin = .;
|
||||||
. += 0x2000;
|
. += 0x2000;
|
||||||
stackend = .;
|
stackend = .;
|
||||||
|
irqstackbegin = .;
|
||||||
|
. += 0x400;
|
||||||
|
irqstackend = .;
|
||||||
} > IRAM
|
} > IRAM
|
||||||
|
|
||||||
.bss (NOLOAD):
|
.bss (NOLOAD):
|
||||||
|
|
|
||||||
|
|
@ -87,5 +87,8 @@ SECTIONS
|
||||||
stackbegin = .;
|
stackbegin = .;
|
||||||
. += 0x2000;
|
. += 0x2000;
|
||||||
stackend = .;
|
stackend = .;
|
||||||
|
irqstackbegin = .;
|
||||||
|
. += 0x400;
|
||||||
|
irqstackend = .;
|
||||||
} > IRAM
|
} > IRAM
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -164,6 +164,19 @@ _stack_loop:
|
||||||
bne t0, sp, _stack_loop
|
bne t0, sp, _stack_loop
|
||||||
sw t2, -4(t0)
|
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
|
Jump to C code
|
||||||
|
|
@ -200,7 +213,17 @@ _stack_loop:
|
||||||
|
|
||||||
.section .vectors, "ax", %progbits
|
.section .vectors, "ax", %progbits
|
||||||
real_exception_handler:
|
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 ra, 0(sp)
|
||||||
sw fp, 4(sp)
|
sw fp, 4(sp)
|
||||||
sw gp, 8(sp)
|
sw gp, 8(sp)
|
||||||
|
|
@ -236,16 +259,14 @@ real_exception_handler:
|
||||||
nop
|
nop
|
||||||
sw k0, 0x74(sp)
|
sw k0, 0x74(sp)
|
||||||
mfc0 k0, C0_STATUS
|
mfc0 k0, C0_STATUS
|
||||||
sll zero, 1
|
nop
|
||||||
sll zero, 1
|
nop
|
||||||
sll zero, 1
|
nop
|
||||||
sll zero, 1
|
|
||||||
sw k0, 0x78(sp)
|
sw k0, 0x78(sp)
|
||||||
mfc0 k0, C0_EPC
|
mfc0 k0, C0_EPC
|
||||||
sll zero, 1
|
nop
|
||||||
sll zero, 1
|
nop
|
||||||
sll zero, 1
|
nop
|
||||||
sll zero, 1
|
|
||||||
sw k0, 0x7C(sp)
|
sw k0, 0x7C(sp)
|
||||||
|
|
||||||
li k1, M_CauseExcCode
|
li k1, M_CauseExcCode
|
||||||
|
|
@ -264,15 +285,13 @@ _int:
|
||||||
_exception:
|
_exception:
|
||||||
move a0, sp
|
move a0, sp
|
||||||
mfc0 a1, C0_CAUSE
|
mfc0 a1, C0_CAUSE
|
||||||
sll zero, 1
|
nop
|
||||||
sll zero, 1
|
nop
|
||||||
sll zero, 1
|
nop
|
||||||
sll zero, 1
|
|
||||||
mfc0 a2, C0_EPC
|
mfc0 a2, C0_EPC
|
||||||
sll zero, 1
|
nop
|
||||||
sll zero, 1
|
nop
|
||||||
sll zero, 1
|
nop
|
||||||
sll zero, 1
|
|
||||||
jal exception_handler
|
jal exception_handler
|
||||||
nop
|
nop
|
||||||
|
|
||||||
|
|
@ -314,18 +333,15 @@ _exception_return:
|
||||||
lw k0, 0x78(sp)
|
lw k0, 0x78(sp)
|
||||||
mtc0 k0, C0_STATUS
|
mtc0 k0, C0_STATUS
|
||||||
nop
|
nop
|
||||||
sll zero, 1
|
nop
|
||||||
sll zero, 1
|
nop
|
||||||
sll zero, 1
|
|
||||||
sll zero, 1
|
|
||||||
lw k0, 0x7C(sp)
|
lw k0, 0x7C(sp)
|
||||||
mtc0 k0, C0_EPC
|
mtc0 k0, C0_EPC
|
||||||
nop
|
nop
|
||||||
sll zero, 1
|
nop
|
||||||
sll zero, 1
|
nop
|
||||||
sll zero, 1
|
/* Restore previous stack pointer */
|
||||||
sll zero, 1
|
lw sp, 0x80(sp)
|
||||||
addiu sp, 0x80
|
|
||||||
eret
|
eret
|
||||||
nop
|
nop
|
||||||
.set reorder
|
.set reorder
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue