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


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

Re: assembler version of "set $cpsr = 0xd3"


> Hi all,
> 
> I have writen a program to my AT91EB40 boards flash at 0x10100000
> and I want to execute it after reset by putting the switch, SW1, in the
> UPPER MEM position.
> 
> The program doesn't work correctly though :-(
> 
> But if I boot in Angel mode and issue the gdb commands:
> 
> set rdiromatzero 1
> set remotebaud 9600
> target rdi com1
> set $cpsr = 0xd3
> jump *0x01010000
> ( or either of jump *0x01000000 and jump *0x01010000 with the switch in
> UPPER MEM position)
> 
> it starts up fine!!
> 
> But if I skipp the "set $cpsr = 0xd3" command it wont run correctly.
> 
> So what exactly does the "set $cpsr = 0xd3" command do and
> how do I replace the mode switch in software that I can flash.

You need the MSR instruction.  More precisely, the direct equivalent is

	mov	r0, #0xd3
	msr	cpsr_all, r0

But beware, you should not normally set the PSR registers in this way.  
Instead you should use a read-modify-write sequence so as the preserve the 
status of those bits that are not relevant to you at that time.  For 
example, to disable interrupts you would use

Disable_interrupts:
	mrs	r0, cpsr_all	// Get current status
	orr	r1, r0, #0xc0	// FIQ and IRQ ...
	msr	cpsr_all, r1	// ... block them
	mov	pc, lr

Full details of the bits in the CPSR registers are described in the ARM-ARM

R.




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