* assembler version of "set $cpsr = 0xd3"
@ 2001-06-14 2:07 Odd Lindahl
2001-06-14 2:27 ` Richard Earnshaw
0 siblings, 1 reply; 2+ messages in thread
From: Odd Lindahl @ 2001-06-14 2:07 UTC (permalink / raw)
To: gdb
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.
I have tried with the instruction:
swi
as the very first instruction which puts my CPU in supervisor mode and
which I have made sure will return to the address following the swi instruction.
But this didn't do the trick.
Kind Regards
Odd
--
_______________________________________________
FREE Personalized E-mail at Mail.com
http://www.mail.com/?sr=signup
Make PC-to-Phone calls with Net2Phone.
Sign-up today at: http://www.net2phone.com/cgi-bin/link.cgi?121
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: assembler version of "set $cpsr = 0xd3"
2001-06-14 2:07 assembler version of "set $cpsr = 0xd3" Odd Lindahl
@ 2001-06-14 2:27 ` Richard Earnshaw
0 siblings, 0 replies; 2+ messages in thread
From: Richard Earnshaw @ 2001-06-14 2:27 UTC (permalink / raw)
To: Odd Lindahl; +Cc: gdb, Richard.Earnshaw
> 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.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2001-06-14 2:27 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-06-14 2:07 assembler version of "set $cpsr = 0xd3" Odd Lindahl
2001-06-14 2:27 ` Richard Earnshaw
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox