-2007-02-21 Hollis Blanchard - - * kern/powerpc/ieee1275/init.c (HEAP_SIZE): Removed. - (HEAP_LIMIT): New macro. - (grub_claim_heap): Claim memory up to `heaplimit'. - -2007-02-21 Hollis Blanchard - - * conf/powerpc-ieee1275.rmk (kernel_elf_LDFLAGS): Link at 64KB. - * kern/powerpc/ieee1275/init.c (_end): Add declaration. - (_start): Likewise. - (grub_arch_modules_addr): Return address after `_end'. - * util/powerpc/ieee1275/grub-mkimage.c: Include grub/misc.h. - (load_modules): Use new parameter as `p_paddr' and `p_vaddr'. - (add_segments): Calculate `_end' from phdr size and location. - (ALIGN_UP): Moved to ... - * include/grub/misc.h: here. - * include/grub/powerpc/ieee1275/kernel.h (GRUB_IEEE1275_MOD_ALIGN): - New macro. - (GRUB_IEEE1275_MODULE_BASE): Removed. diff -ur grub2-bad/conf/powerpc-ieee1275.mk grub2-good/conf/powerpc-ieee1275.mk --- grub2-bad/conf/powerpc-ieee1275.mk 2007-02-22 00:22:20.000000000 +0100 +++ grub2-good/conf/powerpc-ieee1275.mk 2006-12-13 23:34:04.000000000 +0100 @@ -468,7 +468,7 @@ kernel_elf_CFLAGS = $(COMMON_CFLAGS) kernel_elf_ASFLAGS = $(COMMON_ASFLAGS) kernel_elf_LDFLAGS = $(COMMON_LDFLAGS) -static-libgcc -lgcc \ - -Wl,-N,-S,-Ttext,0x10000,-Bstatic + -Wl,-N,-S,-Ttext,0x200000,-Bstatic # Scripts. sbin_SCRIPTS = grub-install @@ -1004,4 +1004,3 @@ halt_mod_LDFLAGS = $(COMMON_LDFLAGS) include $(srcdir)/conf/common.mk - diff -ur grub2-bad/conf/powerpc-ieee1275.rmk grub2-good/conf/powerpc-ieee1275.rmk --- grub2-bad/conf/powerpc-ieee1275.rmk 2007-02-22 00:22:20.000000000 +0100 +++ grub2-good/conf/powerpc-ieee1275.rmk 2006-12-13 23:30:19.000000000 +0100 @@ -74,7 +74,7 @@ kernel_elf_CFLAGS = $(COMMON_CFLAGS) kernel_elf_ASFLAGS = $(COMMON_ASFLAGS) kernel_elf_LDFLAGS = $(COMMON_LDFLAGS) -static-libgcc -lgcc \ - -Wl,-N,-S,-Ttext,0x10000,-Bstatic + -Wl,-N,-S,-Ttext,0x200000,-Bstatic # Scripts. sbin_SCRIPTS = grub-install @@ -127,4 +127,3 @@ halt_mod_LDFLAGS = $(COMMON_LDFLAGS) include $(srcdir)/conf/common.mk - diff -ur grub2-bad/include/grub/misc.h grub2-good/include/grub/misc.h --- grub2-bad/include/grub/misc.h 2007-02-22 00:22:20.000000000 +0100 +++ grub2-good/include/grub/misc.h 2006-10-14 17:24:52.000000000 +0200 @@ -26,8 +26,6 @@ #include #include -#define ALIGN_UP(addr, align) ((long)((char *)addr + align - 1) & ~(align - 1)) - #define grub_dprintf(condition, fmt, args...) grub_real_dprintf(__FILE__, __LINE__, condition, fmt, ## args); /* XXX: If grub_memmove is too slow, we must implement grub_memcpy. */ #define grub_memcpy(d,s,n) grub_memmove ((d), (s), (n)) diff -ur grub2-bad/include/grub/powerpc/ieee1275/kernel.h grub2-good/include/grub/powerpc/ieee1275/kernel.h --- grub2-bad/include/grub/powerpc/ieee1275/kernel.h 2007-02-22 00:22:20.000000000 +0100 +++ grub2-good/include/grub/powerpc/ieee1275/kernel.h 2006-04-23 15:37:36.000000000 +0200 @@ -22,9 +22,10 @@ #include -#define GRUB_IEEE1275_MOD_ALIGN 0x1000 - void EXPORT_FUNC (grub_reboot) (void); void EXPORT_FUNC (grub_halt) (void); +/* Where grub-mkimage places the core modules in memory. */ +#define GRUB_IEEE1275_MODULE_BASE 0x00300000 + #endif /* ! GRUB_KERNEL_MACHINE_HEADER */ diff -ur grub2-bad/kern/powerpc/ieee1275/init.c grub2-good/kern/powerpc/ieee1275/init.c --- grub2-bad/kern/powerpc/ieee1275/init.c 2007-02-22 00:27:36.000000000 +0100 +++ grub2-good/kern/powerpc/ieee1275/init.c 2007-02-13 04:49:43.000000000 +0100 @@ -34,10 +34,7 @@ #include #include -#define HEAP_LIMIT (4<<20) /* 4 MiB */ - -extern char _start[]; -extern char _end[]; +#define HEAP_SIZE (8<<20) /* 8 MiB */ void grub_exit (void) @@ -114,27 +111,29 @@ } /* Claim some available memory in the first /memory node. */ -static void grub_claim_heap (unsigned long heaplimit) +static void grub_claim_heap (unsigned long heapsize) { + unsigned long total = 0; + auto int heap_init (grub_uint64_t addr, grub_uint64_t len); int heap_init (grub_uint64_t addr, grub_uint64_t len) { len -= 1; /* Required for some firmware. */ - /* Don't claim anything above `heaplimit'. */ - if (addr + len > heaplimit) - len = heaplimit - addr; - - if (len) - { - /* Claim and use it. */ - if (grub_claimmap (addr, len) < 0) - return grub_error (GRUB_ERR_OUT_OF_MEMORY, - "Failed to claim heap at 0x%llx, len 0x%llx\n", - addr, len); - grub_mm_init_region ((void *) (grub_addr_t) addr, len); - } - + /* Limit heap to `heapsize'. */ + if (total + len > heapsize) + len = heapsize - total; + + /* Claim and use it. */ + if (grub_claimmap (addr, len) < 0) + return grub_error (GRUB_ERR_OUT_OF_MEMORY, + "Failed to claim heap at 0x%llx, len 0x%llx\n", + addr, len); + grub_mm_init_region ((void *) (grub_addr_t) addr, len); + + total += len; + if (total >= heapsize) + return 1; return 0; } @@ -148,7 +147,7 @@ int actual; grub_console_init (); - grub_claim_heap (HEAP_LIMIT); + grub_claim_heap (HEAP_SIZE); grub_ofdisk_init (); /* Process commandline. */ @@ -206,5 +205,5 @@ grub_addr_t grub_arch_modules_addr (void) { - return ALIGN_UP(_end, GRUB_IEEE1275_MOD_ALIGN); + return GRUB_IEEE1275_MODULE_BASE; } diff -ur grub2-bad/util/powerpc/ieee1275/grub-mkimage.c grub2-good/util/powerpc/ieee1275/grub-mkimage.c --- grub2-bad/util/powerpc/ieee1275/grub-mkimage.c 2007-02-22 00:22:20.000000000 +0100 +++ grub2-good/util/powerpc/ieee1275/grub-mkimage.c 2006-09-26 06:24:38.000000000 +0200 @@ -1,6 +1,6 @@ /* * GRUB -- GRand Unified Bootloader - * Copyright (C) 2004,2005,2006,2007 Free Software Foundation, Inc. + * Copyright (C) 2004,2005,2006 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,12 +27,13 @@ #include #include #include -#include #include #include #include #include +#define ALIGN_UP(addr, align) ((long)((char *)addr + align - 1) & ~(align - 1)) + #define GRUB_IEEE1275_NOTE_NAME "PowerPC" #define GRUB_IEEE1275_NOTE_TYPE 0x1275 @@ -97,8 +98,7 @@ } void -load_modules (grub_addr_t modbase, Elf32_Phdr *phdr, const char *dir, - char *mods[], FILE *out) +load_modules (Elf32_Phdr *phdr, const char *dir, char *mods[], FILE *out) { char *module_img; struct grub_util_path_list *path_list; @@ -152,8 +152,8 @@ phdr->p_type = grub_cpu_to_be32 (PT_LOAD); phdr->p_flags = grub_cpu_to_be32 (PF_R | PF_W | PF_X); phdr->p_align = grub_cpu_to_be32 (sizeof (long)); - phdr->p_vaddr = grub_cpu_to_be32 (modbase); - phdr->p_paddr = grub_cpu_to_be32 (modbase); + phdr->p_vaddr = grub_cpu_to_be32 (GRUB_IEEE1275_MODULE_BASE); + phdr->p_paddr = grub_cpu_to_be32 (GRUB_IEEE1275_MODULE_BASE); phdr->p_filesz = grub_cpu_to_be32 (total_module_size); phdr->p_memsz = grub_cpu_to_be32 (total_module_size); } @@ -166,7 +166,6 @@ Elf32_Phdr *phdr; FILE *in; char *kernel_path; - grub_addr_t grub_end = 0; off_t phdroff; int i; @@ -184,7 +183,6 @@ for (i = 0; i < grub_be_to_cpu16 (ehdr.e_phnum); i++) { char *segment_img; - grub_size_t segment_end; phdr = phdrs + i; @@ -196,13 +194,6 @@ grub_util_info ("copying segment %d, type %d", i, grub_be_to_cpu32 (phdr->p_type)); - /* Locate _end. */ - segment_end = grub_be_to_cpu32 (phdr->p_paddr) - + grub_be_to_cpu32 (phdr->p_memsz); - grub_util_info ("segment %u end 0x%lx", i, segment_end); - if (segment_end > grub_end) - grub_end = segment_end; - /* Read segment data and write it to new file. */ segment_img = xmalloc (grub_be_to_cpu32 (phdr->p_filesz)); @@ -216,11 +207,6 @@ if (mods[0] != NULL) { - grub_addr_t modbase; - - /* Place modules just after grub segment. */ - modbase = ALIGN_UP(grub_end, GRUB_IEEE1275_MOD_ALIGN); - /* Construct new segment header for modules. */ phdr = phdrs + grub_be_to_cpu16 (ehdr.e_phnum); ehdr.e_phnum = grub_cpu_to_be16 (grub_be_to_cpu16 (ehdr.e_phnum) + 1); @@ -229,7 +215,7 @@ phdr->p_offset = grub_cpu_to_be32 (ALIGN_UP (grub_util_get_fp_size (out), sizeof (long))); - load_modules (modbase, phdr, dir, mods, out); + load_modules (phdr, dir, mods, out); } if (chrp)