diff mbox

[v2] ARM: fix vdsomunge not to depend on glibc specific byteswap.h

Message ID B69CCAC6-FB47-4B2B-95F9-15F1BA4AD381@goldelico.com (mailing list archive)
State New, archived
Headers show

Commit Message

H. Nikolaus Schaller Oct. 3, 2015, 8:46 p.m. UTC
If the host toolchain is not glibc based then the arm kernel build
fails with

 HOSTCC  arch/arm/vdso/vdsomunge
 arch/arm/vdso/vdsomunge.c:48:22: fatal error: byteswap.h: No such file or directory

Observed: with omap2plus_defconfig and compile on Mac OS X with arm ELF
cross-compiler.

Reason: byteswap.h is a glibc only header.

Solution: replace by private byte-swapping macros (taken from
arch/mips/boot/elf2ecoff.c)

Tested to compile on Mac OS X 10.9.5 host.

Signed-off-by: H. Nikolaus Schaller <hns@goldelico.com>
---
arch/arm/vdso/vdsomunge.c | 19 +++++++++++++++----
1 file changed, 15 insertions(+), 4 deletions(-)

Comments

H. Nikolaus Schaller Oct. 14, 2015, 12:47 p.m. UTC | #1
ping.

Am 03.10.2015 um 22:46 schrieb H. Nikolaus Schaller <hns@goldelico.com>:

> If the host toolchain is not glibc based then the arm kernel build
> fails with
> 
> HOSTCC  arch/arm/vdso/vdsomunge
> arch/arm/vdso/vdsomunge.c:48:22: fatal error: byteswap.h: No such file or directory
> 
> Observed: with omap2plus_defconfig and compile on Mac OS X with arm ELF
> cross-compiler.
> 
> Reason: byteswap.h is a glibc only header.
> 
> Solution: replace by private byte-swapping macros (taken from
> arch/mips/boot/elf2ecoff.c)
> 
> Tested to compile on Mac OS X 10.9.5 host.
> 
> Signed-off-by: H. Nikolaus Schaller <hns@goldelico.com>
> ---
> arch/arm/vdso/vdsomunge.c | 19 +++++++++++++++----
> 1 file changed, 15 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/arm/vdso/vdsomunge.c b/arch/arm/vdso/vdsomunge.c
> index aedec81..27a9a0b 100644
> --- a/arch/arm/vdso/vdsomunge.c
> +++ b/arch/arm/vdso/vdsomunge.c
> @@ -45,7 +45,18 @@
> * it does.
> */
> 
> -#include <byteswap.h>
> +#define swab16(x) \
> +	((unsigned short)( \
> +		(((unsigned short)(x) & (unsigned short)0x00ffU) << 8) | \
> +		(((unsigned short)(x) & (unsigned short)0xff00U) >> 8) ))
> +
> +#define swab32(x) \
> +	((unsigned int)( \
> +		(((unsigned int)(x) & (unsigned int)0x000000ffUL) << 24) | \
> +		(((unsigned int)(x) & (unsigned int)0x0000ff00UL) <<  8) | \
> +		(((unsigned int)(x) & (unsigned int)0x00ff0000UL) >>  8) | \
> +		(((unsigned int)(x) & (unsigned int)0xff000000UL) >> 24) ))
> +
> #include <elf.h>
> #include <errno.h>
> #include <fcntl.h>
> @@ -104,17 +115,17 @@ static void cleanup(void)
> 
> static Elf32_Word read_elf_word(Elf32_Word word, bool swap)
> {
> -	return swap ? bswap_32(word) : word;
> +	return swap ? swab32(word) : word;
> }
> 
> static Elf32_Half read_elf_half(Elf32_Half half, bool swap)
> {
> -	return swap ? bswap_16(half) : half;
> +	return swap ? swab16(half) : half;
> }
> 
> static void write_elf_word(Elf32_Word val, Elf32_Word *dst, bool swap)
> {
> -	*dst = swap ? bswap_32(val) : val;
> +	*dst = swap ? swab32(val) : val;
> }
> 
> int main(int argc, char **argv)
> -- 
> 2.5.1
>
Nathan Lynch Oct. 14, 2015, 2:16 p.m. UTC | #2
On 10/14/2015 07:47 AM, H. Nikolaus Schaller wrote:
>> diff --git a/arch/arm/vdso/vdsomunge.c b/arch/arm/vdso/vdsomunge.c
>> index aedec81..27a9a0b 100644
>> --- a/arch/arm/vdso/vdsomunge.c
>> +++ b/arch/arm/vdso/vdsomunge.c
>> @@ -45,7 +45,18 @@
>> * it does.
>> */
>>
>> -#include <byteswap.h>
>> +#define swab16(x) \
>> +	((unsigned short)( \
>> +		(((unsigned short)(x) & (unsigned short)0x00ffU) << 8) | \
>> +		(((unsigned short)(x) & (unsigned short)0xff00U) >> 8) ))
>> +
>> +#define swab32(x) \
>> +	((unsigned int)( \
>> +		(((unsigned int)(x) & (unsigned int)0x000000ffUL) << 24) | \
>> +		(((unsigned int)(x) & (unsigned int)0x0000ff00UL) <<  8) | \
>> +		(((unsigned int)(x) & (unsigned int)0x00ff0000UL) >>  8) | \
>> +		(((unsigned int)(x) & (unsigned int)0xff000000UL) >> 24) ))
>> +
>> #include <elf.h>
>> #include <errno.h>
>> #include <fcntl.h>
>> @@ -104,17 +115,17 @@ static void cleanup(void)
>>
>> static Elf32_Word read_elf_word(Elf32_Word word, bool swap)
>> {
>> -	return swap ? bswap_32(word) : word;
>> +	return swap ? swab32(word) : word;
>> }
>>
>> static Elf32_Half read_elf_half(Elf32_Half half, bool swap)
>> {
>> -	return swap ? bswap_16(half) : half;
>> +	return swap ? swab16(half) : half;
>> }
>>
>> static void write_elf_word(Elf32_Word val, Elf32_Word *dst, bool swap)
>> {
>> -	*dst = swap ? bswap_32(val) : val;
>> +	*dst = swap ? swab32(val) : val;
>> }
> ping.

