FDT include file problems
Hello,
on some systems (for example Fedora Core 4) U-Boot builds with the following wanrings only:
...
In file included from /home/wd/git/u-boot/include/libfdt_env.h:33,
from fdt.c:51:
/usr/include/asm/byteorder.h:6:2: warning: #warning using private kernel header; include <endian.h> instead!
In file included from /home/wd/git/u-boot/include/libfdt_env.h:33,
from fdt_ro.c:51:
/usr/include/asm/byteorder.h:6:2: warning: #warning using private kernel header; include <endian.h> instead!
In file included from /home/wd/git/u-boot/include/libfdt_env.h:33,
from fdt_rw.c:51:
/usr/include/asm/byteorder.h:6:2: warning: #warning using private kernel header; include <endian.h> instead!
In file included from /home/wd/git/u-boot/include/libfdt_env.h:33,
from fdt_strerror.c:51:
/usr/include/asm/byteorder.h:6:2: warning: #warning using private kernel header; include <endian.h> instead!
In file included from /home/wd/git/u-boot/include/libfdt_env.h:33,
from fdt_wip.c:51:/usr/include/asm/byteorder.h:6:2: warning: #warning using private kernel header; include <endian.h> instead!
...
The suggested change works in image.h, for example like this:
=======================================================================
include/image.h +11 -9
@@ -33,27 +33,29 @@#ifndef __IMAGE_H__#define __IMAGE_H__ -#include <asm/byteorder.h> -#include <command.h> - -#ifndef USE_HOSTCC -#include <lmb.h> -#include <linux/string.h> -#include <asm/u-boot.h> - -#else +#if USE_HOSTCC +#include <endian.h> /* new uImage format support enabled on host */ #define CONFIG_FIT 1#define CONFIG_OF_LIBFDT 1#define CONFIG_FIT_VERBOSE 1/* enable fit_format_{error,warning}() */ +#else + +#include <lmb.h> +#include <linux/string.h> +#include <asm/u-boot.h> +#include <asm/byteorder.h> +#endif /* USE_HOSTCC */ #if defined(CONFIG_FIT ) && !defined(CONFIG_OF_LIBFDT )#error "CONFIG_OF_LIBFDT not enabled, required by CONFIG_FIT!"#endif +#include <command.h> +#if defined(CONFIG_FIT )#include <fdt.h> #include <libfdt.h>
=======================================================================
However, for the FDT code this doesn't help, as we then will get
unresolved references for fdt32_to_cpu(), cpu_to_fdt32(),fdt64_to_cpu() and cpu_to_fdt64().
The 32 bit accesses couldbe worked around by using htonl() resp. ntohl(), but I don't know a good way for the 64 bit cases.
Is there a clean and portable way to do this?
Best regards,
Wolfgang Denk
Signature · 5 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de There you go man, Keep as cool as you can. It riles them to believe that you perceive the web they weave. Keep on being free!
Quoted 9 lines · Wolfgang Denk
Hello,
on some systems (for example Fedora Core 4) U-Boot builds with the following wanrings only:
...
In file included from/home/wd/git/u-boot/include/libfdt_env.h:33,from fdt.c:51:
/usr/include/asm/byteorder.h:6:2: warning: #warning using private kernel header; include <endian.h> instead!
[snip]
Quoted 4 lines
However, for the FDT code this doesn't help, as we then will get
unresolved references forfdt32_to_cpu(),cpu_to_fdt32(),fdt64_to_cpu()andcpu_to_fdt64().
Quoted 8 lines
The 32 bit accesses couldbe worked around by using
htonl()resp.ntohl(), but I don't know a good way for the 64 bit cases.Is there a clean and portable way to do this?
Best regards,
Wolfgang Denk
Hi Wolfgang,
Does this work better?
Best regards,
gvb
Dear Jerry Van Baren,
Quoted 5 lines · In message <[email protected]> you wrote:
Quoted 5 lines
...
In file included from/home/wd/git/u-boot/include/libfdt_env.h:33,from fdt.c:51:
/usr/include/asm/byteorder.h:6:2: warning: #warning using private kernel header; include <endian.h> instead!
...
Quoted 1 line
Does this work better?
Not really:
Quoted 7 lines
From
0d33fb368acac6f88c0940ff2d1c77856900abcdMon Sep 17 00:00:00 2001
From: Gerald Van Baren <[email protected]>
Date: Sun, 19 Oct 2008 22:50:07 -0400
Subject: [PATCH] libfdt: Useendian.hinstead ofasm/byteorder.hUsing
asm/byteorder.hdirectly is strongly discouraged since it is a private kernel header.
Hm... but you still use it?
include/libfdt_env.h line 33
Quoted 11 lines
Signed-off-by Gerald Van Baren <[email protected]>--- include/libfdt_env.h | 15 +++++++++++---- 1 files changed, 11 insertions(+), 4 deletions(-)include/libfdt_env.h +0
-0@@ -33,10 +33,17 @@#include <asm/byteorder.h>
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This has not changed?
Quoted 7 lines
include/libfdt_env.h +1
-4extern struct fdt_header *working_fdt;/* Pointer to the working fdt */ -#define fdt32_to_cpu (x) __be32_to_cpu(x) -#define cpu_to_fdt32 (x) __cpu_to_be32(x) -#define fdt64_to_cpu (x) __be64_to_cpu(x) -#define cpu_to_fdt64 (x) __cpu_to_be64(x) +#if __BYTE_ORDER == __LITTLE_ENDIAN
include/libfdt_env.h line 46
Quoted 10 lines
include/libfdt_env.h +10
-0+#define fdt32_to_cpu (x) __swab32(x) +#define cpu_to_fdt32 (x) __swab32(x) +#define fdt64_to_cpu (x) __swab64(x) +#define cpu_to_fdt64 (x) __swab64(x) +#else +#define fdt32_to_cpu (x) (x) +#define cpu_to_fdt32 (x) (x) +#define fdt64_to_cpu (x) (x) +#define cpu_to_fdt64 (x) (x) +#endif
If I change the code to include <asm/byteorder.h> only for the U-Boot code but use <endian.h>, I get warnings:
../include/libfdt.h:162: warning: implicit declaration of function '__swab32'
and finally a "undefined reference to `__swab32'" error. Seems __swab32 and __swab64 are defined only in linux/byteorder/swab.h
Best regards,
Wolfgang Denk
Signature · 7 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de "One day," said a dull voice from down below, "I'm going to be back in form again and you're going to be very sorry you said that. For a very long time. I might even go so far as to make even more Time just for you to be sorry in." - Terry Pratchett, _Small Gods_
Quoted 12 lines · Wolfgang Denk
Dear Jerry Van Baren,
Quoted 4 lines · In message <[email protected]> you wrote:
Quoted 4 lines
...
In file included from/home/wd/git/u-boot/include/libfdt_env.h:33,from fdt.c:51:
/usr/include/asm/byteorder.h:6:2: warning: #warning using private kernel header; include <endian.h> instead!...
Quoted 1 line
Does this work better?
Not really:
[snip]
Quoted 9 lines
include/libfdt_env.h line 33
Quoted 6 lines
include/libfdt_env.h +0
-0@@ -33,10 +33,17 @@#include <asm/byteorder.h> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This has not changed?
Oops, I was rushing too much. I missed changing this to endian.h.
[snip]
Quoted 11 lines
If I change the code to include <
asm/byteorder.h> only for the U-Boot code but use <endian.h>, I get warnings:
../include/libfdt.h:162: warning: implicit declaration of function '__swab32'and finally a "undefined reference to `__swab32'" error. Seems
__swab32and__swab64are defined only inlinux/byteorder/swab.hBest regards,
Wolfgang Denk
...and if I were not rushing so much, I would have found that myself instead of looking stupid. :-(
Google hasn't been very helpful for answering the question of how to handle endian issues in userland (non-kernel) code. Hmmm. Grrr. Maybe I'm not asking it the right question.
Maybe we need to make our own copy of linux/byteorder/swab.h in u-boot?
That doesn't seem right.
Best regards,
gvb
Dear Jerry Van Baren,
Quoted 7 lines · In message <[email protected]> you wrote:
...and if I were not rushing so much, I would have found that myself instead of looking stupid. :-(
Google hasn't been very helpful for answering the question of how to handle endian issues in userland (non-kernel) code. Hmmm. Grrr. Maybe I'm not asking it the right question.
Well, I have to admit that you did not perform better, because I've been searching before, and I didn't find a good solution myself either. Normally, I use the network macros for such stuff, but these don't have any 64 bit conversions...
Quoted 2 lines
Maybe we need to make our own copy of
linux/byteorder/swab.hin u-boot?
That doesn't seem right.
No, that would not be right.
Best regards,
Wolfgang Denk
Signature · 5 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Real programmers can write assembly code in any language. :-)
- Larry Wall in <[email protected]>Dear Jerry Van Baren,
Quoted 4 lines · In message <[email protected]> you wrote:
Google hasn't been very helpful for answering the question of how to handle endian issues in userland (non-kernel) code. Hmmm. Grrr. Maybe I'm not asking it the right question.
This patch seems to work for me:
include/libfdt_env.h +14 -5
@@ -24,19 +24,28 @@#ifdef USE_HOSTCC #include <stdint.h> #include <string.h> +#include <endian.h> +#include <byteswap.h> #else #include <linux/string.h> #include <linux/types.h> +#include <asm/byteorder.h> #endif /* USE_HOSTCC */ #include <stddef.h> -#include <asm/byteorder.h> extern struct fdt_header *working_fdt;/* Pointer to the working fdt */ -#define fdt32_to_cpu (x) __be32_to_cpu(x) -#define cpu_to_fdt32 (x) __cpu_to_be32(x) -#define fdt64_to_cpu (x) __be64_to_cpu(x) -#define cpu_to_fdt64 (x) __cpu_to_be64(x) +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define fdt32_to_cpu (x) bswap_32(x) +#define cpu_to_fdt32 (x) bswap_32(x) +#define fdt64_to_cpu (x) bswap_64(x) +#define cpu_to_fdt64 (x) bswap_64(x) +#else +#define fdt32_to_cpu (x) (x) +#define cpu_to_fdt32 (x) (x) +#define fdt64_to_cpu (x) (x) +#define cpu_to_fdt64 (x) (x) +#endif /* * Types for `void *' pointers.
Best regards,
Wolfgang Denk
Signature · 4 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de The speed of time is one second per second.
Jerry Van Baren
Acked-by Gerald Van BarenQuoted 48 lines · Wolfgang Denk
Dear Jerry Van Baren,
Quoted 3 lines · In message <[email protected]> you wrote:
Google hasn't been very helpful for answering the question of how to handle endian issues in userland (non-kernel) code. Hmmm. Grrr. Maybe I'm not asking it the right question.
This patch seems to work for me:
include/libfdt_env.h +14
-5@@ -24,19 +24,28 @@#ifdef USE_HOSTCC #include <stdint.h> #include <string.h> +#include <endian.h> +#include <byteswap.h> #else #include <linux/string.h> #include <linux/types.h> +#include <asm/byteorder.h> #endif /* USE_HOSTCC */ #include <stddef.h> -#include <asm/byteorder.h> extern struct fdt_header *working_fdt;/* Pointer to the working fdt */ -#define fdt32_to_cpu (x) __be32_to_cpu(x) -#define cpu_to_fdt32 (x) __cpu_to_be32(x) -#define fdt64_to_cpu (x) __be64_to_cpu(x) -#define cpu_to_fdt64 (x) __cpu_to_be64(x) +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define fdt32_to_cpu (x) bswap_32(x) +#define cpu_to_fdt32 (x) bswap_32(x) +#define fdt64_to_cpu (x) bswap_64(x) +#define cpu_to_fdt64 (x) bswap_64(x) +#else +#define fdt32_to_cpu (x) (x) +#define cpu_to_fdt32 (x) (x) +#define fdt64_to_cpu (x) (x) +#define cpu_to_fdt64 (x) (x) +#endif /* * Types for `void *' pointers.
Quoted 3 lines
Best regards,
Wolfgang Denk
Dear Wolfgang,
This works for me too. Do you want to apply it directly? That would be fastest and easiest.
Thanks,
gvb
Dear Jerry Van Baren,
Quoted 2 lines · In message <[email protected]> you wrote:
Quoted 2 lines
This patch seems to work for me:
...
Quoted 4 lines
This works for me too. Do you want to apply it directly? That would be fastest and easiest.
Acked-by Gerald Van Baren <[email protected]>
Thanks - I'll post a proper patch first, including theother change (in include/image.h).
Best regards,
Wolfgang Denk
Signature · 7 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de Boss, n.: According to the Oxford English Dictionary, in the Middle Ages the words "boss" and "botch" were largely synonymous, except that boss, in addition to meaning "a supervisor of workers" also meant "an ornamental stud."