This is the mail archive of the
gdb@sources.redhat.com
mailing list for the GDB project.
Re: assembler version of "set $cpsr = 0xd3"
- To: "Odd Lindahl" <odd dot lindahl at mail dot com>
- Subject: Re: assembler version of "set $cpsr = 0xd3"
- From: Richard Earnshaw <rearnsha at arm dot com>
- Date: Thu, 14 Jun 2001 10:26:58 +0100
- cc: gdb at sources dot redhat dot com, Richard dot Earnshaw at arm dot com
- Organization: ARM Ltd.
- Reply-To: Richard dot Earnshaw at arm dot com
> 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.