[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[microblaze-uclinux] Interrupt rutine
Hi,
I trying work with interrupt controller. but I have problem with return jump
from interrupt_handler. Return code is in register R14. I trying study
source code from uClinux, but code is very difficult.
What steps are significant to do for correct return from interrupt_handler
rutine?
void interrupt_handler(void)
{
timer_isr(arg)
count++;
intc->iar=0xFFFFFFFF;
microblaze_enable_interrupts();
}
void timer_isr(void *arg){
timestamp++;
tmr->control=tmr->control | TIMER_INTERRUPT;
}
Dump part of source code. In R1 is stack but the last instruction (line
12000390 - decreased stack) don't executable.
12000338 <interrupt_handler>:
12000338: 3021ffd0 addik r1, r1, -48
...
1200037c: b0000000 imm 0
12000380: b9f401f4 brlid r15, 500 // 12000574
<microblaze_enable_interrupts>
12000384: 80000000 or r0, r0, r0
12000388: c9e00800 lw r15, r0, r1
1200038c: b60f0008 rtsd r15, 8
12000390: 30210030 addik r1, r1, 48
I need instruction rtid with setting interrupt enable bit in MSR.
This part is in assembler from entry.S but in source code are many macros
for resolution.
G_ENTRY(irq):
swi r1, r0, ENTRY_SP; // save stack (emulate v850)
SAVE_STATE (IRQ, r0, ENTRY_SP) // Save registers.
add r5, r0, r0; // Clear first param
la r6, r1, PTO; // User regs are arg2
bralid r15, CSYM(handle_irq);
nop;
// fall through
/* Entry point used to return from an interrupt (also used by exception
handle s, below). */
ret_from_irq:
RETURN(IRQ)
END(irq)
G_ENTRY and END macro are simple but RETURN and SAVE_STATE is difficult.
#define G_ENTRY(name) \
.align 4; \
.globl name; \
.type name,@function; \
name
#define END(name) \
.size name,.-name
Thanx
Michal Simek
___________________________
microblaze-uclinux mailing list
microblaze-uclinux@xxxxxxxxxxxxxx
Project Home Page : http://www.itee.uq.edu.au/~jwilliams/mblaze-uclinux
Mailing List Archive : http://www.itee.uq.edu.au/~listarch/microblaze-uclinux/