Skip to contentSkip to conversation

MIPS: fix vmlinuz build when only 32bit math shell is available

PATCH In review Alexander Clouter 2 participants 2 messages Jan 19, 2010 MIPS

lore
Share & tools
lore
#0 lore raw

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
index 671d344..65d1adf 100644
@@ -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
#1 lore raw
Quoted 9 lines · Alexander Clouter

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:
----

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.

---
 arch/mips/boot/compressed/Makefile |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)
arch/mips/boot/compressed/Makefile +0 -0
index 671d344..65d1adf 100644

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