MIPS: fix vmlinuz build when only 32bit math shell is available
PATCH 1/1 MIPS: fix vmlinuz build when only 32bit math shell is available
Counter to the documentation for the dash shell, it seems that on my x86_64 filth under Debian only does 32bit math. As I have configured my lapdog to use 'dash' for non-interactive tasks I run into problems when compiling a compressed kernel.
I play with the AR7 platform, so VMLINUX_LOAD_ADDRESS is 0xffffffff94100000, and for a (for example) 4MiB kernel VMLINUZ_LOAD_ADDRESS is made out to be:
----
alex@berk:~$ bash -c 'printf "%x\n" $((0xffffffff94100000 + 0x400000))' ffffffff94500000 alex@berk:~$ dash -c 'printf "%x\n" $((0xffffffff94100000 + 0x400000))' 80000000003fffff ----
The former is obviously correct whilst the later breaks things royally.
This patch fixes vmlinuz kernel builds on systems where only a 32bit math enabled shell is a available. It does this by bringing 'bc' back in as a build dependency (Wu Zhangjin had orginally used 'bc' but I had suggested he 'fixes' the original dependency *sigh*) but things now seem to work as expected.
--- arch/mips/boot/compressed/Makefile | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-)
arch/mips/boot/compressed/Makefile +4 -2
@@ -14,8 +14,10 @@ # compressed kernel load addr: VMLINUZ_LOAD_ADDRESS > VMLINUX_LOAD_ADDRESS + VMLINUX_SIZE VMLINUX_SIZE := $(shell wc -c $(objtree)/$(KBUILD_IMAGE) 2>/dev/null | cut -d' ' -f1) -VMLINUX_SIZE := $(shell [ -n "$(VMLINUX_SIZE)" ] && echo $$(($(VMLINUX_SIZE) + (65536 - $(VMLINUX_SIZE) % 65536)))) -VMLINUZ_LOAD_ADDRESS := 0x$(shell [ -n "$(VMLINUX_SIZE)" ] && printf %x $$(($(VMLINUX_LOAD_ADDRESS) + $(VMLINUX_SIZE)))) +VMLINUX_SIZE := $(shell printf %X $$(($(VMLINUX_SIZE) + (65536 - $(VMLINUX_SIZE) % 65536)))) +VMLINUZ_LOAD_ADDRESS := $(shell A=$(VMLINUX_LOAD_ADDRESS); A=$${A\#0xffffffff}; echo $${A\#0x} | tr a-f A-F) +VMLINUZ_LOAD_ADDRESS := $(shell echo "obase=16; ibase=16; $(VMLINUZ_LOAD_ADDRESS) + $(VMLINUX_SIZE)" | bc) +VMLINUZ_LOAD_ADDRESS := $(shell A=$(VMLINUX_LOAD_ADDRESS); [ "$${A\#0xffffffff}" = "$${A}" ] && echo 0x$(VMLINUZ_LOAD_ADDRESS) || echo 0xffffffff$(VMLINUZ_LOAD_ADDRESS)) # set the default size of the mallocing area for decompressing BOOT_HEAP_SIZE := 0x400000
Signature · 1 line
1.6.6
Quoted 9 lines · Alexander Clouter
Counter to the documentation for the dash shell, it seems that on my
x86_64filth under Debian only does 32bit math. As I have configured my lapdog to use 'dash' for non-interactive tasks I run into problems when compiling a compressed kernel.I play with the AR7 platform, so
VMLINUX_LOAD_ADDRESSis0xffffffff94100000, and for a (for example) 4MiB kernelVMLINUZ_LOAD_ADDRESSis made out to be:
----
Quoted 8 lines
alex@berk:~$ bash -c 'printf "%x\n" $((0xffffffff94100000 + 0x400000))' ffffffff94500000 alex@berk:~$ dash -c 'printf "%x\n" $((0xffffffff94100000 + 0x400000))' 80000000003fffff ----The former is obviously correct whilst the later breaks things royally.
Just reproduced the above problem on the YeeLoong netbook(loongson-2F processor), but no problem on my thinkpad SL400 laptop(Intel(R) Core(TM)2 Duo CPU). so, dash not always support 64bit math, and perhaps some other shells not support 64bit math either.
Quoted 16 lines
This patch fixes vmlinuz kernel builds on systems where only a 32bit math enabled shell is a available. It does this by bringing 'bc' back in as a build dependency (Wu Zhangjin had orginally used 'bc' but I had suggested he 'fixes' the original dependency *sigh*) but things now seem to work as expected.
Signed-off-by Alexander Clouter <[email protected]>--- arch/mips/boot/compressed/Makefile | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-)arch/mips/boot/compressed/Makefile +0
-0
arch/mips/boot/compressed/Makefile line 17
Quoted 6 lines
arch/mips/boot/compressed/Makefile +1
-2@@ -14,8 +14,10 @@ # compressed kernel load addr: VMLINUZ_LOAD_ADDRESS > VMLINUX_LOAD_ADDRESS + VMLINUX_SIZE VMLINUX_SIZE := $(shell wc -c $(objtree)/$(KBUILD_IMAGE) 2>/dev/null | cut -d' ' -f1) -VMLINUX_SIZE := $(shell [ -n "$(VMLINUX_SIZE)" ] && echo $$(($(VMLINUX_SIZE) + (65536 - $(VMLINUX_SIZE) % 65536)))) -VMLINUZ_LOAD_ADDRESS := 0x$(shell [ -n "$(VMLINUX_SIZE)" ] && printf %x $$(($(VMLINUX_LOAD_ADDRESS) + $(VMLINUX_SIZE)))) +VMLINUX_SIZE := $(shell printf %X $$(($(VMLINUX_SIZE) + (65536 - $(VMLINUX_SIZE) % 65536))))
No, we can not remove this '-n "$(VMLINUX_SIZE)"', otherwise, we will get the following error when "make clean" or "make distclean":
(standard_in) 1: parse error
arch/mips/boot/compressed/Makefile line 19
Quoted 2 lines
arch/mips/boot/compressed/Makefile +2
-0+VMLINUZ_LOAD_ADDRESS := $(shell A=$(VMLINUX_LOAD_ADDRESS); A=$${A\#0xffffffff}; echo $${A\#0x} | tr a-f A-F) +VMLINUZ_LOAD_ADDRESS := $(shell echo "obase=16; ibase=16; $(VMLINUZ_LOAD_ADDRESS) + $(VMLINUX_SIZE)" | bc)
The following command(without the prefix 0xffffffff) works well on yeeloong netbook, what about your machine?
$ dash -c 'printf "%x\n" $((0x94100000 + 0x400000))' 94500000
so, bc is not necessary.
arch/mips/boot/compressed/Makefile line 20
Quoted 1 line
arch/mips/boot/compressed/Makefile +1
-0+VMLINUZ_LOAD_ADDRESS := $(shell A=$(VMLINUX_LOAD_ADDRESS); [ "$${A\#0xffffffff}" = "$${A}" ] && echo 0x$(VMLINUZ_LOAD_ADDRESS) || echo 0xffffffff$(VMLINUZ_LOAD_ADDRESS))
And seems some of the other situations are not covered here:
$ cat arch/mips/Makefile | grep "^load\-" | grep -v 0xffffffff load-$(CONFIG_MIPS_SIM) += 0x80100000 load-$(CONFIG_BASLER_EXCITE) += 0x80100000 load-$(CONFIG_SGI_IP27) += 0xc00000004001c000 load-$(CONFIG_SGI_IP27) += 0xa80000000001c000 load-$(CONFIG_SGI_IP28) += 0xa800000020004000
so, a general method should be:
1. Get the sum of "the low 32bit of VMLINUX_LOAD_ADDRESS + VMLINUX_SIZE" with printf "%08x" (08 herein is used to prefix it with 0...)
2. append "the high 32bit of VMLINUX_LOAD_ADDRESS" as the prefix if it exists.
Will resend a revision of this patch with the above method later.
Thanks & Regards,
Wu Zhangjin