[U-Boot] instruction "xchgb" for x86_64

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.
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@chromium.orgmailto:sjg@chromium.org> Reviewed-by: Bin Meng bmeng.cn@gmail.commailto:bmeng.cn@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?
Thanks!
Best regards James Wang Jinmin
Rohde & Schwarz Asia Pte Ltd 9 Changi Business Park Vista, #01-01, Singapore 486 041 DID: 65-6307 0374 Fax: 65-6307 0300 [ONE logo 2018_email]
Privileged/Confidential information may be contained in this message. If you are not the intended recipient, Please notify the sender immediately and you must not use the message for any purpose nor disclose it to anyone. http://www.rohde-schwarz.com/sg P Please consider the environment before printing this email. http://www.rohde-schwarz.com.sg/

Hi James,
On Wed, Aug 14, 2019 at 1:08 PM James Wang James.Wang@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@chromium.org sjg@chromium.org>*
*Reviewed-by: Bin Meng bmeng.cn@gmail.com bmeng.cn@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?
Regards, Bin

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@gmail.com wrote:
Hi James,
On Wed, Aug 14, 2019 at 1:08 PM James Wang James.Wang@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@chromium.org>
Reviewed-by: Bin Meng bmeng.cn@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
participants (3)
-
Bin Meng
-
James Wang
-
Simon Glass