This is the mail archive of the crossgcc@sources.redhat.com mailing list for the crossgcc project.

See the CrossGCC FAQ for lots more information.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Return from Interrupts for ARM-ELF


Hi folks,

Just a quick question with regards to the interrupt attribute for functions.


For example 

void	ADI_IRQ_Interrupt_Setup(void) __attribute__ ((interrupt ("IRQ")));

void	ADI_IRQ_Interrupt_Setup(void) 
{
	IRQ();
	return ;
}

Generates the following code


   0:   e52dc004        str     ip, [sp, -#4]!
   4:   e1a0c00d        mov     ip, sp
   8:   e24ee004        sub     lr, lr, #4      ; 0x4
   c:   e92dd80f        stmdb   sp!, {r0, r1, r2, r3, fp, ip, lr, pc}
  10:   e24cb004        sub     fp, ip, #4      ; 0x4
        IRQ();
  14:   e59f3014        ldr     r3, [pc, #20]   ; 30 <ADI_IRQ_Interrupt_Setup+0x

30>
  18:   e5933000        ldr     r3, [r3]
  1c:   e1a0e00f        mov     lr, pc
  20:   e12fff13        bx      r3
        return 0 ;
  24:   e3a03000        mov     r3, #0  ; 0x0
}
  28:   e1a00003        mov     r0, r3
  2c:   e95b580f        ldmdb   fp, {r0, r1, r2, r3, fp, ip, lr}^
  30:   000001c0        andeq   r0, r0, r0, asr #3

How does GCC return to the code that calls this as it does not directly affect
the PC?

Should the following liner be replaced:

ldmdb   fp, {r0, r1, r2, r3, fp, ip, lr}^

with:

ldmdb   fp, {r0, r1, r2, r3, fp, ip, PC}^

To switch back to the previous user mode and jump back to the Link Register
location.

Any ideas?

Thanks,
Dave


--
http://www.iol.ie

------
Want more information?  See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/
Want to unsubscribe? Send a note to crossgcc-unsubscribe@sources.redhat.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]