From 1c063279737f7d19fc11031400ef7573b883b7cd Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Apr 23 2019 12:38:35 +0000 Subject: import kexec-tools-2.0.15-21.el7_6.3 --- diff --git a/SOURCES/kexec-tools-2.0.15-makedumpfile-Prepare-paddr_to_vaddr-for-arch-specific-p2v-c.patch b/SOURCES/kexec-tools-2.0.15-makedumpfile-Prepare-paddr_to_vaddr-for-arch-specific-p2v-c.patch new file mode 100644 index 0000000..86f6a40 --- /dev/null +++ b/SOURCES/kexec-tools-2.0.15-makedumpfile-Prepare-paddr_to_vaddr-for-arch-specific-p2v-c.patch @@ -0,0 +1,133 @@ +From 9eb5a31bc2d7f6af88459b89c414fe144e7491f8 Mon Sep 17 00:00:00 2001 +From: Kazuhito Hagio +Date: Thu, 8 Nov 2018 14:26:43 -0500 +Subject: [PATCH] [PATCH] Prepare paddr_to_vaddr() for arch-specific p2v conversion + +Currently, conversion from physical address to virtual address in +--mem-usage option is "paddr + PAGE_OFFSET", which was written for +x86_64, but it's not suitable especially for arm64. + +This patch introduces paddr_to_vaddr() macro to get prepared for +arch-specific physical to virtual conversion. + +Tested-by: Bhupesh Sharma +Signed-off-by: Kazuhito Hagio +--- + elf_info.c | 7 ++++--- + makedumpfile.h | 11 +++++++++++ + 2 files changed, 15 insertions(+), 3 deletions(-) + +diff --git a/makedumpfile-1.6.2/elf_info.c b/makedumpfile-1.6.2/elf_info.c +index 711601a170c7..1d33e96684b6 100644 +--- a/makedumpfile-1.6.2/elf_info.c ++++ b/makedumpfile-1.6.2/elf_info.c +@@ -372,7 +372,7 @@ int set_kcore_vmcoreinfo(uint64_t vmcoreinfo_addr, uint64_t vmcoreinfo_len) + off_t offset_desc; + + offset = UNINITIALIZED; +- kvaddr = (ulong)vmcoreinfo_addr + PAGE_OFFSET; ++ kvaddr = paddr_to_vaddr(vmcoreinfo_addr); + + for (i = 0; i < num_pt_loads; ++i) { + struct pt_load_segment *p = &pt_loads[i]; +@@ -810,10 +810,11 @@ static int exclude_segment(struct pt_load_segment **pt_loads, + int i, j, tidx = -1; + unsigned long long vstart, vend, kvstart, kvend; + struct pt_load_segment temp_seg = {0}; +- kvstart = (ulong)start + PAGE_OFFSET; +- kvend = (ulong)end + PAGE_OFFSET; + unsigned long size; + ++ kvstart = paddr_to_vaddr(start); ++ kvend = paddr_to_vaddr(end); ++ + for (i = 0; i < (*num_pt_loads); i++) { + vstart = (*pt_loads)[i].virt_start; + vend = (*pt_loads)[i].virt_end; +diff --git a/makedumpfile-1.6.2/makedumpfile.h b/makedumpfile-1.6.2/makedumpfile.h +index 5f7a1dcf3b2f..010a9ce302bd 100644 +--- a/makedumpfile-1.6.2/makedumpfile.h ++++ b/makedumpfile-1.6.2/makedumpfile.h +@@ -929,6 +929,8 @@ typedef unsigned long pgd_t; + static inline int stub_true() { return TRUE; } + static inline int stub_true_ul(unsigned long x) { return TRUE; } + static inline int stub_false() { return FALSE; } ++#define paddr_to_vaddr_general(X) ((X) + PAGE_OFFSET) ++ + #ifdef __aarch64__ + int get_phys_base_arm64(void); + int get_machdep_info_arm64(void); +@@ -938,6 +940,7 @@ int get_xen_basic_info_arm64(void); + int get_xen_info_arm64(void); + #define find_vmemmap() stub_false() + #define vaddr_to_paddr(X) vaddr_to_paddr_arm64(X) ++#define paddr_to_vaddr(X) paddr_to_vaddr_general(X) + #define get_phys_base() get_phys_base_arm64() + #define get_machdep_info() get_machdep_info_arm64() + #define get_versiondep_info() get_versiondep_info_arm64() +@@ -958,6 +961,7 @@ unsigned long long vaddr_to_paddr_arm(unsigned long vaddr); + #define get_versiondep_info() stub_true() + #define get_kaslr_offset(X) stub_false() + #define vaddr_to_paddr(X) vaddr_to_paddr_arm(X) ++#define paddr_to_vaddr(X) paddr_to_vaddr_general(X) + #define is_phys_addr(X) stub_true_ul(X) + #define arch_crashkernel_mem_size() stub_false() + #endif /* arm */ +@@ -972,6 +976,7 @@ unsigned long long vaddr_to_paddr_x86(unsigned long vaddr); + #define get_versiondep_info() get_versiondep_info_x86() + #define get_kaslr_offset(X) stub_false() + #define vaddr_to_paddr(X) vaddr_to_paddr_x86(X) ++#define paddr_to_vaddr(X) paddr_to_vaddr_general(X) + #define is_phys_addr(X) stub_true_ul(X) + #define arch_crashkernel_mem_size() stub_false() + #endif /* x86 */ +@@ -989,6 +994,7 @@ unsigned long long vtop4_x86_64_pagetable(unsigned long vaddr, unsigned long pag + #define get_versiondep_info() get_versiondep_info_x86_64() + #define get_kaslr_offset(X) get_kaslr_offset_x86_64(X) + #define vaddr_to_paddr(X) vtop4_x86_64(X) ++#define paddr_to_vaddr(X) paddr_to_vaddr_general(X) + #define is_phys_addr(X) stub_true_ul(X) + #define arch_crashkernel_mem_size() stub_false() + #endif /* x86_64 */ +@@ -1004,6 +1010,7 @@ int arch_crashkernel_mem_size_ppc64(void); + #define get_versiondep_info() get_versiondep_info_ppc64() + #define get_kaslr_offset(X) stub_false() + #define vaddr_to_paddr(X) vaddr_to_paddr_ppc64(X) ++#define paddr_to_vaddr(X) paddr_to_vaddr_general(X) + #define is_phys_addr(X) stub_true_ul(X) + #define arch_crashkernel_mem_size() arch_crashkernel_mem_size_ppc64() + #endif /* powerpc64 */ +@@ -1017,6 +1024,7 @@ unsigned long long vaddr_to_paddr_ppc(unsigned long vaddr); + #define get_versiondep_info() stub_true() + #define get_kaslr_offset(X) stub_false() + #define vaddr_to_paddr(X) vaddr_to_paddr_ppc(X) ++#define paddr_to_vaddr(X) paddr_to_vaddr_general(X) + #define is_phys_addr(X) stub_true_ul(X) + #define arch_crashkernel_mem_size() stub_false() + #endif /* powerpc32 */ +@@ -1031,6 +1039,7 @@ int is_iomem_phys_addr_s390x(unsigned long addr); + #define get_versiondep_info() stub_true() + #define get_kaslr_offset(X) stub_false() + #define vaddr_to_paddr(X) vaddr_to_paddr_s390x(X) ++#define paddr_to_vaddr(X) paddr_to_vaddr_general(X) + #define is_phys_addr(X) is_iomem_phys_addr_s390x(X) + #define arch_crashkernel_mem_size() stub_false() + #endif /* s390x */ +@@ -1045,6 +1054,7 @@ unsigned long long vaddr_to_paddr_ia64(unsigned long vaddr); + #define get_versiondep_info() stub_true() + #define get_kaslr_offset(X) stub_false() + #define vaddr_to_paddr(X) vaddr_to_paddr_ia64(X) ++#define paddr_to_vaddr(X) paddr_to_vaddr_general(X) + #define VADDR_REGION(X) (((unsigned long)(X)) >> REGION_SHIFT) + #define is_phys_addr(X) stub_true_ul(X) + #define arch_crashkernel_mem_size() stub_false() +@@ -1059,6 +1069,7 @@ unsigned long long vaddr_to_paddr_sparc64(unsigned long vaddr); + #define get_phys_base() get_phys_base_sparc64() + #define get_versiondep_info() get_versiondep_info_sparc64() + #define vaddr_to_paddr(X) vaddr_to_paddr_sparc64(X) ++#define paddr_to_vaddr(X) paddr_to_vaddr_general(X) + #define is_phys_addr(X) stub_true_ul(X) + #define arch_crashkernel_mem_size() stub_false() + #endif /* sparc64 */ +-- +2.7.4 diff --git a/SOURCES/kexec-tools-2.0.15-makedumpfile-arm64-restore-info-page_offset-and-implement-paddr_t.patch b/SOURCES/kexec-tools-2.0.15-makedumpfile-arm64-restore-info-page_offset-and-implement-paddr_t.patch new file mode 100644 index 0000000..10a3ca0 --- /dev/null +++ b/SOURCES/kexec-tools-2.0.15-makedumpfile-arm64-restore-info-page_offset-and-implement-paddr_t.patch @@ -0,0 +1,176 @@ +From 91dc4cab62568605a274dd2260e863df2ade0230 Mon Sep 17 00:00:00 2001 +From: Bhupesh Sharma +Date: Thu, 27 Dec 2018 15:26:16 +0530 +Subject: makedumpfile/arm64: Fix 'info->page_offset' calculation + +This patch is a partial backport of the makedumpfile commit +bc8b3bbf41580723435d5d4c6da17db3c9e5ad6d. + +Since the upstream makedumpfile implementation had intermediate patches +applied which eased 'page_offset' calculation for arm64 arch, but these +were reverted via bc8b3bbf41580723435d5d4c6da17db3c9e5ad6d. + +So, its not very useful to backport all those intermediate patches. + +Signed-off-by: Bhupesh Sharma +--- + arch/arm64.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---- + makedumpfile.c | 6 +++++ + makedumpfile.h | 7 +++++- + 3 files changed, 82 insertions(+), 6 deletions(-) + +diff --git a/makedumpfile-1.6.2/arch/arm64.c b/makedumpfile-1.6.2/arch/arm64.c +index fe49d408186e..491010846f8e 100644 +--- a/makedumpfile-1.6.2/arch/arm64.c ++++ b/makedumpfile-1.6.2/arch/arm64.c +@@ -168,11 +168,76 @@ get_kvbase_arm64(void) + int + get_phys_base_arm64(void) + { +- info->phys_base = NUMBER(PHYS_OFFSET); ++ int i; ++ unsigned long long phys_start; ++ unsigned long long virt_start; ++ ++ if (NUMBER(PHYS_OFFSET) != NOT_FOUND_NUMBER) { ++ info->phys_base = NUMBER(PHYS_OFFSET); ++ DEBUG_MSG("phys_base : %lx (vmcoreinfo)\n", ++ info->phys_base); ++ return TRUE; ++ } + +- DEBUG_MSG("phys_base : %lx\n", info->phys_base); ++ if (get_num_pt_loads() && PAGE_OFFSET) { ++ for (i = 0; ++ get_pt_load(i, &phys_start, NULL, &virt_start, NULL); ++ i++) { ++ if (virt_start != NOT_KV_ADDR ++ && virt_start >= PAGE_OFFSET ++ && phys_start != NOT_PADDR) { ++ info->phys_base = phys_start - ++ (virt_start & ~PAGE_OFFSET); ++ DEBUG_MSG("phys_base : %lx (pt_load)\n", ++ info->phys_base); ++ return TRUE; ++ } ++ } ++ } + +- return TRUE; ++ ERRMSG("Cannot determine phys_base\n"); ++ return FALSE; ++} ++ ++unsigned long ++get_kaslr_offset_arm64(unsigned long vaddr) ++{ ++ unsigned int i; ++ char buf[BUFSIZE_FGETS], *endp; ++ ++ if (!info->kaslr_offset && info->file_vmcoreinfo) { ++ if (fseek(info->file_vmcoreinfo, 0, SEEK_SET) < 0) { ++ ERRMSG("Can't seek the vmcoreinfo file(%s). %s\n", ++ info->name_vmcoreinfo, strerror(errno)); ++ return FALSE; ++ } ++ ++ while (fgets(buf, BUFSIZE_FGETS, info->file_vmcoreinfo)) { ++ i = strlen(buf); ++ if (!i) ++ break; ++ if (buf[i - 1] == '\n') ++ buf[i - 1] = '\0'; ++ if (strncmp(buf, STR_KERNELOFFSET, ++ strlen(STR_KERNELOFFSET)) == 0) { ++ info->kaslr_offset = ++ strtoul(buf+strlen(STR_KERNELOFFSET),&endp,16); ++ DEBUG_MSG("info->kaslr_offset: %lx\n", info->kaslr_offset); ++ } ++ } ++ } ++ ++ if (vaddr >= __START_KERNEL_map && ++ vaddr < __START_KERNEL_map + info->kaslr_offset) { ++ DEBUG_MSG("info->kaslr_offset: %lx\n", info->kaslr_offset); ++ return info->kaslr_offset; ++ } else { ++ /* ++ * TODO: we need to check if it is vmalloc/vmmemmap/module ++ * address, we will have different offset ++ */ ++ return 0; ++ } + } + + ulong +@@ -285,8 +350,8 @@ get_versiondep_info_arm64(void) + + info->page_offset = (0xffffffffffffffffUL) << (va_bits - 1); + +- DEBUG_MSG("page_offset=%lx, va_bits=%d\n", info->page_offset, +- va_bits); ++ DEBUG_MSG("va_bits : %d\n", va_bits); ++ DEBUG_MSG("page_offset : %lx\n", info->page_offset); + + return TRUE; + } +diff --git a/makedumpfile-1.6.2/makedumpfile.c b/makedumpfile-1.6.2/makedumpfile.c +index c9634cd42858..78ebced33e6a 100644 +--- a/makedumpfile-1.6.2/makedumpfile.c ++++ b/makedumpfile-1.6.2/makedumpfile.c +@@ -2339,6 +2339,7 @@ read_vmcoreinfo_basic_info(void) + break; + if (buf[i - 1] == '\n') + buf[i - 1] = '\0'; ++ + if (strncmp(buf, STR_OSRELEASE, strlen(STR_OSRELEASE)) == 0) { + get_release = TRUE; + /* if the release have been stored, skip this time. */ +@@ -2382,6 +2383,7 @@ read_vmcoreinfo_basic_info(void) + strlen(STR_CONFIG_PGTABLE_4)) == 0) + vt.mem_flags |= MEMORY_PAGETABLE_4L; + } ++ + if (!get_release || !info->page_size) { + ERRMSG("Invalid format in %s", info->name_vmcoreinfo); + return FALSE; +@@ -11084,6 +11086,10 @@ int show_mem_usage(void) + if (!get_page_offset()) + return FALSE; + ++ /* paddr_to_vaddr() on arm64 needs phys_base. */ ++ if (!get_phys_base()) ++ return FALSE; ++ + if (!get_sys_kernel_vmcoreinfo(&vmcoreinfo_addr, &vmcoreinfo_len)) + return FALSE; + +diff --git a/makedumpfile-1.6.2/makedumpfile.h b/makedumpfile-1.6.2/makedumpfile.h +index 010a9ce302bd..177805935b71 100644 +--- a/makedumpfile-1.6.2/makedumpfile.h ++++ b/makedumpfile-1.6.2/makedumpfile.h +@@ -529,6 +529,8 @@ do { \ + #ifdef __aarch64__ + unsigned long get_kvbase_arm64(void); + #define KVBASE get_kvbase_arm64() ++#define __START_KERNEL_map (0xffffffff80000000UL) ++ + #endif /* aarch64 */ + + #ifdef __arm__ +@@ -938,9 +940,12 @@ unsigned long long vaddr_to_paddr_arm64(unsigned long vaddr); + int get_versiondep_info_arm64(void); + int get_xen_basic_info_arm64(void); + int get_xen_info_arm64(void); ++unsigned long get_kaslr_offset_arm64(unsigned long vaddr); ++#define paddr_to_vaddr_arm64(X) (((X) - info->phys_base) | PAGE_OFFSET) ++ + #define find_vmemmap() stub_false() + #define vaddr_to_paddr(X) vaddr_to_paddr_arm64(X) +-#define paddr_to_vaddr(X) paddr_to_vaddr_general(X) ++#define paddr_to_vaddr(X) paddr_to_vaddr_arm64(X) + #define get_phys_base() get_phys_base_arm64() + #define get_machdep_info() get_machdep_info_arm64() + #define get_versiondep_info() get_versiondep_info_arm64() +-- +2.7.4 diff --git a/SOURCES/mkdumprd b/SOURCES/mkdumprd index ee0ea6b..8da5c87 100644 --- a/SOURCES/mkdumprd +++ b/SOURCES/mkdumprd @@ -100,11 +100,11 @@ to_mount() { _fstype=$(findmnt -k -f -n -r -o FSTYPE $_dev) [[ -e /etc/fstab ]] && _options=$(findmnt --fstab -f -n -r -o OPTIONS $_dev) [ -z "$_options" ] && _options=$(findmnt -k -f -n -r -o OPTIONS $_dev) + #mount fs target as rw in 2nd kernel + _options=$(echo $_options | sed 's/\(^\|,\)ro\($\|,\)/\1rw\2/g') # with 'noauto' in fstab nfs and non-root disk mount will fail in 2nd # kernel, filter it out here. - _options=$(echo $_options | sed 's/\bnoauto\b//') - #mount fs target as rw in 2nd kernel - _options=$(echo $_options | sed 's/\bro\b/rw/') + _options=$(echo $_options | sed 's/\(^\|,\)noauto\($\|,\)/\1/g') _mntopts="$_target $_fstype $_options" #for non-nfs _dev converting to use udev persistent name diff --git a/SPECS/kexec-tools.spec b/SPECS/kexec-tools.spec index 64b0d35..d434df8 100644 --- a/SPECS/kexec-tools.spec +++ b/SPECS/kexec-tools.spec @@ -1,6 +1,6 @@ Name: kexec-tools Version: 2.0.15 -Release: 21%{?dist} +Release: 21%{?dist}.3 License: GPLv2 Group: Applications/System Summary: The kexec/kdump userspace component. @@ -116,6 +116,8 @@ Patch719: kexec-tools-2.0.15-makedumpfile-Use-integer-arithmetics-for-th.patch Patch720: kexec-tools-2.0.15-makedumpfile-Use-monotonic-clock-to-calculate-ETA-and-s.patch Patch721: kexec-tools-2.0.15-makedumpfile-Check-if-clock_gettime-requires-lrt.patch Patch722: kexec-tools-2.0.15-makedumpfile-when-refiltering-initialize-refiltered-bitm.patch +Patch723: kexec-tools-2.0.15-makedumpfile-Prepare-paddr_to_vaddr-for-arch-specific-p2v-c.patch +Patch724: kexec-tools-2.0.15-makedumpfile-arm64-restore-info-page_offset-and-implement-paddr_t.patch # @@ -184,6 +186,8 @@ tar -z -x -v -f %{SOURCE25} %patch720 -p1 %patch721 -p1 %patch722 -p1 +%patch723 -p1 +%patch724 -p1 %ifarch ppc @@ -425,6 +429,16 @@ done %doc %changelog +* Fri Mar 22 2019 Bhupesh Sharma 2.0.15-21.3 +- makedumpfile/arm64: Fix 'info->page_offset' calculation (use correct + bug number) + +* Fri Mar 22 2019 Bhupesh Sharma 2.0.15-21.2 +- makedumpfile/arm64: Fix 'info->page_offset' calculation + +* Tue Mar 12 2019 Bhupesh Sharma 2.0.15-21.1 +- mkdumprd: refine regex on dropping mount options + * Thu Aug 30 2018 Pingfan Liu 2.0.15-21 - kexec/ppc64: add support to parse ibm, dynamic-memory-v2