[PATCH] Restore kexec uImage-ppc to working state
Simon Horman
horms at verge.net.au
Wed Jun 16 12:38:44 EST 2010
CCed linuxppc-dev to fish for an ack.
On Mon, Jun 14, 2010 at 02:38:42PM -0500, Matthew McClintock wrote:
> Booting with uImage-ppc was broken by previous work, this
> patch should restore it to working order
>
> Signed-off-by: Matthew McClintock <msm at freescale.com>
> ---
> kexec/arch/ppc/kexec-ppc.c | 68 ++++++++++++++++++++++-------------
> kexec/arch/ppc/kexec-uImage-ppc.c | 5 +--
> purgatory/arch/ppc/purgatory-ppc.c | 5 +++
> 3 files changed, 49 insertions(+), 29 deletions(-)
>
> diff --git a/kexec/arch/ppc/kexec-ppc.c b/kexec/arch/ppc/kexec-ppc.c
> index 55cadd6..c073f56 100644
> --- a/kexec/arch/ppc/kexec-ppc.c
> +++ b/kexec/arch/ppc/kexec-ppc.c
> @@ -261,11 +261,28 @@ static int get_base_ranges(void)
> break;
> }
> }
> - base_memory_range[local_memory_ranges].start =
> - ((uint32_t *)buf)[0];
> - base_memory_range[local_memory_ranges].end =
> - base_memory_range[local_memory_ranges].start +
> - ((uint32_t *)buf)[1];
> +
> + if (n == 8)
> + {
> + base_memory_range[local_memory_ranges].start =
> + ((uint32_t *)buf)[0];
> + base_memory_range[local_memory_ranges].end =
> + base_memory_range[local_memory_ranges].start +
> + ((uint32_t *)buf)[1];
> + }
> + else if (n == 16)
> + {
> + base_memory_range[local_memory_ranges].start =
> + ((uint64_t *)buf)[0];
> + base_memory_range[local_memory_ranges].end =
> + base_memory_range[local_memory_ranges].start +
> + ((uint64_t *)buf)[1];
> + }
> + else
> + {
> + fprintf(stderr, "Mem node has invalid size: %d\n", n);
> + return -1;
> + }
> base_memory_range[local_memory_ranges].type = RANGE_RAM;
> local_memory_ranges++;
> dbgprintf("%016llx-%016llx : %x\n",
> @@ -327,27 +344,28 @@ static int get_devtree_details(unsigned long kexec_flags)
> }
>
> if (strncmp(dentry->d_name, "chosen", 6) == 0) {
> - strcat(fname, "/linux,kernel-end");
> - file = fopen(fname, "r");
> - if (!file) {
> - perror(fname);
> - goto error_opencdir;
> - }
> - if (fread(&tmp_long, sizeof(unsigned long), 1, file)
> - != 1) {
> - perror(fname);
> - goto error_openfile;
> - }
> - kernel_end = tmp_long;
> - fclose(file);
> -
> - /* Add kernel memory to exclude_range */
> - exclude_range[i].start = 0x0UL;
> - exclude_range[i].end = kernel_end;
> - i++;
> - if (i >= max_memory_ranges)
> - realloc_memory_ranges();
> + /* only reserve kernel region if we are doing a crash kernel */
> if (kexec_flags & KEXEC_ON_CRASH) {
> + strcat(fname, "/linux,kernel-end");
> + file = fopen(fname, "r");
> + if (!file) {
> + perror(fname);
> + goto error_opencdir;
> + }
> + if (fread(&tmp_long, sizeof(unsigned long), 1, file)
> + != 1) {
> + perror(fname);
> + goto error_openfile;
> + }
> + kernel_end = tmp_long;
> + fclose(file);
> +
> + /* Add kernel memory to exclude_range */
> + exclude_range[i].start = 0x0UL;
> + exclude_range[i].end = kernel_end;
> + i++;
> + if (i >= max_memory_ranges)
> + realloc_memory_ranges();
> memset(fname, 0, sizeof(fname));
> strcpy(fname, device_tree);
> strcat(fname, dentry->d_name);
> diff --git a/kexec/arch/ppc/kexec-uImage-ppc.c b/kexec/arch/ppc/kexec-uImage-ppc.c
> index 45cde2f..4a8d28d 100644
> --- a/kexec/arch/ppc/kexec-uImage-ppc.c
> +++ b/kexec/arch/ppc/kexec-uImage-ppc.c
> @@ -133,13 +133,10 @@ static int ppc_load_bare_bits(int argc, char **argv, const char *buf,
> addr = dtb_addr;
> elf_rel_set_symbol(&info->rhdr, "dt_offset", &addr, sizeof(addr));
>
> - addr = rmo_top;
> - elf_rel_set_symbol(&info->rhdr, "mem_size", &addr, sizeof(addr));
> -
> #define PUL_STACK_SIZE (16 * 1024)
> addr = locate_hole(info, PUL_STACK_SIZE, 0, 0, -1, 1);
> addr += PUL_STACK_SIZE;
> - elf_rel_set_symbol(&info->rhdr, "pul_stack", &addr, sizeof(addr));
> + elf_rel_set_symbol(&info->rhdr, "stack", &addr, sizeof(addr));
> /* No allocation past here in order not to overwrite the stack */
> #undef PUL_STACK_SIZE
>
> diff --git a/purgatory/arch/ppc/purgatory-ppc.c b/purgatory/arch/ppc/purgatory-ppc.c
> index 3d7d484..349e750 100644
> --- a/purgatory/arch/ppc/purgatory-ppc.c
> +++ b/purgatory/arch/ppc/purgatory-ppc.c
> @@ -39,3 +39,8 @@ void post_verification_setup_arch(void)
> if (panic_kernel)
> crashdump_backup_memory();
> }
> +
> +void crashdump_backup_memory(void)
> +{
> + return;
> +}
> --
> 1.6.0.6
>
>
> _______________________________________________
> kexec mailing list
> kexec at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/kexec
More information about the Linuxppc-dev
mailing list