Re: RFA/ARM: Switch mode when setting PC

Daniel Jacobowitz
2004-01-16T15:56:46Z

On Fri, Jan 16, 2004 at 02:59:58PM +0000, Richard Earnshaw wrote:
> Sure, but I think that is just more lossage that has been introduced after
> the ARMulator was released by ARM. Remember that the code that was
> released didn't have any Thumb support at all, that has all been added at
> a later date. So the fact that ARMul_SetPC doesn't correctly update the

OK, I didn't know that.

> Thumb bit is also a bug. There's no reason why it shouldn't (and, AFAICT,
> every reason why it should). Then it would be possible to execute an
> image where even the first instruction was in Thumb state.

It's already possible; you have to set the CPSR by hand, though. Am I
missing something?

> So, I still think that wrapper.c should be using ARMul_SetPC to update
> R15, which should then be correctly managing the Thumb bit in the CPSR.
> Note that ARMul_SetPC is only called from wrapper.c and armrdi.c, the two
> interfaces to the simulator. So there's no chance that fixing this will
> break normal free-running simulation.
>
> However, there are other changes (hacks) in the main loop that were
> introduced to overcome the fact that ARMul_SetPC wasn't being used, these
> may have to be tracked down and fixed.

I guess I just see this differently. The existing Linux ptrace
interface also predates Thumb, so it's not surprising that it just
writes what you give it into the PC register. But I can't see any
reason why I should change that. The remote protocol is a very
low-level protocol; the CPSR and PC are separate writeable registers,
and I would find it extremely surprising if the sequence:
read CPSR
read PC
write PC
read CPSR

could return two different CPSR values.

Here's what I would find even more surprising. The sequence:
read PC
write same value to PC

would suddenly switch me out of Thumb mode, since the bit is cleared in
the PC! This would break _all_ uses of the interface (either the sim
interface or the ptrace interface) in Thumb mode. Right now there are
only problems if you are deliberately trying to mode switch.

In short, I think writing the PC should not change the CPSR, and if the
client wants to change the mode they should do it explicitly.

--
Daniel Jacobowitz
MontaVista Software Debian GNU/Linux Developer