Re: coccinelle and bitmask arithmetic

Russell King - ARM Linux
2013-01-30T11:36:43Z

On Wed, Jan 30, 2013 at 12:21:21PM +0100, Julia Lawall wrote:
>
>
> On Wed, 30 Jan 2013, Russell King - ARM Linux wrote:
>
> > On Wed, Jan 30, 2013 at 09:21:28AM +0100, walter harms wrote:
> > > Great hit Joe :)
> > >
> > > Sometimes i am really surprised what code can be found
> > > in the kernal and it is still working.
> > > Having no clue of the code i suspect somebody tries to
> > > check is mask outside the range it should read
> > > PHYS_OFFSET |( SZ_64M - 1)
> > > maybe someone should tell them that
> > > 1+1=10 while 1|1=1
> > > It does not seem to matter here (or ... ?)
> >
> > This PCI host is only used on one platform (ARMCORE).
> >
> > For this, PHYS_OFFSET will be a value with only the top few bits of a
> > 32-bit word set (such as 0xc0000000) - it's certainly not going to have
> > any bits set below bit 26 on the platform this driver gets used on.
> > "SZ_64M - 1" is the size of the window that RAM appears.
> >
> > So, _either_ logical OR or addition works.
> >
> > If we _did_ end up with a PHYS_OFFSET with bits less than bit 26 set
> > here, we'd have bigger problems - because the base of RAM in PCI space
> > will not correspond with PHYS_OFFSET and all the DMA mapping stuff breaks.
>
> The "problem" is that the computation is done inconsistently within the
> same file. Sometimes with + and sometimes with |.

And I say that is not a problem; if it _does_ become a problem, there are
bigger problems that would also need solving, which given a multi-subarch
kernel become a lot lot harder.

Sure, we can just change them to all be a bitwise OR (sorry, not logical)
but that's really only half the story.