Mirror of the gdb mailing list
 help / color / mirror / Atom feed
* 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