[U-Boot] [PATCH] [mips] add $(ENDIANNESS) option when link hello_world example

Shinya Kuribayashi
2010-07-21T14:08:09Z

On 07/21/2010 07:27 PM, Xiangfu Liu wrote:
> form the document about OUTPUT_FORMAT(default, big, little)
> If neither -EB nor -EL are used, output format will be the first argument.
> If -EB is used, the output format will be the second argument.
> If -EL is used, the output format will be the third argument.
>
> so change the mips.lds third argument to little and add
> $(ENDIANNESS) to linker args.
>
> this patch have tested with "./MAKEALL mips mips_el"

Little endian build is one of the outstanding issues for MIPS ports[1].

There are several technical issues, 1) lack of powerful configration
infrastructure (it's drastically improved these days, so not a problem
any more), 2) *LDFLAGS things are not propageted throughout the build
system properly, especially through examples/standalone (it seems this
issue is also addressed via distributed STANDALONE_LOAD_ADDR). Or in
some cases, 3) you might want to generate u-boot image with different
endiannness from toolchain's default (native build vs. non-native).
And finally 4) ELDK toolchains vs. non-ELDK tools issues. As for #4,
you'll see troublesome -dumpspecs outputs from ELDK toolchain[2].

[1] http://search.gmane.org/?query=mips+little+endian&group=gmane.comp.boot-loaders.u-boot
[2] http://thread.gmane.org/gmane.comp.boot-loaders.u-boot/31998

Anyway, to move discussion forward we need to sort out what's the most
priority, what's next, what's nice to have, and what's not.

