assembler version of "set $cpsr = 0xd3"

Richard Earnshaw
Thu Jun 14 02:27:00 GMT 2001

> 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

	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


More information about the Gdb mailing list