2011-04-11 07:35:08

by Xuetao Guan

[permalink] [raw]
Subject: about __BITS_PER_LONG

Hi, Arnd:

When using asm-generic/bitsperlong.h, I think that __BITS_PER_LONG could be the
same as BITS_PER_LONG if-not-defined. And this could avoid the duplicated macros
in almost all architectures.

Regards.

Guan Xuetao

---
diff --git a/include/asm-generic/bitsperlong.h b/include/asm-generic/bitsperlong.h
index 4ae54e0..31d032a 100644
--- a/include/asm-generic/bitsperlong.h
+++ b/include/asm-generic/bitsperlong.h
@@ -9,7 +9,11 @@
* to decide it, but rather check a compiler provided macro.
*/
#ifndef __BITS_PER_LONG
-#define __BITS_PER_LONG 32
+# ifdef CONFIG_64BIT
+# define __BITS_PER_LONG 64
+# else
+# define __BITS_PER_LONG 32
+# endif /* CONFIG_64BIT */
#endif

#ifdef __KERNEL__


2011-04-11 15:25:12

by Arnd Bergmann

[permalink] [raw]
Subject: Re: about __BITS_PER_LONG

On Monday 11 April 2011, Guan Xuetao wrote:
> --- a/include/asm-generic/bitsperlong.h
> +++ b/include/asm-generic/bitsperlong.h
> @@ -9,7 +9,11 @@
> * to decide it, but rather check a compiler provided macro.
> */
> #ifndef __BITS_PER_LONG
> -#define __BITS_PER_LONG 32
> +# ifdef CONFIG_64BIT
> +# define __BITS_PER_LONG 64
> +# else
> +# define __BITS_PER_LONG 32
> +# endif /* CONFIG_64BIT */
> #endif
>

Unfortunately, this does not work, because the __BITS_PER_LONG definition is meant
for user space. You have to make this depend on a preprocessor macro that
is provided by the compiler based on the command line switches (e.g. -m64) that
a use could pass to the compiler.

In user space, the CONFIG_* symbols are meaningless.

Arnd

2011-04-12 01:24:12

by Xuetao Guan

[permalink] [raw]
Subject: RE: about __BITS_PER_LONG



> -----Original Message-----
> From: Arnd Bergmann [mailto:[email protected]]
> Sent: Monday, April 11, 2011 11:25 PM
> To: Guan Xuetao
> Cc: [email protected]; [email protected]
> Subject: Re: about __BITS_PER_LONG
>
> On Monday 11 April 2011, Guan Xuetao wrote:
> > --- a/include/asm-generic/bitsperlong.h
> > +++ b/include/asm-generic/bitsperlong.h
> > @@ -9,7 +9,11 @@
> > * to decide it, but rather check a compiler provided macro.
> > */
> > #ifndef __BITS_PER_LONG
> > -#define __BITS_PER_LONG 32
> > +# ifdef CONFIG_64BIT
> > +# define __BITS_PER_LONG 64
> > +# else
> > +# define __BITS_PER_LONG 32
> > +# endif /* CONFIG_64BIT */
> > #endif
> >
>
> Unfortunately, this does not work, because the __BITS_PER_LONG definition is meant
> for user space. You have to make this depend on a preprocessor macro that
> is provided by the compiler based on the command line switches (e.g. -m64) that
> a use could pass to the compiler.
However, there is no conflict between the definition depending on a preprocessor macro and
the definition of asm-generic header.

>
> In user space, the CONFIG_* symbols are meaningless.
Yes, that's the problem. I have not notice it before.
So, only one value can be reserved in such circumstances.

>
> Arnd

Thanks & Regards.

Guan Xuetao