> diff --git a/arch/mips/config.mk b/arch/mips/config.mk
> index aa06761..cc3719f 100644
> --- a/arch/mips/config.mk
> +++ b/arch/mips/config.mk
> @@ -23,7 +23,7 @@
>
> CROSS_COMPILE ?= mips_4KC-
>
> -STANDALONE_LOAD_ADDR = 0x80200000 -T mips.lds
> +STANDALONE_LOAD_ADDR = 0x80200000 -T mips.lds $(ENDIANNESS)
>
> PLATFORM_CPPFLAGS += -DCONFIG_MIPS -D__MIPS__
>
> diff --git a/examples/standalone/mips.lds b/examples/standalone/mips.lds
> index 717b201..63a1c92 100644
> --- a/examples/standalone/mips.lds
> +++ b/examples/standalone/mips.lds
> @@ -24,7 +24,7 @@
> /*
> OUTPUT_FORMAT("elf32-bigmips", "elf32-bigmips", "elf32-bigmips")
> */
> -OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradbigmips")
> +OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradlittlemips")
> OUTPUT_ARCH(mips)
> SECTIONS
> {

Attached is one of my holding patches for little endian builds. This
looks mostly good and works for me, but won't work for ELDK toolchain.

Having additional hooks for ELDK tools somewhere in config.mk files
would probably work, but I don't have enough spare time these days.
Someone please cook it up into appropriate shape, please?

Shinya

---
Makefile | 1 +
arch/mips/config.mk | 27 +++++++++++++++++++++++++--
arch/mips/cpu/config.mk | 8 --------
board/dbau1x00/u-boot.lds | 2 +-
board/gth2/u-boot.lds | 2 +-
board/incaip/u-boot.lds | 2 +-
board/pb1x00/u-boot.lds | 2 +-
board/purple/u-boot.lds | 2 +-
board/qemu-mips/u-boot.lds | 2 +-
examples/standalone/mips.lds | 2 +-
include/configs/pb1x00.h | 2 ++
11 files changed, 35 insertions(+), 17 deletions(-)

diff --git a/Makefile b/Makefile
index 9cea069..5c9fb48 100644
--- a/Makefile
+++ b/Makefile
@@ -2306,6 +2306,7 @@ dbau1550_config : unconfig
dbau1550_el_config : unconfig
@mkdir -p $(obj)include
@echo "#define CONFIG_DBAU1550 1" >$(obj)include/config.h
+ @echo "#define CONFIG_CPU_LITTLE_ENDIAN" >>$(obj)include/config.h
@$(MKCONFIG) -a dbau1x00 mips mips dbau1x00

gth2_config : unconfig
diff --git a/arch/mips/config.mk b/arch/mips/config.mk
index aa06761..f5d9ac5 100644
--- a/arch/mips/config.mk
+++ b/arch/mips/config.mk
@@ -23,8 +23,6 @@

CROSS_COMPILE ?= mips_4KC-

-STANDALONE_LOAD_ADDR = 0x80200000 -T mips.lds
-
PLATFORM_CPPFLAGS += -DCONFIG_MIPS -D__MIPS__

#
@@ -50,3 +48,28 @@ PLATFORM_CPPFLAGS += -DCONFIG_MIPS -D__MIPS__
PLATFORM_CPPFLAGS += -G 0 -mabicalls -fpic
PLATFORM_CPPFLAGS += -msoft-float
PLATFORM_LDFLAGS += -G 0 -static -n -nostdlib
+
+#
+# We explicitly add the endianness specifier if needed, this allows
+# to compile kernels with a toolchain for the other endianness. We
+# carefully avoid to add it redundantly because gcc 3.3/3.4 complains
+# when fed the toolchain default!
+#
+# Certain gcc versions upto gcc 4.1.1 (probably 4.2-subversion as of
+# 2006-10-10 don't properly change the predefined symbols if -EB / -EL
+# are used, so we kludge that here. A bug has been filed at
+# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29413.
+#
+UNDEF_ALL += -UMIPSEB -U_MIPSEB -U__MIPSEB -U__MIPSEB__
+UNDEF_ALL += -UMIPSEL -U_MIPSEL -U__MIPSEL -U__MIPSEL__
+PREDEF_BE += -DMIPSEB -D_MIPSEB -D__MIPSEB -D__MIPSEB__
+PREDEF_LE += -DMIPSEL -D_MIPSEL -D__MIPSEL -D__MIPSEL__
+ifdef CONFIG_CPU_LITTLE_ENDIAN
+PLATFORM_CPPFLAGS += $(shell $(CC) -dumpmachine |grep -q 'mips.*el-.*' || echo -EL $(UNDEF_ALL) $(PREDEF_LE))
+PLATFORM_LDFLAGS += -EL
+else
+PLATFORM_CPPFLAGS += $(shell $(CC) -dumpmachine |grep -q 'mips.*el-.*' && echo -EB $(UNDEF_ALL) $(PREDEF_BE))
+PLATFORM_LDFLAGS += -EB
+endif
+
+STANDALONE_LOAD_ADDR = 0x80200000 -T mips.lds $(PLATFORM_LDFLAGS)
diff --git a/arch/mips/cpu/config.mk b/arch/mips/cpu/config.mk
index a173c54..098d6c7 100644
--- a/arch/mips/cpu/config.mk
+++ b/arch/mips/cpu/config.mk
@@ -28,12 +28,4 @@ else \
echo "-march=4kc -mtune=4kc"; \
fi)

