On Tue, Jun 01, 2010 at 10:06:41PM +0800, Wu Zhangjin wrote: > Changes: > > v2 -> v3: (feedback from Alexander Clouter) > o Drop the unneeded variable n > o Replace the last "unsigned long long" by uint64_t > > v1 -> v2: (feedback from Alexander Clouter) > o make it more portable > use EXIT_SUCCESS and EXIT_FAILURE as the return value, and use uint64_t > instead of "unsigned long long". > o add a missing return value > return EXIT_FAILURE if sscanf not return 1. > > We have calculated VMLINUZ_LOAD_ADDRESS in shell, which is indecipherable. This > patch rewrites it in C. I prefer the C version too as it allow better abstraction and easier to understand calculations. > diff --git a/arch/mips/boot/.gitignore b/arch/mips/boot/.gitignore > index 4667a5f..f210b09 100644 > --- a/arch/mips/boot/.gitignore > +++ b/arch/mips/boot/.gitignore > @@ -3,3 +3,4 @@ elf2ecoff > vmlinux.* > zImage > zImage.tmp > +calc_vmlinuz_load_addr Does this do any good in this file? I had assumed this covered only the same dir as the .gitignore file is stored. But I may be wrong. > diff --git a/arch/mips/boot/compressed/Makefile b/arch/mips/boot/compressed/Makefile > index 7204dfc..cd9ee04 100644 > --- a/arch/mips/boot/compressed/Makefile > +++ b/arch/mips/boot/compressed/Makefile > > -LDFLAGS_vmlinuz := $(LDFLAGS) -Ttext $(VMLINUZ_LOAD_ADDRESS) -T > -vmlinuz: $(src)/ld.script $(vmlinuzobjs-y) $(obj)/piggy.o > - $(call cmd,ld) > +# Calculate the load address of the compressed kernel > +hostprogs-y := calc_vmlinuz_load_addr > + > +vmlinuzobjs-y += $(obj)/piggy.o > + > +quiet_cmd_zld = LD $@ > + cmd_zld = $(LD) $(LDFLAGS) -Ttext $(shell $(obj)/calc_vmlinuz_load_addr $(objtree)/$(KBUILD_IMAGE) $(VMLINUX_LOAD_ADDRESS)) -T $< $(vmlinuzobjs-y) -o $@ The line seriously fail the 80 char limit. Something like this: load_addr = $(shell $(obj)/calc_vmlinuz_load_addr \ $(objtree)/$(KBUILD_IMAGE) $(VMLINUX_LOAD_ADDRESS) quiet_cmd_zld = LD $@ cmd_zld = $(LD) $(LDFLAGS) -Ttext $(load-addr) -T $< $(vmlinuzobjs-y) -o $@ Note: The load_addr local variable _must_ use "=" asignment > +vmlinuz: $(src)/ld.script $(vmlinuzobjs-y) $(obj)/calc_vmlinuz_load_addr > + $(call cmd,zld) > $(Q)$(OBJCOPY) $(OBJCOPYFLAGS) $@ Does objcopy support equally named input and out files? If this is the case you could use: $(call cmd,objcopy) as the last line. > +#include <sys/types.h> > +#include <sys/stat.h> > +#include <errno.h> > +#include <stdint.h> > +#include <stdio.h> > +#include <stdlib.h> > + > +int main(int argc, char *argv[]) > +{ > + struct stat sb; > + uint64_t vmlinux_size, vmlinux_load_addr, vmlinuz_load_addr; > + > + if (argc != 3) { > + fprintf(stderr, "Usage: %s <pathname> <vmlinux_load_addr>\n", > + argv[0]); > + return EXIT_FAILURE; > + } > + > + if (stat(argv[1], &sb) == -1) { > + perror("stat"); > + return EXIT_FAILURE; > + } > + > + /* Convert hex characters to dec number */ > + errno = 0; > + if (sscanf(argv[2], "%llx", &vmlinux_load_addr) != 1) { > + if (errno != 0) > + perror("sscanf"); > + else > + fprintf(stderr, "No matching characters\n"); > + > + return EXIT_FAILURE; > + } > + > + vmlinux_size = (uint64_t)sb.st_size; > + vmlinuz_load_addr = vmlinux_load_addr + vmlinux_size; > + > + /* Align with 65536 */ > + vmlinuz_load_addr += (65536 - vmlinux_size % 65536); You have plenty of rooms for a comment about why you do this. Would be good to use this possibility. Sam