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]

RE: gcc compile



Am Mon, 22 Jan 2001 schrieben Sie:
> Hallo,
> 
> > I have tested the code on the eb01. After swi the proc is in SV.

Sorry, I wanted to say: I have tested it  on both the sim and the aeb and it
worked  on the aeb but not on the sim.

> 
> Therefore it's not because of the simulator :)
> 
> > 0x2018d28 <swi_handler__Fi>:	mov	r12, sp
> > 0x2018d2c <swi_handler__Fi+4>:	stmdb	sp!, {r11, r12, lr, pc}
> > 0x2018d30 <swi_handler__Fi+8>:	sub	r11, r12, #4	; 0x4
> > 0x2018d34 <swi_handler__Fi+12>:	sub	sp, sp, #12	; 0xc
> [snipped swi routine]
> > 0x2018d98 <swi_handler__Fi+112>:	ldmdb	r11, {r11, sp, pc}
> 
> This code won't set CPSR back to SPSR; Try to add a hat
> at the end of the return instruction:
> 	ldmdb r11, {r11, sp, pc}^
> (the hat activates the copy of SPSR to CPSR same as movs pc,lr)
> 
> >Don?t know what I am doing wrong. This does also not work:
> >void swi_handler(int reason) {
> >  switch(reason) {
> >  case REASON_CHANGE_TO_SV :
> >    asm volatile ("mrs r0,cpsr": : :"r0");
> >    asm volatile ("orr r0, r0, #192": : :"r0");
> >    asm volatile ("msr cpsr, r0");
> >  default :
> >    break;
> >  }
> >  asm volatile("movs    pc, lr");
> >}
> 
> Huh. What do you think happens to the stack when you leave
> like that? :-) (hint: you pushed 4 registers when entering
> the routine...)
> 
> I don't think you can create a whole swi handler in C (unless
> gcc has extensions I don't know about. the arm C doesn't
> anyway).
> 
> I'd advise you to use an assembly top-level handler such
> as:
> 
> 	stmdf sp!, {r0-r3, lr}
> 	ldr	r0, [lr,#-4]
> 	bic	r0, r0, #0xff000000
> 	mov	r1, sp			; r1 = SWI number
> 	mrs	r2, spsr
> 	stmfd	sp!, {r2}			; keep spsr in case of nested swi's
> 	bl	C_Handler
> 	ldmfd	sp!, {r2}
> 	msr	spsr, r2			; restore spsr
> 	ldmfd	sp!, {r0-r3, pc}^		; return, restore cpsr from spsr
> 
> (this is straight from ADS' developer guide, by the way)
> 
> Then your C handler looks like:
> 
> void C_Handler( int swi_number, unsigned int * stack )
> {
>     printf( "got swi %d\n", swi_number );
> }
> 
> Hope that helps!
 Me too! :-)
I will try it!

Jens-Christian

> 
> Yves.
-- 


Jens-Christian Lache
Technische Universitaet Hamburg-Harburg
www.tu-harburg.de/~sejl1601
Mail:
lache@tu-harburg.de
lache@ngi.de
Tel.:
+0491759610756

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


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