Sorry for the delay.

This is okay but I'd prefer the swab macros to be below the #include
lines, and it would be easier for me to deal with a patch that isn't
whitespace-damaged.
H. Nikolaus Schaller Oct. 15, 2015, 5:52 a.m. UTC | #3
Am 14.10.2015 um 16:16 schrieb Nathan Lynch <nathan_lynch@mentor.com>:

> On 10/14/2015 07:47 AM, H. Nikolaus Schaller wrote:
>>> diff --git a/arch/arm/vdso/vdsomunge.c b/arch/arm/vdso/vdsomunge.c
>>> index aedec81..27a9a0b 100644
>>> --- a/arch/arm/vdso/vdsomunge.c
>>> +++ b/arch/arm/vdso/vdsomunge.c
>>> @@ -45,7 +45,18 @@
>>> * it does.
>>> */
>>> 
>>> -#include <byteswap.h>
>>> +#define swab16(x) \
>>> +	((unsigned short)( \
>>> +		(((unsigned short)(x) & (unsigned short)0x00ffU) << 8) | \
>>> +		(((unsigned short)(x) & (unsigned short)0xff00U) >> 8) ))
>>> +
>>> +#define swab32(x) \
>>> +	((unsigned int)( \
>>> +		(((unsigned int)(x) & (unsigned int)0x000000ffUL) << 24) | \
>>> +		(((unsigned int)(x) & (unsigned int)0x0000ff00UL) <<  8) | \
>>> +		(((unsigned int)(x) & (unsigned int)0x00ff0000UL) >>  8) | \
>>> +		(((unsigned int)(x) & (unsigned int)0xff000000UL) >> 24) ))
>>> +
>>> #include <elf.h>
>>> #include <errno.h>
>>> #include <fcntl.h>
>>> @@ -104,17 +115,17 @@ static void cleanup(void)
>>> 
>>> static Elf32_Word read_elf_word(Elf32_Word word, bool swap)
>>> {
>>> -	return swap ? bswap_32(word) : word;
>>> +	return swap ? swab32(word) : word;
>>> }
>>> 
>>> static Elf32_Half read_elf_half(Elf32_Half half, bool swap)
>>> {
>>> -	return swap ? bswap_16(half) : half;
>>> +	return swap ? swab16(half) : half;
>>> }
>>> 
>>> static void write_elf_word(Elf32_Word val, Elf32_Word *dst, bool swap)
>>> {
>>> -	*dst = swap ? bswap_32(val) : val;
>>> +	*dst = swap ? swab32(val) : val;
>>> }
>> ping.
> 
> Sorry for the delay.
> 
> This is okay but I'd prefer the swab macros to be below the #include
> lines,

Ok.

> and it would be easier for me to deal with a patch that isn't
> whitespace-damaged.

You mean:

ERROR: space prohibited before that close parenthesis ')'
#46: FILE: arch/arm/vdso/vdsomunge.c:64:
+		(((unsigned short)(x) & (unsigned short)0xff00U) >> 8) ))

ERROR: space prohibited before that close parenthesis ')'
#53: FILE: arch/arm/vdso/vdsomunge.c:71:
+		(((unsigned int)(x) & (unsigned int)0xff000000UL) >> 24) ))