-ifneq (,$(findstring 4KCle,$(CROSS_COMPILE)))
-ENDIANNESS = -EL
-else
-ENDIANNESS = -EB
-endif
-
-MIPSFLAGS += $(ENDIANNESS)
-
PLATFORM_CPPFLAGS += $(MIPSFLAGS)
diff --git a/board/dbau1x00/u-boot.lds b/board/dbau1x00/u-boot.lds
index 9a6cd1b..3c4fbe3 100644
--- a/board/dbau1x00/u-boot.lds
+++ b/board/dbau1x00/u-boot.lds
@@ -24,7 +24,7 @@
/*
OUTPUT_FORMAT("elf32-bigmips", "elf32-bigmips", "elf32-bigmips")
*/
-OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradbigmips")
+OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradlittlemips")
OUTPUT_ARCH(mips)
ENTRY(_start)
SECTIONS
diff --git a/board/gth2/u-boot.lds b/board/gth2/u-boot.lds
index e6eee9b..aeb0fcc 100644
--- a/board/gth2/u-boot.lds
+++ b/board/gth2/u-boot.lds
@@ -24,7 +24,7 @@
/*
OUTPUT_FORMAT("elf32-bigmips", "elf32-bigmips", "elf32-bigmips")
*/
-OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradbigmips")
+OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradlittlemips")
OUTPUT_ARCH(mips)
ENTRY(_start)
SECTIONS
diff --git a/board/incaip/u-boot.lds b/board/incaip/u-boot.lds
index 9a6cd1b..3c4fbe3 100644
--- a/board/incaip/u-boot.lds
+++ b/board/incaip/u-boot.lds
@@ -24,7 +24,7 @@
/*
OUTPUT_FORMAT("elf32-bigmips", "elf32-bigmips", "elf32-bigmips")
*/
-OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradbigmips")
+OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradlittlemips")
OUTPUT_ARCH(mips)
ENTRY(_start)
SECTIONS
diff --git a/board/pb1x00/u-boot.lds b/board/pb1x00/u-boot.lds
index 9a6cd1b..3c4fbe3 100644
--- a/board/pb1x00/u-boot.lds
+++ b/board/pb1x00/u-boot.lds
@@ -24,7 +24,7 @@
/*
OUTPUT_FORMAT("elf32-bigmips", "elf32-bigmips", "elf32-bigmips")
*/
-OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradbigmips")
+OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradlittlemips")
OUTPUT_ARCH(mips)
ENTRY(_start)
SECTIONS
diff --git a/board/purple/u-boot.lds b/board/purple/u-boot.lds
index 1881e65..542601a 100644
--- a/board/purple/u-boot.lds
+++ b/board/purple/u-boot.lds
@@ -24,7 +24,7 @@
/*
OUTPUT_FORMAT("elf32-bigmips", "elf32-bigmips", "elf32-bigmips")
*/
-OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradbigmips")
+OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradlittlemips")
OUTPUT_ARCH(mips)
ENTRY(_start)
SECTIONS
diff --git a/board/qemu-mips/u-boot.lds b/board/qemu-mips/u-boot.lds
index ad058ca..bd16786 100644
--- a/board/qemu-mips/u-boot.lds
+++ b/board/qemu-mips/u-boot.lds
@@ -24,7 +24,7 @@
/*
OUTPUT_FORMAT("elf32-bigmips", "elf32-bigmips", "elf32-bigmips")
*/
-OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradbigmips")
+OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradlittlemips")
OUTPUT_ARCH(mips)
ENTRY(_start)
SECTIONS
diff --git a/examples/standalone/mips.lds b/examples/standalone/mips.lds
index 717b201..63a1c92 100644
--- a/examples/standalone/mips.lds
+++ b/examples/standalone/mips.lds
@@ -24,7 +24,7 @@
/*
OUTPUT_FORMAT("elf32-bigmips", "elf32-bigmips", "elf32-bigmips")
*/
-OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradbigmips")
+OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradlittlemips")
OUTPUT_ARCH(mips)
SECTIONS
{
diff --git a/include/configs/pb1x00.h b/include/configs/pb1x00.h
index 5ad745e..49ca07c 100644
--- a/include/configs/pb1x00.h
+++ b/include/configs/pb1x00.h
@@ -28,6 +28,8 @@
#ifndef __CONFIG_H
#define __CONFIG_H

+#define CONFIG_CPU_LITTLE_ENDIAN
+
#define CONFIG_MIPS32 1 /* MIPS32 CPU core */
#define CONFIG_PB1X00 1
#define CONFIG_SOC_AU1X00 1 /* alchemy series cpu */