[U-Boot] instruction "xchgb" for x86_64

Simon Glass sjg at chromium.org
Wed Aug 14 16:13:33 UTC 2019


Hi,

(James please can you use plain-text email for the mailing list?)

On Wed, 14 Aug 2019 at 01:35, Bin Meng <bmeng.cn at gmail.com> wrote:
>
> Hi James,
>
> On Wed, Aug 14, 2019 at 1:08 PM James Wang <James.Wang at rohde-schwarz.com> wrote:
>>
>> Hi Simon,
>>
>>
>>
>> This is James and am working on u-boot to bring back MinGW tool chain for cross compiling host tools for Windows on Linux. After complete the code, I plan to generate a patch for community review.
>
>
> Do you mean cross compiling U-Boot's mkimage tool for Windows on Linux using gcc-mingw-w64? Do you want to support building U-Boot on Windows as well?
>
>>
>>
>>
>> During work, I face an compiling error in file <arch/x86/include/asm/byteorder.h> with macro CONFIG_IS_ENABLED. After some background study, seems this macro should not be available when compiling host tools.
>>
>>
>>
>> After check history, it’s from 909780506773a9b09ae88cb267dbfa6a8d0caa7b on 2017-01-16 22:04:04, Below is the log message
>>
>>
>>
>>    x86: Fix up byteorder.h for x86_64
>>
>>
>>
>>     Remove the very old x86 code and add support for 64-bit.
>>
>>
>>
>>     Signed-off-by: Simon Glass <sjg at chromium.org>
>>
>> Reviewed-by: Bin Meng bmeng.cn at gmail.com
>>
>>
>>
>> Below are the relevant changes.
>>
>>
>>
>> +#define _constant_swab16(x) ((__u16)(                                             \
>>
>> +      (((__u16)(x) & (__u16)0x00ffU) << 8) |                            \
>>
>> +      (((__u16)(x) & (__u16)0xff00U) >> 8)))
>>
>> +
>>
>> static __inline__ __u16 ___arch__swab16(__u16 x)
>>
>> {
>>
>> +#if CONFIG_IS_ENABLED(X86_64)
>>
>> +      return _constant_swab16(x);
>>
>> +#else
>>
>>        __asm__("xchgb %b0,%h0"                   /* swap bytes                */ \
>>
>>                    : "=q" (x) \
>>
>>                    :  "0" (x)); \
>>
>>                    return x;
>>
>> +#endif
>>
>> }
>>
>>
>>
>> I am not familiar with x86 instructions and not understand the purpose of this change, is it because instruction “xchgb” not available on 64-bit architecture or something else?
>
>
> I can't remember the details of why Simon changed this. xchgb is available in 64-bit. We probably need revert this change, Simon?

For chromebook_link64 I get:

output: '/usr/local/google/home/sjg/cosarm/src/third_party/u-boot/files/arch/x86/include/asm/byteorder.h:
Assembler messages:
/usr/local/google/home/sjg/cosarm/src/third_party/u-boot/files/arch/x86/include/asm/byteorder.h:22:
Error: register type mismatch for `xchg'
make[2]: *** [/usr/local/google/home/sjg/cosarm/src/third_party/u-boot/files/scripts/Makefile.build:278:
net/tftp.o] Error 1
make[2]: *** Waiting for unfinished jobs....
/usr/local/google/home/sjg/cosarm/src/third_party/u-boot/files/net/net.c:
In function 'net_process_received_packet':
/usr/local/google/home/sjg/cosarm/src/third_party/u-boot/files/net/net.c:1324:1:
error: extended registers have no high halves
 }
 ^
/usr/local/google/home/sjg/cosarm/src/third_party/u-boot/files/arch/x86/include/asm/byteorder.h:
Assembler messages:
/usr/local/google/home/sjg/cosarm/src/third_party/u-boot/files/arch/x86/include/asm/byteorder.h:22:
Error: register type mismatch for `xchg'
/usr/local/google/home/sjg/cosarm/src/third_party/u-boot/files/arch/x86/include/asm/byteorder.h:22:
Error: register type mismatch for `xchg'
/usr/local/google/home/sjg/cosarm/src/third_party/u-boot/files/arch/x86/include/asm/byteorder.h:22:
Error: register type mismatch for `xchg'
make[2]: *** [/usr/local/google/home/sjg/cosarm/src/third_party/u-boot/files/scripts/Makefile.build:278:
net/net.o] Error 1
make[1]: *** [/usr/local/google/home/sjg/cosarm/src/third_party/u-boot/files/Makefile:1588:
net] Error 2
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:148: sub-make] Error 2

Perhaps there is another way to fix this?

Regards,
Simon


More information about the U-Boot mailing list