Well, I had copied that verbatim from arch/mips/boot/elf2ecoff.c and
thought that it is better readable, but it is easy to fix.

V3 is coming.

BR and thanks,
Nikolaus
Russell King - ARM Linux Oct. 15, 2015, 4:37 p.m. UTC | #4
On Thu, Oct 15, 2015 at 07:52:38AM +0200, H. Nikolaus Schaller wrote:
> ERROR: space prohibited before that close parenthesis ')'
> #46: FILE: arch/arm/vdso/vdsomunge.c:64:
> +		(((unsigned short)(x) & (unsigned short)0xff00U) >> 8) ))

I have a pet hatred of too many parens.  I also have a hatred of idiotic
casts.  What about changing the above to one of:

		(((x) & 0xff00) >> 8)
		(((x) >> 8) & 0xff)

> 
> ERROR: space prohibited before that close parenthesis ')'
> #53: FILE: arch/arm/vdso/vdsomunge.c:71:
> +		(((unsigned int)(x) & (unsigned int)0xff000000UL) >> 24) ))

and one of:

		(((x) & 0xff000000) >> 24)
		(((x) >> 24) & 0xff)

?
H. Nikolaus Schaller Oct. 15, 2015, 4:52 p.m. UTC | #5
Am 15.10.2015 um 18:37 schrieb Russell King - ARM Linux <linux@arm.linux.org.uk>:

> On Thu, Oct 15, 2015 at 07:52:38AM +0200, H. Nikolaus Schaller wrote:
>> ERROR: space prohibited before that close parenthesis ')'
>> #46: FILE: arch/arm/vdso/vdsomunge.c:64:
>> +		(((unsigned short)(x) & (unsigned short)0xff00U) >> 8) ))
> 
> I have a pet hatred of too many parens.  I also have a hatred of idiotic
> casts.  What about changing the above to one of:
> 
> 		(((x) & 0xff00) >> 8)
> 		(((x) >> 8) & 0xff)
> 
>> 
>> ERROR: space prohibited before that close parenthesis ')'
>> #53: FILE: arch/arm/vdso/vdsomunge.c:71:
>> +		(((unsigned int)(x) & (unsigned int)0xff000000UL) >> 24) ))
> 
> and one of:
> 
> 		(((x) & 0xff000000) >> 24)
> 		(((x) >> 24) & 0xff)
> 
> ?

Well, the semantics is sometimes the same but I think readability goes down
because the macro becomes quite un-symmetric and for >> 8 you should
better be sure that values are unsigned if combining with | operator.

Of course it is questionable why the constants (with U and UL modifiers)
are casted.

The full macro (as copied verbatim from existing arch/mips/boot/elf2ecoff.c) is:

+#define swab16(x) \
+	((unsigned short)( \
+		(((unsigned short)(x) & (unsigned short)0x00ffU) << 8) | \
+		(((unsigned short)(x) & (unsigned short)0xff00U) >> 8)))
+
+#define swab32(x) \
+	((unsigned int)( \
+		(((unsigned int)(x) & (unsigned int)0x000000ffUL) << 24) | \
+		(((unsigned int)(x) & (unsigned int)0x0000ff00UL) <<  8) | \
+		(((unsigned int)(x) & (unsigned int)0x00ff0000UL) >>  8) | \
+		(((unsigned int)(x) & (unsigned int)0xff000000UL) >> 24)))
+

I have already submitted a V3 of this patch, so please comment that.

A question is why this is not generally available for all HOSTCC based tools
so that we could simply include some header. But since that is no kernel
code but a tool, I think it is not really necessary to put significant efforts
into this piece of code.

This was probably the intention of the original code to simply include
byteswap.h - then you don't even see how complex the macros are -
but it is not a standard header.

BR and thanks,
Nikolaus Schaller
Nathan Lynch Oct. 15, 2015, 5:07 p.m. UTC | #6
On 10/15/2015 12:52 AM, H. Nikolaus Schaller wrote:
> Am 14.10.2015 um 16:16 schrieb Nathan Lynch <nathan_lynch@mentor.com>:
>> and it would be easier for me to deal with a patch that isn't
>> whitespace-damaged.
> 
> You mean:
> 
> ERROR: space prohibited before that close parenthesis ')'
> #46: FILE: arch/arm/vdso/vdsomunge.c:64:
> +		(((unsigned short)(x) & (unsigned short)0xff00U) >> 8) ))
> 
> ERROR: space prohibited before that close parenthesis ')'
> #53: FILE: arch/arm/vdso/vdsomunge.c:71:
> +		(((unsigned int)(x) & (unsigned int)0xff000000UL) >> 24) ))
> 
> Well, I had copied that verbatim from arch/mips/boot/elf2ecoff.c and
> thought that it is better readable, but it is easy to fix.

