assembler version of "set $cpsr = 0xd3"
Richard Earnshaw
rearnsha@arm.com
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
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.
More information about the Gdb
mailing list