[PATCH 03/14] ARM: fixup_pv_table bug when CPU_ENDIAN_BE8

Will Deacon
2013-07-25T10:40:44Z

On Thu, Jul 25, 2013 at 11:25:41AM +0100, Russell King - ARM Linux wrote:
> On Thu, Jul 25, 2013 at 11:14:42AM +0100, Will Deacon wrote:
> > What's wrong with the following?
>
> Is this like a challenge to find the silly mistake?

Unfortunately, yes. I'm half asleep this morning...

> > @@ -581,8 +581,13 @@ __fixup_a_pv_table:
> > b 2f
> > 1: add r7, r3
> > ldrh ip, [r7, #2]
> > +#ifdef CONFIG_CPU_ENDIAN_BE8
> > + and ip, 0x008f
> > + orr ip, ip, r6, lsl #24

That was supposed to be lsl #8 (I blindly copied from Ben's correct ARM
hunk), but I think that it's still broken with that change.

> > +#else
> > and ip, 0x8f00
> > orr ip, r6 @ mask in offset bits 31-24
> > +#endif
> > strh ip, [r7, #2]
>
> Well, ip is being loaded/stored as 16bit, but you're putting r6 in to
> ip's bits 31-24, which are going to be ignored by the following strh.
>
> The comment "@ mask in offset bits 31-24" refers to the physical address
> bits here, which are already pre-shifted to bits 7-0 in r6.

Yup. It's bits 15-8 that make life slightly fiddly.

Will