Hari Bathini <hbath...@linux.ibm.com> writes:

> @@ -968,7 +1040,7 @@ int setup_new_fdt_ppc64(const struct kimage *image, void 
> *fdt,
>
>       /*
>        * Restrict memory usage for kdump kernel by setting up
> -      * usable memory ranges.
> +      * usable memory ranges and memory reserve map.
>        */
>       if (image->type == KEXEC_TYPE_CRASH) {
>               ret = get_usable_memory_ranges(&umem);
> @@ -980,6 +1052,24 @@ int setup_new_fdt_ppc64(const struct kimage *image, 
> void *fdt,
>                       pr_err("Error setting up usable-memory property for 
> kdump kernel\n");
>                       goto out;
>               }
> +
> +             ret = fdt_add_mem_rsv(fdt, BACKUP_SRC_START + BACKUP_SRC_SIZE,
> +                                   crashk_res.start - BACKUP_SRC_SIZE);

I believe this answers my question from the other email about how the
crashkernel is prevented from stomping in the crashed kernel's memory,
right? I needed to think for a bit to understand what the above
reservation was protecting. I think it's worth adding a comment.

> +             if (ret) {
> +                     pr_err("Error reserving crash memory: %s\n",
> +                            fdt_strerror(ret));
> +                     goto out;
> +             }
> +     }
> +
> +     if (image->arch.backup_start) {
> +             ret = fdt_add_mem_rsv(fdt, image->arch.backup_start,
> +                                   BACKUP_SRC_SIZE);
> +             if (ret) {
> +                     pr_err("Error reserving memory for backup: %s\n",
> +                            fdt_strerror(ret));
> +                     goto out;
> +             }
>       }

This is only true for KEXEC_TYPE_CRASH, if I'm following the code
correctly. I think it would be clearer to put the if above inside the if
for KEXEC_TYPE_CRASH to make it clearer.

>
>       ret = setup_new_fdt(image, fdt, initrd_load_addr, initrd_len,

<snip>

> diff --git a/arch/powerpc/purgatory/purgatory_64.c 
> b/arch/powerpc/purgatory/purgatory_64.c
> new file mode 100644
> index 0000000..1eca74c
> --- /dev/null
> +++ b/arch/powerpc/purgatory/purgatory_64.c
> @@ -0,0 +1,36 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * purgatory: Runs between two kernels
> + *
> + * Copyright 2020, Hari Bathini, IBM Corporation.
> + */
> +
> +#include <asm/purgatory.h>
> +#include <asm/crashdump-ppc64.h>
> +
> +extern unsigned long backup_start;
> +
> +static void *__memcpy(void *dest, const void *src, unsigned long n)
> +{
> +     unsigned long i;
> +     unsigned char *d;
> +     const unsigned char *s;
> +
> +     d = dest;
> +     s = src;
> +     for (i = 0; i < n; i++)
> +             d[i] = s[i];
> +
> +     return dest;
> +}
> +
> +void purgatory(void)
> +{
> +     void *dest, *src;
> +
> +     src = (void *)BACKUP_SRC_START;
> +     if (backup_start) {
> +             dest = (void *)backup_start;
> +             __memcpy(dest, src, BACKUP_SRC_SIZE);
> +     }
> +}

In general I'm in favor of using C code over assembly, but having to
bring in that relocation support just for the above makes me wonder if
it's worth it in this case.

--
Thiago Jung Bauermann
IBM Linux Technology Center

Reply via email to