Wolfgang Denk <w...@denx.de> wrote on 2010/02/11 22:39:00: > > Dear Joakim Tjernlund, > > In message <OF918AA866.3ED427EB-ONC12576C7.005CBEE4-C12576C7. > 005cf...@transmode.se> you wrote: > > > > > I have no idea how it is actually done in the kernel code... but gcc > > > defines it: > > > > > > gcc -dM -E -x c - <<<'' | grep ENDIAN > > > #define __BIG_ENDIAN__ 1 > > > #define _BIG_ENDIAN 1 > > > > That doesn't define __BYTE_ORDER. Try the same gcc command > > on a file that #includes <stdlib.h> and you will get both > > __BIG_ENDIAN and __LITTLE_ENDIAN > > For me this appears to work: > > On x86: > > $ echo '#include <stdlib.h>' | gcc -dM -E -x c - | grep ENDIAN > #define _ENDIAN_H 1 > #define PDP_ENDIAN __PDP_ENDIAN > #define __PDP_ENDIAN 3412 > #define BIG_ENDIAN __BIG_ENDIAN > #define __BYTE_ORDER __LITTLE_ENDIAN > #define __LITTLE_ENDIAN 1234 > #define __BIG_ENDIAN 4321 > #define LITTLE_ENDIAN __LITTLE_ENDIAN > > On PowerPC: > > $ echo '#include <stdlib.h>' | gcc -dM -E -x c - | grep ENDIAN > #define __BIG_ENDIAN__ 1 > #define __PDP_ENDIAN 3412 > #define __LITTLE_ENDIAN 1234 > #define BIG_ENDIAN __BIG_ENDIAN > #define _BIG_ENDIAN 1 > #define __BYTE_ORDER __BIG_ENDIAN > #define _ENDIAN_H 1 > #define __BIG_ENDIAN 4321 > #define PDP_ENDIAN __PDP_ENDIAN > #define LITTLE_ENDIAN __LITTLE_ENDIAN > > In both cases __BYTE_ORDER is set to a sane value.
Yes, but that was not what I meant. If you look closer you see that both __BIG_ENDIAN and __LITTLE_ENDIAN are defined in each compiler. This means you cannot use these two defines directly to tell if your arch is BE or LE. Guess what the kernel uses :( I think the kernel should #define __BYTE_ORDER properly so one can use __BYTE_ORDER in the kernel too. Just grep for __BYTE_ORDER in the linux tree to see some ugly workarounds just because __BYTE_ORDER isn't defined. Jocke _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev