Index: linux-2.6.12.3/arch/ppc64/boot/main.c =================================================================== --- linux-2.6.12.3.orig/arch/ppc64/boot/main.c +++ linux-2.6.12.3/arch/ppc64/boot/main.c @@ -22,7 +22,7 @@ extern void printf(const char *fmt, ...); extern int sprintf(char *buf, const char *fmt, ...); void gunzip(void *, int, unsigned char *, int *); -void *claim(unsigned int, unsigned int, unsigned int); +void *claim(unsigned long, unsigned long, unsigned long); void flush_cache(void *, unsigned long); void pause(void); extern void exit(void); @@ -31,9 +31,8 @@ void *memmove(void *dest, const void *src, unsigned long n); void *memcpy(void *dest, const void *src, unsigned long n); -/* Value picked to match that used by yaboot */ -#define PROG_START 0x01400000 -#define RAM_END (256<<20) // Fixme: use OF */ +#define ONE_MB 0x100000 +#define RAM_END (512<<20) // Fixme: use OF */ char *avail_ram; char *begin_avail, *end_avail; @@ -75,13 +74,13 @@ #define DEBUG -static unsigned long claim_base = PROG_START; +static unsigned long claim_base; static unsigned long try_claim(unsigned long size) { unsigned long addr = 0; - for(; claim_base < RAM_END; claim_base += 0x100000) { + for(; claim_base < RAM_END; claim_base += ONE_MB) { #ifdef DEBUG printf(" trying: 0x%08lx\n\r", claim_base); #endif @@ -112,7 +111,23 @@ if (getprop(chosen_handle, "stdin", &stdin, sizeof(stdin)) != 4) exit(); - printf("zImage starting: loaded at 0x%x\n\r", (unsigned)_start); + printf("zImage starting: loaded at 0x%lx\n\r", (unsigned long)_start); + + /* + * The first available claim_base must be "out of the way" - + * well above _start + kernel_size + initrd + overhead. + */ + + claim_base = ((unsigned long) _start) + + ((unsigned long) vmlinux_filesize) + + (unsigned long)(_initrd_end - _initrd_start) + + ONE_MB; + + /* + * Now round up the claim_base to a nice 1 MB boundary. + */ + + claim_base = ((claim_base + ONE_MB - 1) / ONE_MB) * ONE_MB; /* * Now we try to claim some memory for the kernel itself @@ -122,7 +137,7 @@ * size... In practice we add 1Mb, that is enough, but we should really * consider fixing the Makefile to put a _raw_ kernel in there ! */ - vmlinux_memsize += 0x100000; + vmlinux_memsize += ONE_MB; printf("Allocating 0x%lx bytes for kernel ...\n\r", vmlinux_memsize); vmlinux.addr = try_claim(vmlinux_memsize); if (vmlinux.addr == 0) {