[PATCH] ppc/uImage: Find new kernel load_addr if the default addr is not available
McClintock Matthew-B29882
B29882 at freescale.com
Wed Nov 7 13:00:43 EST 2012
On Wed, Nov 7, 2012 at 7:36 AM, Suzuki K. Poulose <suzuki at in.ibm.com> wrote:
> From: Suzuki K. Poulose <suzuki at in.ibm.com>
>
> If the kernel cannot be loaded at the default load_addr, provided
> by the image, we should try finding a free area using locate_hole().
> This is usually applicable for the CRASH case, where the memory should
> be located in the reserved region.
>
> Without this patch, sometime the kernel fails to load for uImage formatted
> relocatable kernel images.
Without testing, this looks reasonable to me.
-M
>
> Signed-off-by: Suzuki K. Poulose <suzuki at in.ibm.com>
> Cc: Sebastian Andrzej Siewior <bigeasy at linutronix.de>
> Cc: Matthew McClintock <msm at freescale.com>
> ---
> kexec/arch/ppc/kexec-uImage-ppc.c | 21 +++++++++++++++------
> 1 file changed, 15 insertions(+), 6 deletions(-)
>
> diff --git a/kexec/arch/ppc/kexec-uImage-ppc.c b/kexec/arch/ppc/kexec-uImage-ppc.c
> index b5579f0..e55bf94 100644
> --- a/kexec/arch/ppc/kexec-uImage-ppc.c
> +++ b/kexec/arch/ppc/kexec-uImage-ppc.c
> @@ -130,13 +130,22 @@ static int ppc_load_bare_bits(int argc, char **argv, const char *buf,
> * allocated from memtop down towards zero so we should never get too
> * close to the bss :)
> */
> - ret = valid_memory_range(info, load_addr, load_addr + (len + (1 * 1024 * 1024)));
> - if (!ret) {
> - printf("Can't add kernel to addr 0x%08x len %ld\n",
> - load_addr, len + (1 * 1024 * 1024));
> - return -1;
> +#define _1MiB (1 * 1024 * 1024)
> +
> + /*
> + * If the provided load_addr cannot be allocated, find a new
> + * area.
> + */
> + if (!valid_memory_range(info, load_addr, load_addr + (len + _1MiB))) {
> + load_addr = locate_hole(info, len + _1MiB, 0, 0, max_addr, 1);
> + if (load_addr == ULONG_MAX) {
> + printf("Can't allocate memory for kernel of len %ld\n",
> + len + _1MiB);
> + return -1;
> + }
> }
> - add_segment(info, buf, len, load_addr, len + (1 * 1024 * 1024));
> +
> + add_segment(info, buf, len, load_addr, len + _1MiB);
>
> if (info->kexec_flags & KEXEC_ON_CRASH) {
> crash_cmdline = xmalloc(COMMAND_LINE_SIZE);
>
>
> _______________________________________________
> kexec mailing list
> kexec at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/kexec
More information about the kexec
mailing list