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