That's not what I was referring to, but it is fine to fix that too.

What I meant was that the first column of the patch body is corrupted.
Your v2 has hunks like this (bad):

static Elf32_Word read_elf_word(Elf32_Word word, bool swap)
{
-	return swap ? bswap_32(word) : word;
+	return swap ? swab32(word) : word;
}


Your v3 has this (good):

 static void write_elf_word(Elf32_Word val, Elf32_Word *dst, bool swap)
 {
-	*dst = swap ? bswap_32(val) : val;
+	*dst = swap ? swab32(val) : val;
 }
H. Nikolaus Schaller Oct. 15, 2015, 5:16 p.m. UTC | #7
Am 15.10.2015 um 19:07 schrieb Nathan Lynch <Nathan_Lynch@mentor.com>:

> On 10/15/2015 12:52 AM, H. Nikolaus Schaller wrote:
>> Am 14.10.2015 um 16:16 schrieb Nathan Lynch <nathan_lynch@mentor.com>:
>>> and it would be easier for me to deal with a patch that isn't
>>> whitespace-damaged.
>> 
>> You mean:
>> 
>> ERROR: space prohibited before that close parenthesis ')'
>> #46: FILE: arch/arm/vdso/vdsomunge.c:64:
>> +		(((unsigned short)(x) & (unsigned short)0xff00U) >> 8) ))
>> 
>> ERROR: space prohibited before that close parenthesis ')'
>> #53: FILE: arch/arm/vdso/vdsomunge.c:71:
>> +		(((unsigned int)(x) & (unsigned int)0xff000000UL) >> 24) ))
>> 
>> Well, I had copied that verbatim from arch/mips/boot/elf2ecoff.c and
>> thought that it is better readable, but it is easy to fix.
> 
> That's not what I was referring to, but it is fine to fix that too.
> 
> What I meant was that the first column of the patch body is corrupted.
> Your v2 has hunks like this (bad):
> 
> static Elf32_Word read_elf_word(Elf32_Word word, bool swap)
> {
> -	return swap ? bswap_32(word) : word;
> +	return swap ? swab32(word) : word;
> }
> 
> 
> Your v3 has this (good):
> 
> static void write_elf_word(Elf32_Word val, Elf32_Word *dst, bool swap)
> {
> -	*dst = swap ? bswap_32(val) : val;
> +	*dst = swap ? swab32(val) : val;
> }

Does this mean it is ok now in V3 in all cases? I have switched my patch editor
tool from indirect git imap-send to git send-email (which appears to be more
compatible).

BR and thanks,
Nikolaus Schaller
Nathan Lynch Oct. 15, 2015, 5:23 p.m. UTC | #8
On 10/15/2015 12:16 PM, H. Nikolaus Schaller wrote:
> Does this mean it is ok now in V3 in all cases? I have switched my patch editor
> tool from indirect git imap-send to git send-email (which appears to be more
> compatible).

v3 applied without issue, so yes, in that respect it is fine.
diff mbox

Patch

diff --git a/arch/arm/vdso/vdsomunge.c b/arch/arm/vdso/vdsomunge.c
index aedec81..27a9a0b 100644
--- a/arch/arm/vdso/vdsomunge.c
+++ b/arch/arm/vdso/vdsomunge.c
@@ -45,7 +45,18 @@ 
 * it does.
 */

-#include <byteswap.h>
+#define swab16(x) \
+	((unsigned short)( \
+		(((unsigned short)(x) & (unsigned short)0x00ffU) << 8) | \
+		(((unsigned short)(x) & (unsigned short)0xff00U) >> 8) ))
+
+#define swab32(x) \
+	((unsigned int)( \
+		(((unsigned int)(x) & (unsigned int)0x000000ffUL) << 24) | \
+		(((unsigned int)(x) & (unsigned int)0x0000ff00UL) <<  8) | \
+		(((unsigned int)(x) & (unsigned int)0x00ff0000UL) >>  8) | \
+		(((unsigned int)(x) & (unsigned int)0xff000000UL) >> 24) ))
+
#include <elf.h>
#include <errno.h>
#include <fcntl.h>
@@ -104,17 +115,17 @@  static void cleanup(void)

static Elf32_Word read_elf_word(Elf32_Word word, bool swap)
{
-	return swap ? bswap_32(word) : word;
+	return swap ? swab32(word) : word;
}

static Elf32_Half read_elf_half(Elf32_Half half, bool swap)
{
-	return swap ? bswap_16(half) : half;
+	return swap ? swab16(half) : half;
}

static void write_elf_word(Elf32_Word val, Elf32_Word *dst, bool swap)
{
-	*dst = swap ? bswap_32(val) : val;
+	*dst = swap ? swab32(val) : val;
}

int main(int argc, char **argv)