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 <k-hagio@ab.jp.nec.com>
+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 <bhsharma@redhat.com>
+Signed-off-by: Kazuhito Hagio <k-hagio@ab.jp.nec.com>
+---
+ 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 <bhsharma@redhat.com>
+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 <bhsharma@redhat.com>
+---
+ 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 <bhsharma@redhat.com> 2.0.15-21.3
+- makedumpfile/arm64: Fix 'info->page_offset' calculation (use correct
+  bug number)
+
+* Fri Mar 22 2019 Bhupesh Sharma <bhsharma@redhat.com> 2.0.15-21.2
+- makedumpfile/arm64: Fix 'info->page_offset' calculation
+
+* Tue Mar 12 2019 Bhupesh Sharma <bhsharma@redhat.com> 2.0.15-21.1
+- mkdumprd: refine regex on dropping mount options
+
 * Thu Aug 30 2018 Pingfan Liu <piliu@redhat.com> 2.0.15-21
 - kexec/ppc64: add support to parse ibm, dynamic-memory-v2