diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0050-resource-Provide-resource-struct-in-resource-walk-ca.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0050-resource-Provide-resource-struct-in-resource-walk-ca.patch | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0050-resource-Provide-resource-struct-in-resource-walk-ca.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0050-resource-Provide-resource-struct-in-resource-walk-ca.patch new file mode 100644 index 00000000..74f4fed2 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0050-resource-Provide-resource-struct-in-resource-walk-ca.patch @@ -0,0 +1,251 @@ +From d6af0f1dc8fc9dbc056ce5e79750747f6d1ca300 Mon Sep 17 00:00:00 2001 +From: Tom Lendacky <thomas.lendacky@amd.com> +Date: Fri, 20 Oct 2017 09:30:51 -0500 +Subject: [PATCH 50/95] resource: Provide resource struct in resource walk + callback + +In preperation for a new function that will need additional resource +information during the resource walk, update the resource walk callback to +pass the resource structure. Since the current callback start and end +arguments are pulled from the resource structure, the callback functions +can obtain them from the resource structure directly. + +Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> +Signed-off-by: Brijesh Singh <brijesh.singh@amd.com> +Signed-off-by: Thomas Gleixner <tglx@linutronix.de> +Reviewed-by: Kees Cook <keescook@chromium.org> +Reviewed-by: Borislav Petkov <bp@suse.de> +Tested-by: Borislav Petkov <bp@suse.de> +Cc: kvm@vger.kernel.org +Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> +Cc: Borislav Petkov <bp@alien8.de> +Cc: linuxppc-dev@lists.ozlabs.org +Link: https://lkml.kernel.org/r/20171020143059.3291-10-brijesh.singh@amd.com +Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com> +--- + arch/powerpc/kernel/machine_kexec_file_64.c | 12 +++++++++--- + arch/x86/kernel/crash.c | 18 +++++++++--------- + arch/x86/kernel/pmem.c | 2 +- + include/linux/ioport.h | 4 ++-- + include/linux/kexec.h | 2 +- + kernel/kexec_file.c | 5 +++-- + kernel/resource.c | 9 +++++---- + 7 files changed, 30 insertions(+), 22 deletions(-) + +diff --git a/arch/powerpc/kernel/machine_kexec_file_64.c b/arch/powerpc/kernel/machine_kexec_file_64.c +index c66132b..45e0b7d 100644 +--- a/arch/powerpc/kernel/machine_kexec_file_64.c ++++ b/arch/powerpc/kernel/machine_kexec_file_64.c +@@ -91,11 +91,13 @@ int arch_kimage_file_post_load_cleanup(struct kimage *image) + * and that value will be returned. If all free regions are visited without + * func returning non-zero, then zero will be returned. + */ +-int arch_kexec_walk_mem(struct kexec_buf *kbuf, int (*func)(u64, u64, void *)) ++int arch_kexec_walk_mem(struct kexec_buf *kbuf, ++ int (*func)(struct resource *, void *)) + { + int ret = 0; + u64 i; + phys_addr_t mstart, mend; ++ struct resource res = { }; + + if (kbuf->top_down) { + for_each_free_mem_range_reverse(i, NUMA_NO_NODE, 0, +@@ -105,7 +107,9 @@ int arch_kexec_walk_mem(struct kexec_buf *kbuf, int (*func)(u64, u64, void *)) + * range while in kexec, end points to the last byte + * in the range. + */ +- ret = func(mstart, mend - 1, kbuf); ++ res.start = mstart; ++ res.end = mend - 1; ++ ret = func(&res, kbuf); + if (ret) + break; + } +@@ -117,7 +121,9 @@ int arch_kexec_walk_mem(struct kexec_buf *kbuf, int (*func)(u64, u64, void *)) + * range while in kexec, end points to the last byte + * in the range. + */ +- ret = func(mstart, mend - 1, kbuf); ++ res.start = mstart; ++ res.end = mend - 1; ++ ret = func(&res, kbuf); + if (ret) + break; + } +diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c +index 44404e2..815008c 100644 +--- a/arch/x86/kernel/crash.c ++++ b/arch/x86/kernel/crash.c +@@ -209,7 +209,7 @@ void native_machine_crash_shutdown(struct pt_regs *regs) + } + + #ifdef CONFIG_KEXEC_FILE +-static int get_nr_ram_ranges_callback(u64 start, u64 end, void *arg) ++static int get_nr_ram_ranges_callback(struct resource *res, void *arg) + { + unsigned int *nr_ranges = arg; + +@@ -342,7 +342,7 @@ static int elf_header_exclude_ranges(struct crash_elf_data *ced, + return ret; + } + +-static int prepare_elf64_ram_headers_callback(u64 start, u64 end, void *arg) ++static int prepare_elf64_ram_headers_callback(struct resource *res, void *arg) + { + struct crash_elf_data *ced = arg; + Elf64_Ehdr *ehdr; +@@ -355,7 +355,7 @@ static int prepare_elf64_ram_headers_callback(u64 start, u64 end, void *arg) + ehdr = ced->ehdr; + + /* Exclude unwanted mem ranges */ +- ret = elf_header_exclude_ranges(ced, start, end); ++ ret = elf_header_exclude_ranges(ced, res->start, res->end); + if (ret) + return ret; + +@@ -518,14 +518,14 @@ static int add_e820_entry(struct boot_params *params, struct e820_entry *entry) + return 0; + } + +-static int memmap_entry_callback(u64 start, u64 end, void *arg) ++static int memmap_entry_callback(struct resource *res, void *arg) + { + struct crash_memmap_data *cmd = arg; + struct boot_params *params = cmd->params; + struct e820_entry ei; + +- ei.addr = start; +- ei.size = end - start + 1; ++ ei.addr = res->start; ++ ei.size = res->end - res->start + 1; + ei.type = cmd->type; + add_e820_entry(params, &ei); + +@@ -619,12 +619,12 @@ int crash_setup_memmap_entries(struct kimage *image, struct boot_params *params) + return ret; + } + +-static int determine_backup_region(u64 start, u64 end, void *arg) ++static int determine_backup_region(struct resource *res, void *arg) + { + struct kimage *image = arg; + +- image->arch.backup_src_start = start; +- image->arch.backup_src_sz = end - start + 1; ++ image->arch.backup_src_start = res->start; ++ image->arch.backup_src_sz = res->end - res->start + 1; + + /* Expecting only one range for backup region */ + return 1; +diff --git a/arch/x86/kernel/pmem.c b/arch/x86/kernel/pmem.c +index 3fe6900..6b07faa 100644 +--- a/arch/x86/kernel/pmem.c ++++ b/arch/x86/kernel/pmem.c +@@ -7,7 +7,7 @@ + #include <linux/init.h> + #include <linux/ioport.h> + +-static int found(u64 start, u64 end, void *data) ++static int found(struct resource *res, void *data) + { + return 1; + } +diff --git a/include/linux/ioport.h b/include/linux/ioport.h +index 83c8d65..c0070d7 100644 +--- a/include/linux/ioport.h ++++ b/include/linux/ioport.h +@@ -272,10 +272,10 @@ walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages, + void *arg, int (*func)(unsigned long, unsigned long, void *)); + extern int + walk_system_ram_res(u64 start, u64 end, void *arg, +- int (*func)(u64, u64, void *)); ++ int (*func)(struct resource *, void *)); + extern int + walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start, u64 end, +- void *arg, int (*func)(u64, u64, void *)); ++ void *arg, int (*func)(struct resource *, void *)); + + /* True if any part of r1 overlaps r2 */ + static inline bool resource_overlaps(struct resource *r1, struct resource *r2) +diff --git a/include/linux/kexec.h b/include/linux/kexec.h +index 1c08c92..f16f6ce 100644 +--- a/include/linux/kexec.h ++++ b/include/linux/kexec.h +@@ -160,7 +160,7 @@ struct kexec_buf { + }; + + int __weak arch_kexec_walk_mem(struct kexec_buf *kbuf, +- int (*func)(u64, u64, void *)); ++ int (*func)(struct resource *, void *)); + extern int kexec_add_buffer(struct kexec_buf *kbuf); + int kexec_locate_mem_hole(struct kexec_buf *kbuf); + #endif /* CONFIG_KEXEC_FILE */ +diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c +index 9f48f44..e5bcd94 100644 +--- a/kernel/kexec_file.c ++++ b/kernel/kexec_file.c +@@ -406,9 +406,10 @@ static int locate_mem_hole_bottom_up(unsigned long start, unsigned long end, + return 1; + } + +-static int locate_mem_hole_callback(u64 start, u64 end, void *arg) ++static int locate_mem_hole_callback(struct resource *res, void *arg) + { + struct kexec_buf *kbuf = (struct kexec_buf *)arg; ++ u64 start = res->start, end = res->end; + unsigned long sz = end - start + 1; + + /* Returning 0 will take to next memory range */ +@@ -437,7 +438,7 @@ static int locate_mem_hole_callback(u64 start, u64 end, void *arg) + * func returning non-zero, then zero will be returned. + */ + int __weak arch_kexec_walk_mem(struct kexec_buf *kbuf, +- int (*func)(u64, u64, void *)) ++ int (*func)(struct resource *, void *)) + { + if (kbuf->image->type == KEXEC_TYPE_CRASH) + return walk_iomem_res_desc(crashk_res.desc, +diff --git a/kernel/resource.c b/kernel/resource.c +index 1260f30..78cae82 100644 +--- a/kernel/resource.c ++++ b/kernel/resource.c +@@ -402,14 +402,15 @@ static int find_next_iomem_res(struct resource *res, unsigned long desc, + + static int __walk_iomem_res_desc(struct resource *res, unsigned long desc, + bool first_level_children_only, +- void *arg, int (*func)(u64, u64, void *)) ++ void *arg, ++ int (*func)(struct resource *, void *)) + { + u64 orig_end = res->end; + int ret = -1; + + while ((res->start < res->end) && + !find_next_iomem_res(res, desc, first_level_children_only)) { +- ret = (*func)(res->start, res->end, arg); ++ ret = (*func)(res, arg); + if (ret) + break; + +@@ -435,7 +436,7 @@ static int __walk_iomem_res_desc(struct resource *res, unsigned long desc, + * <linux/ioport.h> and set it in 'desc' of a target resource entry. + */ + int walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start, +- u64 end, void *arg, int (*func)(u64, u64, void *)) ++ u64 end, void *arg, int (*func)(struct resource *, void *)) + { + struct resource res; + +@@ -454,7 +455,7 @@ int walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start, + * ranges. + */ + int walk_system_ram_res(u64 start, u64 end, void *arg, +- int (*func)(u64, u64, void *)) ++ int (*func)(struct resource *, void *)) + { + struct resource res; + +-- +2.7.4 + |