Message ID | 20170624153842.61064-1-luc.vanoostenryck@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Sat, Jun 24, 2017 at 05:38:42PM +0200, Luc Van Oostenryck wrote: > ARM depends on the macros '__ARMEL__' & '__ARMEB__' being defined > or not to correctly select or define endian-specific macros, > structures or pieces of code. > > These macros are predefined by the compiler but sparse knows > nothing about them and thus may pre-process files differently > from what gcc would. > > Fix this by passing '-D__ARMEL__' or '-D__ARMEB__' to sparse, > depending of the endianness of the kernel, like defined by GCC. > > Note: In most case it won't change anything since most ARMs use > little-endian (but an allyesconfig would use big-endian!). I wonder if that's a good thing - as this changes the endian conversion macros and ifdefs around bitfield declarations, it means that we're not testing the "popular" paths with an allyesconfig sparse - but then again, I think allyesconfig with sparse is a very bad idea, it needs to be targetted to the area being worked in. > CC: Russell King <linux@armlinux.org.uk> > CC: linux-arm-kernel@lists.infradead.org > Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com> > --- > arch/arm/Makefile | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/arch/arm/Makefile b/arch/arm/Makefile > index 65f4e2a4e..0fca46d7f 100644 > --- a/arch/arm/Makefile > +++ b/arch/arm/Makefile > @@ -44,10 +44,12 @@ endif > > ifeq ($(CONFIG_CPU_BIG_ENDIAN),y) > KBUILD_CPPFLAGS += -mbig-endian > +CHECKFLAGS += -D__ARMEB__ > AS += -EB > LD += -EB > else > KBUILD_CPPFLAGS += -mlittle-endian > +CHECKFLAGS += -D__ARMEL__ > AS += -EL > LD += -EL > endif > -- > 2.13.0 >
On Mon, Jun 26, 2017 at 09:53:11AM +0100, Russell King - ARM Linux wrote: > On Sat, Jun 24, 2017 at 05:38:42PM +0200, Luc Van Oostenryck wrote: > > ARM depends on the macros '__ARMEL__' & '__ARMEB__' being defined > > or not to correctly select or define endian-specific macros, > > structures or pieces of code. > > > > These macros are predefined by the compiler but sparse knows > > nothing about them and thus may pre-process files differently > > from what gcc would. > > > > Fix this by passing '-D__ARMEL__' or '-D__ARMEB__' to sparse, > > depending of the endianness of the kernel, like defined by GCC. > > > > Note: In most case it won't change anything since most ARMs use > > little-endian (but an allyesconfig would use big-endian!). > > I wonder if that's a good thing - as this changes the endian conversion > macros and ifdefs around bitfield declarations, it means that we're not > testing the "popular" paths with an allyesconfig sparse - but then again, > I think allyesconfig with sparse is a very bad idea, it needs to be > targetted to the area being worked in. The problem is that on any CONFIG_CPU_BIG_ENDIAN config, sparse will process the wrong code after a '#if[n]def __ARMEB__'. Same, of course with a little-endian config and '#if[n]def __ARMEL__'. Since only two files test after __ARMEL__ : - crypto/sha1-armv4-large.S - crypto/sha512-core.S most of the code are checked correctly for a little-endian config. The same is not true for a big endian config since all the others tests are made against __ARMEB__. In short no big-endian config have never been sparse-checked for endiannness problems on ARM. Worse, they are wrongly checked. -- Luc Van Oostenryck
diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 65f4e2a4e..0fca46d7f 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -44,10 +44,12 @@ endif ifeq ($(CONFIG_CPU_BIG_ENDIAN),y) KBUILD_CPPFLAGS += -mbig-endian +CHECKFLAGS += -D__ARMEB__ AS += -EB LD += -EB else KBUILD_CPPFLAGS += -mlittle-endian +CHECKFLAGS += -D__ARMEL__ AS += -EL LD += -EL endif
ARM depends on the macros '__ARMEL__' & '__ARMEB__' being defined or not to correctly select or define endian-specific macros, structures or pieces of code. These macros are predefined by the compiler but sparse knows nothing about them and thus may pre-process files differently from what gcc would. Fix this by passing '-D__ARMEL__' or '-D__ARMEB__' to sparse, depending of the endianness of the kernel, like defined by GCC. Note: In most case it won't change anything since most ARMs use little-endian (but an allyesconfig would use big-endian!). CC: Russell King <linux@armlinux.org.uk> CC: linux-arm-kernel@lists.infradead.org Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com> --- arch/arm/Makefile | 2 ++ 1 file changed, 2 insertions(+)