diff --git a/.gitignore b/.gitignore
index b231ca3..0e4d7eb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,3 @@
-SOURCES/1.6.8.tar.gz
+SOURCES/1.7.0.tar.gz
 SOURCES/eppic_050615.tar.gz
 SOURCES/kexec-tools-2.0.20.tar.xz
diff --git a/.kexec-tools.metadata b/.kexec-tools.metadata
index 553f89d..fd2e018 100644
--- a/.kexec-tools.metadata
+++ b/.kexec-tools.metadata
@@ -1,3 +1,3 @@
-7af5b92c69df9f63b9f02ad07a76a2a2581d4660 SOURCES/1.6.8.tar.gz
+a931a40b80df204be1b02bfb502921cc618810fd SOURCES/1.7.0.tar.gz
 a096c8e0892b559f40b01916aae240652f75b68a SOURCES/eppic_050615.tar.gz
 5d9acd2e741d356d4a48fe4f2d63f66ba431051d SOURCES/kexec-tools-2.0.20.tar.xz
diff --git a/SOURCES/dracut-fadump-init-fadump.sh b/SOURCES/dracut-fadump-init-fadump.sh
new file mode 100755
index 0000000..94a3751
--- /dev/null
+++ b/SOURCES/dracut-fadump-init-fadump.sh
@@ -0,0 +1,48 @@
+#!/bin/sh
+export PATH=/usr/bin:/usr/sbin
+export SYSTEMD_IN_INITRD=lenient
+
+[ -e /proc/mounts ] ||
+	(mkdir -p /proc && mount -t proc -o nosuid,noexec,nodev proc /proc)
+
+grep -q '^sysfs /sys sysfs' /proc/mounts ||
+	(mkdir -p /sys && mount -t sysfs -o nosuid,noexec,nodev sysfs /sys)
+
+grep -q '^none / ' /proc/mounts || grep -q '^rootfs / ' /proc/mounts && ROOTFS_IS_RAMFS=1
+
+if [ -f /proc/device-tree/rtas/ibm,kernel-dump ] || [ -f /proc/device-tree/ibm,opal/dump/mpipl-boot ]; then
+	mkdir /newroot
+	mount -t ramfs ramfs /newroot
+
+	if [ $ROOTFS_IS_RAMFS ]; then
+		for FILE in $(ls -A /fadumproot/); do
+			mv /fadumproot/$FILE /newroot/
+		done
+		exec switch_root /newroot /init
+	else
+		mkdir /newroot/sys /newroot/proc /newroot/dev /newroot/run /newroot/oldroot
+
+		grep -q '^devtmpfs /dev devtmpfs' /proc/mounts && mount --move /dev /newroot/dev
+		grep -q '^tmpfs /run tmpfs' /proc/mounts && mount --move /run /newroot/run
+		mount --move /sys /newroot/sys
+		mount --move /proc /newroot/proc
+
+		cp --reflink=auto --sparse=auto --preserve=mode,timestamps,links -dfr /fadumproot/. /newroot/
+		cd /newroot && pivot_root . oldroot
+
+		loop=1
+		while [ $loop ]; do
+			unset loop
+			while read -r _ mp _; do
+				case $mp in
+				/oldroot/*) umount -d "$mp" && loop=1 ;;
+				esac
+			done </proc/mounts
+		done
+		umount -d -l oldroot
+
+		exec /init
+	fi
+else
+	exec /init.dracut
+fi
diff --git a/SOURCES/dracut-fadump-module-setup.sh b/SOURCES/dracut-fadump-module-setup.sh
new file mode 100644
index 0000000..f062486
--- /dev/null
+++ b/SOURCES/dracut-fadump-module-setup.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+check() {
+    return 255
+}
+
+depends() {
+    return 0
+}
+
+install() {
+    mv -f "$initdir/init" "$initdir/init.dracut"
+    inst_script "$moddir/init-fadump.sh" /init
+    chmod a+x "$initdir/init"
+
+    # Install required binaries for the init script (init-fadump.sh)
+    inst_multiple sh modprobe grep mkdir mount
+    if dracut_module_included "squash"; then
+        inst_multiple cp pivot_root umount
+    else
+        inst_multiple ls mv switch_root
+    fi
+}
diff --git a/SOURCES/dracut-module-setup.sh b/SOURCES/dracut-module-setup.sh
index dafdad6..7ad8507 100755
--- a/SOURCES/dracut-module-setup.sh
+++ b/SOURCES/dracut-module-setup.sh
@@ -27,17 +27,7 @@ depends() {
         [[ " $omit_dracutmodules " != *\ $1\ * ]] && _dep="$_dep $1"
     }
 
-    is_squash_available() {
-        for kmodule in squashfs overlay loop; do
-            if [ -z "$KDUMP_KERNELVER" ]; then
-                modprobe --dry-run $kmodule &>/dev/null || return 1
-            else
-                modprobe -S $KDUMP_KERNELVER --dry-run $kmodule &>/dev/null || return 1
-            fi
-        done
-    }
-
-    if is_squash_available && ! is_fadump_capable; then
+    if is_squash_available; then
         add_opt_module squash
     else
         dwarning "Required modules to build a squashed kdump image is missing!"
@@ -1015,7 +1005,5 @@ install() {
       ${initdir}/etc/lvm/lvm.conf &>/dev/null
 
     # Save more memory by dropping switch root capability
-    if ! is_fadump_capable; then
-        dracut_no_switch_root
-    fi
+    dracut_no_switch_root
 }
diff --git a/SOURCES/kdump-lib.sh b/SOURCES/kdump-lib.sh
index 67ee10e..bfff546 100755
--- a/SOURCES/kdump-lib.sh
+++ b/SOURCES/kdump-lib.sh
@@ -19,6 +19,16 @@ is_fadump_capable()
     return 1
 }
 
+is_squash_available() {
+    for kmodule in squashfs overlay loop; do
+        if [ -z "$KDUMP_KERNELVER" ]; then
+            modprobe --dry-run $kmodule &>/dev/null || return 1
+        else
+            modprobe -S $KDUMP_KERNELVER --dry-run $kmodule &>/dev/null || return 1
+        fi
+    done
+}
+
 perror_exit() {
     derror "$@"
     exit 1
diff --git a/SOURCES/kdump.conf.5 b/SOURCES/kdump.conf.5
index ce23dea..ae076df 100644
--- a/SOURCES/kdump.conf.5
+++ b/SOURCES/kdump.conf.5
@@ -118,8 +118,11 @@ All files under /etc/kdump/post.d are collectively sorted
 and executed in lexical order, before binary or script
 specified kdump_post parameter is executed.
 .PP
-Note that scripts written for use with this directive must use
-the /bin/bash interpreter.
+Note that scripts written for use with this directive must use the /bin/bash
+interpreter. And since these scripts run in kdump enviroment, the reference to
+the storage or network device in the scripts should adhere to the section
+\'Supported dump target types and requirements\' in kexec-kdump-howto.txt.
+
 .RE
 
 .B kdump_pre <binary | script>
@@ -139,8 +142,11 @@ kdump_pre parameter is executed.
 Even if the binary or script in /etc/kdump/pre.d directory
 returns non 0 exit status, the processing is continued.
 .PP
-Note that scripts written for this directive must use
-the /bin/bash interpreter.
+Note that scripts written for use with this directive must use the /bin/bash
+interpreter. And since these scripts run in kdump enviroment, the reference to
+the storage or network device in the scripts should adhere to the section
+\'Supported dump target types and requirements\' in kexec-kdump-howto.txt.
+
 .RE
 
 .B extra_bins <binaries | shell scripts>
diff --git a/SOURCES/kdumpctl b/SOURCES/kdumpctl
index e8a7a3a..46fa67d 100755
--- a/SOURCES/kdumpctl
+++ b/SOURCES/kdumpctl
@@ -8,6 +8,7 @@ KEXEC_ARGS=""
 KDUMP_CONFIG_FILE="/etc/kdump.conf"
 KDUMP_LOG_PATH="/var/log"
 MKDUMPRD="/sbin/mkdumprd -f"
+MKFADUMPRD="/sbin/mkfadumprd"
 DRACUT_MODULES_FILE="/usr/lib/dracut/modules.txt"
 SAVE_PATH=/var/crash
 SSH_KEY_LOCATION="/root/.ssh/kdump_id_rsa"
@@ -104,25 +105,10 @@ save_core()
 
 rebuild_fadump_initrd()
 {
-	local target_initrd_tmp
-
-	# this file tells the initrd is fadump enabled
-	touch /tmp/fadump.initramfs
-	target_initrd_tmp="$TARGET_INITRD.tmp"
-	ddebug "rebuild fadump initrd: $target_initrd_tmp $DEFAULT_INITRD_BAK $KDUMP_KERNELVER"
-	$MKDUMPRD $target_initrd_tmp --rebuild $DEFAULT_INITRD_BAK --kver $KDUMP_KERNELVER \
-		-i /tmp/fadump.initramfs /etc/fadump.initramfs
-	if [ $? != 0 ]; then
-		derror "mkdumprd: failed to rebuild initrd with fadump support"
-		rm -f /tmp/fadump.initramfs
+	if ! $MKFADUMPRD "$DEFAULT_INITRD_BAK" "$TARGET_INITRD" --kver "$KDUMP_KERNELVER"; then
+		derror "mkfadumprd: failed to make fadump initrd"
 		return 1
 	fi
-	rm -f /tmp/fadump.initramfs
-
-	# updating fadump initrd
-	ddebug "updating fadump initrd: $target_initrd_tmp $TARGET_INITRD"
-	mv $target_initrd_tmp $TARGET_INITRD
-	sync
 
 	return 0
 }
@@ -464,7 +450,11 @@ check_drivers_modified()
 	is_dracut_mod_omitted watchdog || is_dracut_mod_omitted watchdog-modules || _new_drivers+=" $(get_watchdog_drvs)"
 
 	[ -z "$_new_drivers" ] && return 0
-	_old_drivers="$(lsinitrd $TARGET_INITRD -f /usr/lib/dracut/loaded-kernel-modules.txt | tr '\n' ' ')"
+	if is_fadump_capable; then
+		_old_drivers="$(lsinitrd "$TARGET_INITRD" -f /usr/lib/dracut/fadump-kernel-modules.txt | tr '\n' ' ')"
+	else
+		_old_drivers="$(lsinitrd "$TARGET_INITRD" -f /usr/lib/dracut/loaded-kernel-modules.txt | tr '\n' ' ')"
+	fi
 
 	ddebug "Modules required for kdump: '$_new_drivers'"
 	ddebug "Modules included in old initramfs: '$_old_drivers'"
@@ -617,7 +607,7 @@ check_rebuild()
 		#in case of fadump mode, check whether the default/target
 		#initrd is already built with dump capture capability
 		if [ "$DEFAULT_DUMP_MODE" == "fadump" ]; then
-			capture_capable_initrd=$(lsinitrd -f $DRACUT_MODULES_FILE $TARGET_INITRD | grep ^kdumpbase$ | wc -l)
+			capture_capable_initrd=$(lsinitrd -f $DRACUT_MODULES_FILE $TARGET_INITRD | grep -e ^kdumpbase$ -e ^zz-fadumpinit$ | wc -l)
 		fi
 	fi
 
@@ -960,12 +950,12 @@ selinux_relabel()
 		return
 	fi
 
-	for _i in $(find $_path); do
-		_attr=$(getfattr -m "security.selinux" $_i 2>/dev/null)
+	while IFS= read -r -d '' _i; do
+		_attr=$(getfattr -m "security.selinux" "$_i" 2>/dev/null)
 		if [ -z "$_attr" ]; then
-			restorecon $_i;
+			restorecon "$_i";
 		fi
-	done
+	done < <(find "$_path" -print0)
 }
 
 check_fence_kdump_config()
diff --git a/SOURCES/kexec-kdump-howto.txt b/SOURCES/kexec-kdump-howto.txt
index 47e11c2..c39ca72 100644
--- a/SOURCES/kexec-kdump-howto.txt
+++ b/SOURCES/kexec-kdump-howto.txt
@@ -621,6 +621,9 @@ If /etc/kdump/post.d directory exist, All files in the directory are
 collectively sorted and executed in lexical order, before binary or script
 specified kdump_post parameter is executed.
 
+In these scripts, the reference to the storage or network device should adhere
+to the section 'Supported dump target types and requirements'
+
 Kdump Pre-Capture Executable
 ----------------------------
 
@@ -634,6 +637,9 @@ kdump_pre parameter is executed.
 Even if the binary or script in /etc/kdump/pre.d directory returns non 0
 exit status, the processing is continued.
 
+In these scripts, the reference to the storage or network device should adhere
+to the section 'Supported dump target types and requirements'
+
 Extra Binaries
 --------------
 
diff --git a/SOURCES/kexec-tools-2.0.20-1-printk-add-support-for-lockless-ringbuffer.patch b/SOURCES/kexec-tools-2.0.20-1-printk-add-support-for-lockless-ringbuffer.patch
new file mode 100644
index 0000000..dbb2081
--- /dev/null
+++ b/SOURCES/kexec-tools-2.0.20-1-printk-add-support-for-lockless-ringbuffer.patch
@@ -0,0 +1,492 @@
+From 4149df9005f2cdd2ecf70058dfe7d72f48c3a68c Mon Sep 17 00:00:00 2001
+From: John Ogness <john.ogness@linutronix.de>
+Date: Wed, 25 Nov 2020 23:26:59 +0106
+Subject: [PATCH] printk: add support for lockless ringbuffer
+
+Linux 5.10 moved to a new lockless ringbuffer. The new ringbuffer
+is structured completely different to the previous iterations.
+Add support for retrieving the ringbuffer using vmcoreinfo. The
+new ringbuffer is detected based on the availability of the
+"prb" symbol.
+
+Signed-off-by: John Ogness <john.ogness@linutronix.de>
+Signed-off-by: Simon Horman <horms@verge.net.au>
+---
+ util_lib/elf_info.c | 438 +++++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 437 insertions(+), 1 deletion(-)
+
+diff --git a/util_lib/elf_info.c b/util_lib/elf_info.c
+index 7803a94..2f23a44 100644
+--- a/util_lib/elf_info.c
++++ b/util_lib/elf_info.c
+@@ -27,6 +27,32 @@ static int num_pt_loads;
+ 
+ static char osrelease[4096];
+ 
++/* VMCOREINFO symbols for lockless printk ringbuffer */
++static loff_t prb_vaddr;
++static size_t printk_ringbuffer_sz;
++static size_t prb_desc_sz;
++static size_t printk_info_sz;
++static uint64_t printk_ringbuffer_desc_ring_offset;
++static uint64_t printk_ringbuffer_text_data_ring_offset;
++static uint64_t prb_desc_ring_count_bits_offset;
++static uint64_t prb_desc_ring_descs_offset;
++static uint64_t prb_desc_ring_infos_offset;
++static uint64_t prb_data_ring_size_bits_offset;
++static uint64_t prb_data_ring_data_offset;
++static uint64_t prb_desc_ring_head_id_offset;
++static uint64_t prb_desc_ring_tail_id_offset;
++static uint64_t atomic_long_t_counter_offset;
++static uint64_t prb_desc_state_var_offset;
++static uint64_t prb_desc_info_offset;
++static uint64_t prb_desc_text_blk_lpos_offset;
++static uint64_t prb_data_blk_lpos_begin_offset;
++static uint64_t prb_data_blk_lpos_next_offset;
++static uint64_t printk_info_seq_offset;
++static uint64_t printk_info_caller_id_offset;
++static uint64_t printk_info_ts_nsec_offset;
++static uint64_t printk_info_level_offset;
++static uint64_t printk_info_text_len_offset;
++
+ static loff_t log_buf_vaddr;
+ static loff_t log_end_vaddr;
+ static loff_t log_buf_len_vaddr;
+@@ -304,6 +330,7 @@ void scan_vmcoreinfo(char *start, size_t size)
+ 		size_t len;
+ 		loff_t *vaddr;
+ 	} symbol[] = {
++		SYMBOL(prb),
+ 		SYMBOL(log_buf),
+ 		SYMBOL(log_end),
+ 		SYMBOL(log_buf_len),
+@@ -361,6 +388,119 @@ void scan_vmcoreinfo(char *start, size_t size)
+ 			*symbol[i].vaddr = vaddr;
+ 		}
+ 
++		str = "SIZE(printk_ringbuffer)=";
++		if (memcmp(str, pos, strlen(str)) == 0)
++			printk_ringbuffer_sz = strtoull(pos + strlen(str),
++							NULL, 10);
++
++		str = "SIZE(prb_desc)=";
++		if (memcmp(str, pos, strlen(str)) == 0)
++			prb_desc_sz = strtoull(pos + strlen(str), NULL, 10);
++
++		str = "SIZE(printk_info)=";
++		if (memcmp(str, pos, strlen(str)) == 0)
++			printk_info_sz = strtoull(pos + strlen(str), NULL, 10);
++
++		str = "OFFSET(printk_ringbuffer.desc_ring)=";
++		if (memcmp(str, pos, strlen(str)) == 0)
++			printk_ringbuffer_desc_ring_offset =
++				strtoull(pos + strlen(str), NULL, 10);
++
++		str = "OFFSET(printk_ringbuffer.text_data_ring)=";
++		if (memcmp(str, pos, strlen(str)) == 0)
++			printk_ringbuffer_text_data_ring_offset =
++				strtoull(pos + strlen(str), NULL, 10);
++
++		str = "OFFSET(prb_desc_ring.count_bits)=";
++		if (memcmp(str, pos, strlen(str)) == 0)
++			prb_desc_ring_count_bits_offset =
++				strtoull(pos + strlen(str), NULL, 10);
++
++		str = "OFFSET(prb_desc_ring.descs)=";
++		if (memcmp(str, pos, strlen(str)) == 0)
++			prb_desc_ring_descs_offset =
++				strtoull(pos + strlen(str), NULL, 10);
++
++		str = "OFFSET(prb_desc_ring.infos)=";
++		if (memcmp(str, pos, strlen(str)) == 0)
++			prb_desc_ring_infos_offset =
++				strtoull(pos + strlen(str), NULL, 10);
++
++		str = "OFFSET(prb_data_ring.size_bits)=";
++		if (memcmp(str, pos, strlen(str)) == 0)
++			prb_data_ring_size_bits_offset =
++				strtoull(pos + strlen(str), NULL, 10);
++
++		str = "OFFSET(prb_data_ring.data)=";
++		if (memcmp(str, pos, strlen(str)) == 0)
++			prb_data_ring_data_offset =
++				strtoull(pos + strlen(str), NULL, 10);
++
++		str = "OFFSET(prb_desc_ring.head_id)=";
++		if (memcmp(str, pos, strlen(str)) == 0)
++			prb_desc_ring_head_id_offset =
++				strtoull(pos + strlen(str), NULL, 10);
++
++		str = "OFFSET(prb_desc_ring.tail_id)=";
++		if (memcmp(str, pos, strlen(str)) == 0)
++			prb_desc_ring_tail_id_offset =
++				strtoull(pos + strlen(str), NULL, 10);
++
++		str = "OFFSET(atomic_long_t.counter)=";
++		if (memcmp(str, pos, strlen(str)) == 0)
++			atomic_long_t_counter_offset =
++				strtoull(pos + strlen(str), NULL, 10);
++
++		str = "OFFSET(prb_desc.state_var)=";
++		if (memcmp(str, pos, strlen(str)) == 0)
++			prb_desc_state_var_offset =
++				strtoull(pos + strlen(str), NULL, 10);
++
++		str = "OFFSET(prb_desc.info)=";
++		if (memcmp(str, pos, strlen(str)) == 0)
++			prb_desc_info_offset =
++				strtoull(pos + strlen(str), NULL, 10);
++
++		str = "OFFSET(prb_desc.text_blk_lpos)=";
++		if (memcmp(str, pos, strlen(str)) == 0)
++			prb_desc_text_blk_lpos_offset =
++				strtoull(pos + strlen(str), NULL, 10);
++
++		str = "OFFSET(prb_data_blk_lpos.begin)=";
++		if (memcmp(str, pos, strlen(str)) == 0)
++			prb_data_blk_lpos_begin_offset =
++				strtoull(pos + strlen(str), NULL, 10);
++
++		str = "OFFSET(prb_data_blk_lpos.next)=";
++		if (memcmp(str, pos, strlen(str)) == 0)
++			prb_data_blk_lpos_next_offset =
++				strtoull(pos + strlen(str), NULL, 10);
++
++		str = "OFFSET(printk_info.seq)=";
++		if (memcmp(str, pos, strlen(str)) == 0)
++			printk_info_seq_offset =
++				strtoull(pos + strlen(str), NULL, 10);
++
++		str = "OFFSET(printk_info.caller_id)=";
++		if (memcmp(str, pos, strlen(str)) == 0)
++			printk_info_caller_id_offset =
++				strtoull(pos + strlen(str), NULL, 10);
++
++		str = "OFFSET(printk_info.ts_nsec)=";
++		if (memcmp(str, pos, strlen(str)) == 0)
++			printk_info_ts_nsec_offset =
++				strtoull(pos + strlen(str), NULL, 10);
++
++		str = "OFFSET(printk_info.level)=";
++		if (memcmp(str, pos, strlen(str)) == 0)
++			printk_info_level_offset =
++				strtoull(pos + strlen(str), NULL, 10);
++
++		str = "OFFSET(printk_info.text_len)=";
++		if (memcmp(str, pos, strlen(str)) == 0)
++			printk_info_text_len_offset =
++				strtoull(pos + strlen(str), NULL, 10);
++
+ 		/* Check for "SIZE(printk_log)" or older "SIZE(log)=" */
+ 		str = "SIZE(log)=";
+ 		if (memcmp(str, pos, strlen(str)) == 0)
+@@ -746,9 +886,305 @@ static void dump_dmesg_structured(int fd, void (*handler)(char*, unsigned int))
+ 		handler(out_buf, len);
+ }
+ 
++/* convenience struct for passing many values to helper functions */
++struct prb_map {
++	char		*prb;
++
++	char		*desc_ring;
++	unsigned long	desc_ring_count;
++	char		*descs;
++
++	char		*infos;
++
++	char		*text_data_ring;
++	unsigned long	text_data_ring_size;
++	char		*text_data;
++};
++
++/*
++ * desc_state and DESC_* definitions taken from kernel source:
++ *
++ * kernel/printk/printk_ringbuffer.h
++ *
++ * DESC_* definitions modified to provide 32-bit and 64-bit variants.
++ */
++
++/* The possible responses of a descriptor state-query. */
++enum desc_state {
++	desc_miss	=  -1,	/* ID mismatch (pseudo state) */
++	desc_reserved	= 0x0,	/* reserved, in use by writer */
++	desc_committed	= 0x1,	/* committed by writer, could get reopened */
++	desc_finalized	= 0x2,	/* committed, no further modification allowed */
++	desc_reusable	= 0x3,	/* free, not yet used by any writer */
++};
++
++#define DESC_SV_BITS		(sizeof(uint64_t) * 8)
++#define DESC_FLAGS_SHIFT	(DESC_SV_BITS - 2)
++#define DESC_FLAGS_MASK		(3UL << DESC_FLAGS_SHIFT)
++#define DESC_STATE(sv)		(3UL & (sv >> DESC_FLAGS_SHIFT))
++#define DESC_ID_MASK		(~DESC_FLAGS_MASK)
++#define DESC_ID(sv)		((sv) & DESC_ID_MASK)
++
++#define DESC32_SV_BITS		(sizeof(uint32_t) * 8)
++#define DESC32_FLAGS_SHIFT	(DESC32_SV_BITS - 2)
++#define DESC32_FLAGS_MASK	(3UL << DESC32_FLAGS_SHIFT)
++#define DESC32_STATE(sv)	(3UL & (sv >> DESC32_FLAGS_SHIFT))
++#define DESC32_ID_MASK		(~DESC32_FLAGS_MASK)
++#define DESC32_ID(sv)		((sv) & DESC32_ID_MASK)
++
++/*
++ * get_desc_state() taken from kernel source:
++ *
++ * kernel/printk/printk_ringbuffer.c
++ *
++ * get_desc32_state() added as 32-bit variant.
++ */
++
++/* Query the state of a descriptor. */
++static enum desc_state get_desc_state(unsigned long id,
++				      uint64_t state_val)
++{
++	if (id != DESC_ID(state_val))
++		return desc_miss;
++
++	return DESC_STATE(state_val);
++}
++
++static enum desc_state get_desc32_state(unsigned long id,
++					uint64_t state_val)
++{
++	if (id != DESC32_ID(state_val))
++		return desc_miss;
++
++	return DESC32_STATE(state_val);
++}
++
++static bool record_committed(unsigned long id, uint64_t state_var)
++{
++	enum desc_state state;
++
++	if (machine_pointer_bits() == 32)
++		state = get_desc32_state(id, state_var);
++	else
++		state = get_desc_state(id, state_var);
++
++	return (state == desc_committed || state == desc_finalized);
++}
++
++static uint64_t id_inc(uint64_t id)
++{
++	id++;
++
++	if (machine_pointer_bits() == 32)
++		return (id & DESC32_ID_MASK);
++
++	return (id & DESC_ID_MASK);
++}
++
++static uint64_t get_ulong(char *addr)
++{
++	if (machine_pointer_bits() == 32)
++		return struct_val_u32(addr, 0);
++	return struct_val_u64(addr, 0);
++}
++
++static uint64_t sizeof_ulong(void)
++{
++	return (machine_pointer_bits() >> 3);
++}
++
++static void dump_record(struct prb_map *m, unsigned long id,
++			void (*handler)(char*, unsigned int))
++{
++#define OUT_BUF_SIZE	4096
++	char out_buf[OUT_BUF_SIZE];
++	imaxdiv_t imaxdiv_usec;
++	imaxdiv_t imaxdiv_sec;
++	uint32_t offset = 0;
++	unsigned short len;
++	uint64_t state_var;
++	uint64_t ts_nsec;
++	uint64_t begin;
++	uint64_t next;
++	char *info;
++	char *text;
++	char *desc;
++	int i;
++
++	desc = m->descs + ((id % m->desc_ring_count) * prb_desc_sz);
++	info = m->infos + ((id % m->desc_ring_count) * printk_info_sz);
++
++	/* skip non-committed record */
++	state_var = get_ulong(desc + prb_desc_state_var_offset +
++					atomic_long_t_counter_offset);
++	if (!record_committed(id, state_var))
++		return;
++
++	begin = get_ulong(desc + prb_desc_text_blk_lpos_offset +
++			  prb_data_blk_lpos_begin_offset) %
++		m->text_data_ring_size;
++	next = get_ulong(desc + prb_desc_text_blk_lpos_offset +
++			 prb_data_blk_lpos_next_offset) %
++	       m->text_data_ring_size;
++
++	ts_nsec = struct_val_u64(info, printk_info_ts_nsec_offset);
++	imaxdiv_sec = imaxdiv(ts_nsec, 1000000000);
++	imaxdiv_usec = imaxdiv(imaxdiv_sec.rem, 1000);
++
++	offset += sprintf(out_buf + offset, "[%5llu.%06llu] ",
++		(long long unsigned int)imaxdiv_sec.quot,
++		(long long unsigned int)imaxdiv_usec.quot);
++
++	/* skip data-less text blocks */
++	if (begin == next)
++		goto out;
++
++	len = struct_val_u16(info, printk_info_text_len_offset);
++
++	/* handle wrapping data block */
++	if (begin > next)
++		begin = 0;
++
++	/* skip over descriptor ID */
++	begin += sizeof_ulong();
++
++	/* handle truncated messages */
++	if (next - begin < len)
++		len = next - begin;
++
++	text = m->text_data + begin;
++
++	/* escape non-printable characters */
++	for (i = 0; i < len; i++) {
++		unsigned char c = text[i];
++
++		if (!isprint(c) && !isspace(c))
++			offset += sprintf(out_buf + offset, "\\x%02x", c);
++		else
++			out_buf[offset++] = c;
++
++		if (offset >= OUT_BUF_SIZE - 64) {
++			if (handler)
++				handler(out_buf, offset);
++			offset = 0;
++		}
++	}
++out:
++	out_buf[offset++] = '\n';
++
++	if (offset && handler)
++		handler(out_buf, offset);
++}
++
++/*
++ *  Handle the lockless printk_ringbuffer.
++ */
++static void dump_dmesg_lockless(int fd, void (*handler)(char*, unsigned int))
++{
++	struct prb_map m;
++	uint64_t head_id;
++	uint64_t tail_id;
++	uint64_t kaddr;
++	uint64_t id;
++	int ret;
++
++	/* setup printk_ringbuffer */
++	kaddr = read_file_pointer(fd, vaddr_to_offset(prb_vaddr));
++	m.prb = calloc(1, printk_ringbuffer_sz);
++	if (!m.prb) {
++		fprintf(stderr, "Failed to malloc %lu bytes for prb: %s\n",
++			printk_ringbuffer_sz, strerror(errno));
++		exit(64);
++	}
++	ret = pread(fd, m.prb, printk_ringbuffer_sz, vaddr_to_offset(kaddr));
++	if (ret != printk_ringbuffer_sz) {
++		fprintf(stderr, "Failed to read prb of size %lu bytes: %s\n",
++			printk_ringbuffer_sz, strerror(errno));
++		exit(65);
++	}
++
++	/* setup descriptor ring */
++	m.desc_ring = m.prb + printk_ringbuffer_desc_ring_offset;
++	m.desc_ring_count = 1 << struct_val_u32(m.desc_ring,
++					prb_desc_ring_count_bits_offset);
++	kaddr = get_ulong(m.desc_ring + prb_desc_ring_descs_offset);
++	m.descs = calloc(1, prb_desc_sz * m.desc_ring_count);
++	if (!m.descs) {
++		fprintf(stderr, "Failed to malloc %lu bytes for descs: %s\n",
++			prb_desc_sz * m.desc_ring_count, strerror(errno));
++		exit(64);
++	}
++	ret = pread(fd, m.descs, prb_desc_sz * m.desc_ring_count,
++		    vaddr_to_offset(kaddr));
++	if (ret != prb_desc_sz * m.desc_ring_count) {
++		fprintf(stderr,
++			"Failed to read descs of size %lu bytes: %s\n",
++			prb_desc_sz * m.desc_ring_count, strerror(errno));
++		exit(65);
++	}
++
++	/* setup info ring */
++	kaddr = get_ulong(m.prb + prb_desc_ring_infos_offset);
++	m.infos = calloc(1, printk_info_sz * m.desc_ring_count);
++	if (!m.infos) {
++		fprintf(stderr, "Failed to malloc %lu bytes for infos: %s\n",
++			printk_info_sz * m.desc_ring_count, strerror(errno));
++		exit(64);
++	}
++	ret = pread(fd, m.infos, printk_info_sz * m.desc_ring_count,
++		    vaddr_to_offset(kaddr));
++	if (ret != printk_info_sz * m.desc_ring_count) {
++		fprintf(stderr,
++			"Failed to read infos of size %lu bytes: %s\n",
++			printk_info_sz * m.desc_ring_count, strerror(errno));
++		exit(65);
++	}
++
++	/* setup text data ring */
++	m.text_data_ring = m.prb + printk_ringbuffer_text_data_ring_offset;
++	m.text_data_ring_size = 1 << struct_val_u32(m.text_data_ring,
++					prb_data_ring_size_bits_offset);
++	kaddr = get_ulong(m.text_data_ring + prb_data_ring_data_offset);
++	m.text_data = calloc(1, m.text_data_ring_size);
++	if (!m.text_data) {
++		fprintf(stderr,
++			"Failed to malloc %lu bytes for text_data: %s\n",
++			m.text_data_ring_size, strerror(errno));
++		exit(64);
++	}
++	ret = pread(fd, m.text_data, m.text_data_ring_size,
++		    vaddr_to_offset(kaddr));
++	if (ret != m.text_data_ring_size) {
++		fprintf(stderr,
++			"Failed to read text_data of size %lu bytes: %s\n",
++			m.text_data_ring_size, strerror(errno));
++		exit(65);
++	}
++
++	/* ready to go */
++
++	tail_id = get_ulong(m.desc_ring + prb_desc_ring_tail_id_offset +
++						atomic_long_t_counter_offset);
++	head_id = get_ulong(m.desc_ring + prb_desc_ring_head_id_offset +
++						atomic_long_t_counter_offset);
++
++	for (id = tail_id; id != head_id; id = id_inc(id))
++		dump_record(&m, id, handler);
++
++	/* dump head record */
++	dump_record(&m, id, handler);
++
++	free(m.text_data);
++	free(m.infos);
++	free(m.descs);
++	free(m.prb);
++}
++
+ void dump_dmesg(int fd, void (*handler)(char*, unsigned int))
+ {
+-	if (log_first_idx_vaddr)
++	if (prb_vaddr)
++		dump_dmesg_lockless(fd, handler);
++	else if (log_first_idx_vaddr)
+ 		dump_dmesg_structured(fd, handler);
+ 	else
+ 		dump_dmesg_legacy(fd, handler);
+-- 
+2.31.1
+
diff --git a/SOURCES/kexec-tools-2.0.20-2-printk-Use-ULL-suffix-for-64-bit-constants.patch b/SOURCES/kexec-tools-2.0.20-2-printk-Use-ULL-suffix-for-64-bit-constants.patch
new file mode 100644
index 0000000..f40cd3e
--- /dev/null
+++ b/SOURCES/kexec-tools-2.0.20-2-printk-Use-ULL-suffix-for-64-bit-constants.patch
@@ -0,0 +1,65 @@
+From 07b272a07164b902acd7d12794f7be033ebf4525 Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Wed, 17 Mar 2021 13:14:49 +0100
+Subject: [PATCH] printk: Use ULL suffix for 64-bit constants
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+When compiling for 32-bit:
+
+    util_lib/elf_info.c: In function ‘get_desc_state’:
+    util_lib/elf_info.c:923:31: warning: left shift count >= width of type [-Wshift-count-overflow]
+      923 | #define DESC_FLAGS_MASK  (3UL << DESC_FLAGS_SHIFT)
+	  |                               ^~
+    util_lib/elf_info.c:925:25: note: in expansion of macro ‘DESC_FLAGS_MASK’
+      925 | #define DESC_ID_MASK  (~DESC_FLAGS_MASK)
+	  |                         ^~~~~~~~~~~~~~~
+    util_lib/elf_info.c:926:30: note: in expansion of macro ‘DESC_ID_MASK’
+      926 | #define DESC_ID(sv)  ((sv) & DESC_ID_MASK)
+	  |                              ^~~~~~~~~~~~
+    util_lib/elf_info.c:947:12: note: in expansion of macro ‘DESC_ID’
+      947 |  if (id != DESC_ID(state_val))
+	  |            ^~~~~~~
+    util_lib/elf_info.c: In function ‘id_inc’:
+    util_lib/elf_info.c:923:31: warning: left shift count >= width of type [-Wshift-count-overflow]
+      923 | #define DESC_FLAGS_MASK  (3UL << DESC_FLAGS_SHIFT)
+	  |                               ^~
+    util_lib/elf_info.c:925:25: note: in expansion of macro ‘DESC_FLAGS_MASK’
+      925 | #define DESC_ID_MASK  (~DESC_FLAGS_MASK)
+	  |                         ^~~~~~~~~~~~~~~
+    util_lib/elf_info.c:981:15: note: in expansion of macro ‘DESC_ID_MASK’
+      981 |  return (id & DESC_ID_MASK);
+	  |               ^~~~~~~~~~~~
+
+Indeed, "unsigned long" constants are 32-bit on 32-bit platforms, and
+64-bit on 64-bit platforms.
+
+Fix this by using a "ULL" suffix instead.
+
+Fixes: 4149df9005f2cdd2 ("printk: add support for lockless ringbuffer")
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Reviewed-by: John Ogness <john.ogness@linutronix.de>
+Signed-off-by: Simon Horman <horms@verge.net.au>
+---
+ util_lib/elf_info.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/util_lib/elf_info.c b/util_lib/elf_info.c
+index 2f23a44..7c0a2c3 100644
+--- a/util_lib/elf_info.c
++++ b/util_lib/elf_info.c
+@@ -920,8 +920,8 @@ enum desc_state {
+ 
+ #define DESC_SV_BITS		(sizeof(uint64_t) * 8)
+ #define DESC_FLAGS_SHIFT	(DESC_SV_BITS - 2)
+-#define DESC_FLAGS_MASK		(3UL << DESC_FLAGS_SHIFT)
+-#define DESC_STATE(sv)		(3UL & (sv >> DESC_FLAGS_SHIFT))
++#define DESC_FLAGS_MASK		(3ULL << DESC_FLAGS_SHIFT)
++#define DESC_STATE(sv)		(3ULL & (sv >> DESC_FLAGS_SHIFT))
+ #define DESC_ID_MASK		(~DESC_FLAGS_MASK)
+ #define DESC_ID(sv)		((sv) & DESC_ID_MASK)
+ 
+-- 
+2.31.1
+
diff --git a/SOURCES/kexec-tools-2.0.20-3-printk-Use-zu-to-format-size_t.patch b/SOURCES/kexec-tools-2.0.20-3-printk-Use-zu-to-format-size_t.patch
new file mode 100644
index 0000000..29ac6fc
--- /dev/null
+++ b/SOURCES/kexec-tools-2.0.20-3-printk-Use-zu-to-format-size_t.patch
@@ -0,0 +1,68 @@
+From 82f7de2724c42a6aecc0cff93881b3dfd09363ce Mon Sep 17 00:00:00 2001
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+Date: Wed, 17 Mar 2021 13:14:50 +0100
+Subject: [PATCH] printk: Use %zu to format size_t
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+When compiling for 32-bit:
+
+    util_lib/elf_info.c: In function ‘dump_dmesg_lockless’:
+    util_lib/elf_info.c:1095:39: warning: format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 3 has type ‘size_t’ {aka ‘unsigned int’} [-Wformat=]
+     1095 |   fprintf(stderr, "Failed to malloc %lu bytes for prb: %s\n",
+	  |                                     ~~^
+	  |                                       |
+	  |                                       long unsigned int
+	  |                                     %u
+     1096 |    printk_ringbuffer_sz, strerror(errno));
+	  |    ~~~~~~~~~~~~~~~~~~~~
+	  |    |
+	  |    size_t {aka unsigned int}
+    util_lib/elf_info.c:1101:49: warning: format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 3 has type ‘size_t’ {aka ‘unsigned int’} [-Wformat=]
+     1101 |   fprintf(stderr, "Failed to read prb of size %lu bytes: %s\n",
+	  |                                               ~~^
+	  |                                                 |
+	  |                                                 long unsigned int
+	  |                                               %u
+     1102 |    printk_ringbuffer_sz, strerror(errno));
+	  |    ~~~~~~~~~~~~~~~~~~~~
+	  |    |
+	  |    size_t {aka unsigned int}
+
+Indeed, "size_t" is "unsigned int" on 32-bit platforms, and "unsigned
+long" on 64-bit platforms.
+
+Fix this by formatting using "%zu".
+
+Fixes: 4149df9005f2cdd2 ("printk: add support for lockless ringbuffer")
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Reviewed-by: John Ogness <john.ogness@linutronix.de>
+Signed-off-by: Simon Horman <horms@verge.net.au>
+---
+ util_lib/elf_info.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/util_lib/elf_info.c b/util_lib/elf_info.c
+index 7c0a2c3..676926c 100644
+--- a/util_lib/elf_info.c
++++ b/util_lib/elf_info.c
+@@ -1092,13 +1092,13 @@ static void dump_dmesg_lockless(int fd, void (*handler)(char*, unsigned int))
+ 	kaddr = read_file_pointer(fd, vaddr_to_offset(prb_vaddr));
+ 	m.prb = calloc(1, printk_ringbuffer_sz);
+ 	if (!m.prb) {
+-		fprintf(stderr, "Failed to malloc %lu bytes for prb: %s\n",
++		fprintf(stderr, "Failed to malloc %zu bytes for prb: %s\n",
+ 			printk_ringbuffer_sz, strerror(errno));
+ 		exit(64);
+ 	}
+ 	ret = pread(fd, m.prb, printk_ringbuffer_sz, vaddr_to_offset(kaddr));
+ 	if (ret != printk_ringbuffer_sz) {
+-		fprintf(stderr, "Failed to read prb of size %lu bytes: %s\n",
++		fprintf(stderr, "Failed to read prb of size %zu bytes: %s\n",
+ 			printk_ringbuffer_sz, strerror(errno));
+ 		exit(65);
+ 	}
+-- 
+2.31.1
+
diff --git a/SOURCES/kexec-tools-2.0.20-makedumpfile-Add-dry-run-option-to-prevent-writing.patch b/SOURCES/kexec-tools-2.0.20-makedumpfile-Add-dry-run-option-to-prevent-writing.patch
deleted file mode 100644
index 631d039..0000000
--- a/SOURCES/kexec-tools-2.0.20-makedumpfile-Add-dry-run-option-to-prevent-writing.patch
+++ /dev/null
@@ -1,177 +0,0 @@
-From 3422e1d6bc3511c5af9cb05ba74ad97dd93ffd7f Mon Sep 17 00:00:00 2001
-From: Julien Thierry <jthierry@redhat.com>
-Date: Tue, 24 Nov 2020 10:45:24 +0000
-Subject: [PATCH] [PATCH 1/2] Add --dry-run option to prevent writing the
- dumpfile
-
-Add a --dry-run option to run all operations without writing the
-dump to the output file.
-
-Signed-off-by: Julien Thierry <jthierry@redhat.com>
-Signed-off-by: Kazuhito Hagio <k-hagio-ab@nec.com>
----
- makedumpfile.8 |  6 ++++++
- makedumpfile.c | 37 ++++++++++++++++++++++++++++++-------
- makedumpfile.h |  2 ++
- print_info.c   |  3 +++
- 4 files changed, 41 insertions(+), 7 deletions(-)
-
-diff --git a/makedumpfile-1.6.8/makedumpfile.8 b/makedumpfile-1.6.8/makedumpfile.8
-index b68a7e3..5e902cd 100644
---- a/makedumpfile-1.6.8/makedumpfile.8
-+++ b/makedumpfile-1.6.8/makedumpfile.8
-@@ -637,6 +637,12 @@ Show the version of makedumpfile.
- Only check whether the command-line parameters are valid or not, and exit.
- Preferable to be given as the first parameter.
- 
-+.TP
-+\fB\-\-dry-run\fR
-+Do not write the output dump file while still performing operations specified
-+by other options.
-+This option cannot be used with the --dump-dmesg, --reassemble and -g options.
-+
- .SH ENVIRONMENT VARIABLES
- 
- .TP 8
-diff --git a/makedumpfile-1.6.8/makedumpfile.c b/makedumpfile-1.6.8/makedumpfile.c
-index ecd63fa..8c80c49 100644
---- a/makedumpfile-1.6.8/makedumpfile.c
-+++ b/makedumpfile-1.6.8/makedumpfile.c
-@@ -1372,6 +1372,8 @@ open_dump_file(void)
- 	if (info->flag_flatten) {
- 		fd = STDOUT_FILENO;
- 		info->name_dumpfile = filename_stdout;
-+	} else if (info->flag_dry_run) {
-+		fd = -1;
- 	} else if ((fd = open(info->name_dumpfile, open_flags,
- 	    S_IRUSR|S_IWUSR)) < 0) {
- 		ERRMSG("Can't open the dump file(%s). %s\n",
-@@ -4711,6 +4713,9 @@ write_and_check_space(int fd, void *buf, size_t buf_size, char *file_name)
- {
- 	int status, written_size = 0;
- 
-+	if (info->flag_dry_run)
-+		return TRUE;
-+
- 	while (written_size < buf_size) {
- 		status = write(fd, buf + written_size,
- 				   buf_size - written_size);
-@@ -4748,13 +4753,12 @@ write_buffer(int fd, off_t offset, void *buf, size_t buf_size, char *file_name)
- 		}
- 		if (!write_and_check_space(fd, &fdh, sizeof(fdh), file_name))
- 			return FALSE;
--	} else {
--		if (lseek(fd, offset, SEEK_SET) == failed) {
--			ERRMSG("Can't seek the dump file(%s). %s\n",
--			    file_name, strerror(errno));
--			return FALSE;
--		}
-+	} else if (!info->flag_dry_run &&
-+		    lseek(fd, offset, SEEK_SET) == failed) {
-+		ERRMSG("Can't seek the dump file(%s). %s\n", file_name, strerror(errno));
-+		return FALSE;
- 	}
-+
- 	if (!write_and_check_space(fd, buf, buf_size, file_name))
- 		return FALSE;
- 
-@@ -9112,7 +9116,7 @@ close_dump_memory(void)
- void
- close_dump_file(void)
- {
--	if (info->flag_flatten)
-+	if (info->flag_flatten || info->flag_dry_run)
- 		return;
- 
- 	if (close(info->fd_dumpfile) < 0)
-@@ -10985,6 +10989,11 @@ check_param_for_generating_vmcoreinfo(int argc, char *argv[])
- 
- 		return FALSE;
- 
-+	if (info->flag_dry_run) {
-+		MSG("--dry-run cannot be used with -g.\n");
-+		return FALSE;
-+	}
-+
- 	return TRUE;
- }
- 
-@@ -11029,6 +11038,11 @@ check_param_for_reassembling_dumpfile(int argc, char *argv[])
- 	    || info->flag_exclude_xen_dom || info->flag_split)
- 		return FALSE;
- 
-+	if (info->flag_dry_run) {
-+		MSG("--dry-run cannot be used with --reassemble.\n");
-+		return FALSE;
-+	}
-+
- 	if ((info->splitting_info
- 	    = malloc(sizeof(struct splitting_info) * info->num_dumpfile))
- 	    == NULL) {
-@@ -11057,6 +11071,11 @@ check_param_for_creating_dumpfile(int argc, char *argv[])
- 	    || (info->flag_read_vmcoreinfo && info->name_xen_syms))
- 		return FALSE;
- 
-+	if (info->flag_dry_run && info->flag_dmesg) {
-+		MSG("--dry-run cannot be used with --dump-dmesg.\n");
-+		return FALSE;
-+	}
-+
- 	if (info->flag_flatten && info->flag_split)
- 		return FALSE;
- 
-@@ -11520,6 +11539,7 @@ static struct option longopts[] = {
- 	{"work-dir", required_argument, NULL, OPT_WORKING_DIR},
- 	{"num-threads", required_argument, NULL, OPT_NUM_THREADS},
- 	{"check-params", no_argument, NULL, OPT_CHECK_PARAMS},
-+	{"dry-run", no_argument, NULL, OPT_DRY_RUN},
- 	{0, 0, 0, 0}
- };
- 
-@@ -11686,6 +11706,9 @@ main(int argc, char *argv[])
- 			info->flag_check_params = TRUE;
- 			message_level = DEFAULT_MSG_LEVEL;
- 			break;
-+		case OPT_DRY_RUN:
-+			info->flag_dry_run = TRUE;
-+			break;
- 		case '?':
- 			MSG("Commandline parameter is invalid.\n");
- 			MSG("Try `makedumpfile --help' for more information.\n");
-diff --git a/makedumpfile-1.6.8/makedumpfile.h b/makedumpfile-1.6.8/makedumpfile.h
-index 5f50080..4c4222c 100644
---- a/makedumpfile-1.6.8/makedumpfile.h
-+++ b/makedumpfile-1.6.8/makedumpfile.h
-@@ -1322,6 +1322,7 @@ struct DumpInfo {
- 	int		flag_vmemmap;        /* kernel supports vmemmap address space */
- 	int		flag_excludevm;      /* -e - excluding unused vmemmap pages */
- 	int		flag_use_count;      /* _refcount is named _count in struct page */
-+	int		flag_dry_run;        /* do not create a vmcore file */
- 	unsigned long	vaddr_for_vtop;      /* virtual address for debugging */
- 	long		page_size;           /* size of page */
- 	long		page_shift;
-@@ -2425,6 +2426,7 @@ struct elf_prstatus {
- #define OPT_NUM_THREADS         OPT_START+16
- #define OPT_PARTIAL_DMESG       OPT_START+17
- #define OPT_CHECK_PARAMS        OPT_START+18
-+#define OPT_DRY_RUN             OPT_START+19
- 
- /*
-  * Function Prototype.
-diff --git a/makedumpfile-1.6.8/print_info.c b/makedumpfile-1.6.8/print_info.c
-index e0c38b4..d2b0cb7 100644
---- a/makedumpfile-1.6.8/print_info.c
-+++ b/makedumpfile-1.6.8/print_info.c
-@@ -308,6 +308,9 @@ print_usage(void)
- 	MSG("      the crashkernel range, then calculates the page number of different kind per\n");
- 	MSG("      vmcoreinfo. So currently /proc/kcore need be specified explicitly.\n");
- 	MSG("\n");
-+	MSG("  [--dry-run]:\n");
-+	MSG("      This option runs makedumpfile without writting output dump file.\n");
-+	MSG("\n");
- 	MSG("  [-D]:\n");
- 	MSG("      Print debugging message.\n");
- 	MSG("\n");
--- 
-2.29.2
-
diff --git a/SOURCES/kexec-tools-2.0.20-makedumpfile-Add-shorthand-show-stats-option-to-show.patch b/SOURCES/kexec-tools-2.0.20-makedumpfile-Add-shorthand-show-stats-option-to-show.patch
deleted file mode 100644
index 5e935f0..0000000
--- a/SOURCES/kexec-tools-2.0.20-makedumpfile-Add-shorthand-show-stats-option-to-show.patch
+++ /dev/null
@@ -1,107 +0,0 @@
-From 6f3e75a558ed50d6ff0b42e3f61c099b2005b7bb Mon Sep 17 00:00:00 2001
-From: Julien Thierry <jthierry@redhat.com>
-Date: Tue, 24 Nov 2020 10:45:25 +0000
-Subject: [PATCH] [PATCH 2/2] Add shorthand --show-stats option to show report
- stats
-
-Provide shorthand --show-stats option to enable report messages
-without needing to set a particular value for message-level.
-
-Signed-off-by: Julien Thierry <jthierry@redhat.com>
-Signed-off-by: Kazuhito Hagio <k-hagio-ab@nec.com>
----
- makedumpfile.8 | 5 +++++
- makedumpfile.c | 9 ++++++++-
- makedumpfile.h | 1 +
- print_info.c   | 7 ++++++-
- 4 files changed, 20 insertions(+), 2 deletions(-)
-
-diff --git a/makedumpfile-1.6.8/makedumpfile.8 b/makedumpfile-1.6.8/makedumpfile.8
-index 5e902cd..dcca2dd 100644
---- a/makedumpfile-1.6.8/makedumpfile.8
-+++ b/makedumpfile-1.6.8/makedumpfile.8
-@@ -643,6 +643,11 @@ Do not write the output dump file while still performing operations specified
- by other options.
- This option cannot be used with the --dump-dmesg, --reassemble and -g options.
- 
-+.TP
-+\fB\-\-show-stats\fR
-+Display report messages. This is an alternative to enabling bit 4 in the level
-+provided to --message-level.
-+
- .SH ENVIRONMENT VARIABLES
- 
- .TP 8
-diff --git a/makedumpfile-1.6.8/makedumpfile.c b/makedumpfile-1.6.8/makedumpfile.c
-index 8c80c49..ba0003a 100644
---- a/makedumpfile-1.6.8/makedumpfile.c
-+++ b/makedumpfile-1.6.8/makedumpfile.c
-@@ -11540,13 +11540,14 @@ static struct option longopts[] = {
- 	{"num-threads", required_argument, NULL, OPT_NUM_THREADS},
- 	{"check-params", no_argument, NULL, OPT_CHECK_PARAMS},
- 	{"dry-run", no_argument, NULL, OPT_DRY_RUN},
-+	{"show-stats", no_argument, NULL, OPT_SHOW_STATS},
- 	{0, 0, 0, 0}
- };
- 
- int
- main(int argc, char *argv[])
- {
--	int i, opt, flag_debug = FALSE;
-+	int i, opt, flag_debug = FALSE, flag_show_stats = FALSE;
- 
- 	if ((info = calloc(1, sizeof(struct DumpInfo))) == NULL) {
- 		ERRMSG("Can't allocate memory for the pagedesc cache. %s.\n",
-@@ -11709,6 +11710,9 @@ main(int argc, char *argv[])
- 		case OPT_DRY_RUN:
- 			info->flag_dry_run = TRUE;
- 			break;
-+		case OPT_SHOW_STATS:
-+			flag_show_stats = TRUE;
-+			break;
- 		case '?':
- 			MSG("Commandline parameter is invalid.\n");
- 			MSG("Try `makedumpfile --help' for more information.\n");
-@@ -11718,6 +11722,9 @@ main(int argc, char *argv[])
- 	if (flag_debug)
- 		message_level |= ML_PRINT_DEBUG_MSG;
- 
-+	if (flag_show_stats)
-+		message_level |= ML_PRINT_REPORT_MSG;
-+
- 	if (info->flag_check_params)
- 		/* suppress debugging messages */
- 		message_level = DEFAULT_MSG_LEVEL;
-diff --git a/makedumpfile-1.6.8/makedumpfile.h b/makedumpfile-1.6.8/makedumpfile.h
-index 4c4222c..2fcb62e 100644
---- a/makedumpfile-1.6.8/makedumpfile.h
-+++ b/makedumpfile-1.6.8/makedumpfile.h
-@@ -2427,6 +2427,7 @@ struct elf_prstatus {
- #define OPT_PARTIAL_DMESG       OPT_START+17
- #define OPT_CHECK_PARAMS        OPT_START+18
- #define OPT_DRY_RUN             OPT_START+19
-+#define OPT_SHOW_STATS          OPT_START+20
- 
- /*
-  * Function Prototype.
-diff --git a/makedumpfile-1.6.8/print_info.c b/makedumpfile-1.6.8/print_info.c
-index d2b0cb7..ad4184e 100644
---- a/makedumpfile-1.6.8/print_info.c
-+++ b/makedumpfile-1.6.8/print_info.c
-@@ -309,7 +309,12 @@ print_usage(void)
- 	MSG("      vmcoreinfo. So currently /proc/kcore need be specified explicitly.\n");
- 	MSG("\n");
- 	MSG("  [--dry-run]:\n");
--	MSG("      This option runs makedumpfile without writting output dump file.\n");
-+	MSG("      Do not write the output dump file while still performing operations specified\n");
-+	MSG("      by other options.  This option cannot be used with --dump-dmesg, --reassemble\n");
-+	MSG("      and -g options.\n");
-+	MSG("\n");
-+	MSG("  [--show-stats]:\n");
-+	MSG("      Set message-level to print report messages\n");
- 	MSG("\n");
- 	MSG("  [-D]:\n");
- 	MSG("      Print debugging message.\n");
--- 
-2.29.2
-
diff --git a/SOURCES/kexec-tools-2.0.20-makedumpfile-Show-write-byte-size-in-report-messages.patch b/SOURCES/kexec-tools-2.0.20-makedumpfile-Show-write-byte-size-in-report-messages.patch
deleted file mode 100644
index 337288e..0000000
--- a/SOURCES/kexec-tools-2.0.20-makedumpfile-Show-write-byte-size-in-report-messages.patch
+++ /dev/null
@@ -1,59 +0,0 @@
-From 0ef2ca6c9fa2f61f217a4bf5d7fd70f24e12b2eb Mon Sep 17 00:00:00 2001
-From: Kazuhito Hagio <k-hagio-ab@nec.com>
-Date: Thu, 4 Feb 2021 16:29:06 +0900
-Subject: [PATCH] [PATCH] Show write byte size in report messages
-
-Show write byte size in report messages.  This value can be different
-from the size of the actual file because of some holes on dumpfile
-data structure.
-
-  $ makedumpfile --show-stats -l -d 1 vmcore dump.ld1
-  ...
-  Total pages     : 0x0000000000080000
-  Write bytes     : 377686445
-  ...
-  # ls -l dump.ld1
-  -rw------- 1 root root 377691573 Feb  4 16:28 dump.ld1
-
-Note that this value should not be used with /proc/kcore to determine
-how much disk space is needed for crash dump, because the real memory
-usage when a crash occurs can vary widely.
-
-Signed-off-by: Kazuhito Hagio <k-hagio-ab@nec.com>
----
- makedumpfile.c | 5 +++++
- 1 file changed, 5 insertions(+)
-
-diff --git a/makedumpfile-1.6.8/makedumpfile.c b/makedumpfile-1.6.8/makedumpfile.c
-index fcd766b..894c88e 100644
---- a/makedumpfile-1.6.8/makedumpfile.c
-+++ b/makedumpfile-1.6.8/makedumpfile.c
-@@ -48,6 +48,8 @@ char filename_stdout[] = FILENAME_STDOUT;
- static unsigned long long	cache_hit;
- static unsigned long long	cache_miss;
- 
-+static unsigned long long	write_bytes;
-+
- static void first_cycle(mdf_pfn_t start, mdf_pfn_t max, struct cycle *cycle)
- {
- 	cycle->start_pfn = round(start, info->pfn_cyclic);
-@@ -4715,6 +4717,8 @@ write_and_check_space(int fd, void *buf, size_t buf_size, char *file_name)
- {
- 	int status, written_size = 0;
- 
-+	write_bytes += buf_size;
-+
- 	if (info->flag_dry_run)
- 		return TRUE;
- 
-@@ -10002,6 +10006,7 @@ print_report(void)
- 	REPORT_MSG("Memory Hole     : 0x%016llx\n", pfn_memhole);
- 	REPORT_MSG("--------------------------------------------------\n");
- 	REPORT_MSG("Total pages     : 0x%016llx\n", info->max_mapnr);
-+	REPORT_MSG("Write bytes     : %llu\n", write_bytes);
- 	REPORT_MSG("\n");
- 	REPORT_MSG("Cache hit: %lld, miss: %lld", cache_hit, cache_miss);
- 	if (cache_hit + cache_miss)
--- 
-2.29.2
-
diff --git a/SOURCES/kexec-tools-2.0.22-makedumpfile-check-for-invalid-physical-address-proc-kcore-when-finding-max_paddr.patch b/SOURCES/kexec-tools-2.0.22-makedumpfile-check-for-invalid-physical-address-proc-kcore-when-finding-max_paddr.patch
deleted file mode 100644
index c6eb40f..0000000
--- a/SOURCES/kexec-tools-2.0.22-makedumpfile-check-for-invalid-physical-address-proc-kcore-when-finding-max_paddr.patch
+++ /dev/null
@@ -1,60 +0,0 @@
-From 38d921a2ef50ebd36258097553626443ffe27496 Mon Sep 17 00:00:00 2001
-From: Coiby Xu <coxu@redhat.com>
-Date: Tue, 15 Jun 2021 18:26:31 +0800
-Subject: [PATCH] check for invalid physical address of /proc/kcore
- when finding max_paddr
-
-Kernel commit 464920104bf7adac12722035bfefb3d772eb04d8 ("/proc/kcore:
-update physical address for kcore ram and text") sets an invalid paddr
-(0xffffffffffffffff = -1) for PT_LOAD segments of not direct mapped
-regions:
-
-  $ readelf -l /proc/kcore
-  ...
-  Program Headers:
-    Type           Offset             VirtAddr           PhysAddr
-                   FileSiz            MemSiz              Flags  Align
-    NOTE           0x0000000000000120 0x0000000000000000 0x0000000000000000
-                   0x0000000000002320 0x0000000000000000         0x0
-    LOAD           0x1000000000010000 0xd000000000000000 0xffffffffffffffff
-                                                         ^^^^^^^^^^^^^^^^^^
-                   0x0001f80000000000 0x0001f80000000000  RWE    0x10000
-
-makedumpfile uses max_paddr to calculate the number of sections for
-sparse memory model thus wrong number is obtained based on max_paddr
-(-1).  This error could lead to the failure of copying /proc/kcore
-for RHEL-8.5 on ppc64le machine [1]:
-
-  $ makedumpfile /proc/kcore vmcore1
-  get_mem_section: Could not validate mem_section.
-  get_mm_sparsemem: Can't get the address of mem_section.
-
-  makedumpfile Failed.
-
-Let's check if the phys_start of the segment is a valid physical
-address to fix this problem.
-
-[1] https://bugzilla.redhat.com/show_bug.cgi?id=1965267
-
-Reported-by: Xiaoying Yan <yiyan@redhat.com>
-Signed-off-by: Coiby Xu <coxu@redhat.com>
----
- elf_info.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/makedumpfile-1.6.8/elf_info.c b/makedumpfile-1.6.8/elf_info.c
-index e8affb7..bc24083 100644
---- a/makedumpfile-1.6.8/elf_info.c
-+++ b/makedumpfile-1.6.8/elf_info.c
-@@ -628,7 +628,7 @@ get_max_paddr(void)
- 
- 	for (i = 0; i < num_pt_loads; i++) {
- 		pls = &pt_loads[i];
--		if (max_paddr < pls->phys_end)
-+		if (pls->phys_start != NOT_PADDR && max_paddr < pls->phys_end)
- 			max_paddr = pls->phys_end;
- 	}
- 	return max_paddr;
--- 
-2.29.2
-
diff --git a/SOURCES/kexec-tools-2.0.22-makedumpfile-check-for-invalid-physical-address-proc-kcore-when-making-ELF-dumpfile.patch b/SOURCES/kexec-tools-2.0.22-makedumpfile-check-for-invalid-physical-address-proc-kcore-when-making-ELF-dumpfile.patch
deleted file mode 100644
index 9180dc6..0000000
--- a/SOURCES/kexec-tools-2.0.22-makedumpfile-check-for-invalid-physical-address-proc-kcore-when-making-ELF-dumpfile.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From 9a6f589d99dcef114c89fde992157f5467028c8f Mon Sep 17 00:00:00 2001
-From: Tao Liu <ltao@redhat.com>
-Date: Fri, 18 Jun 2021 18:28:04 +0800
-Subject: [PATCH] check for invalid physical address of /proc/kcore
- when making ELF dumpfile
-
-Previously when executing makedumpfile with -E option against
-/proc/kcore, makedumpfile will fail:
-
-  # makedumpfile -E -d 31 /proc/kcore kcore.dump
-  ...
-  write_elf_load_segment: Can't convert physaddr(ffffffffffffffff) to an offset.
-
-  makedumpfile Failed.
-
-It's because /proc/kcore contains PT_LOAD program headers which have
-physaddr (0xffffffffffffffff).  With -E option, makedumpfile will
-try to convert the physaddr to an offset and fails.
-
-Skip the PT_LOAD program headers which have such physaddr.
-
-Signed-off-by: Tao Liu <ltao@redhat.com>
-Signed-off-by: Kazuhito Hagio <k-hagio-ab@nec.com>
----
- makedumpfile.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/makedumpfile-1.6.8/makedumpfile.c b/makedumpfile-1.6.8/makedumpfile.c
-index 894c88e..fcb571f 100644
---- a/makedumpfile-1.6.8/makedumpfile.c
-+++ b/makedumpfile-1.6.8/makedumpfile.c
-@@ -7764,7 +7764,7 @@ write_elf_pages_cyclic(struct cache_data *cd_header, struct cache_data *cd_page)
- 		if (!get_phdr_memory(i, &load))
- 			return FALSE;
- 
--		if (load.p_type != PT_LOAD)
-+		if (load.p_type != PT_LOAD || load.p_paddr == NOT_PADDR)
- 			continue;
- 
- 		off_memory= load.p_offset;
--- 
-2.29.2
-
diff --git a/SOURCES/mkdumprd b/SOURCES/mkdumprd
index 1bd3d0a..ce3c0f3 100644
--- a/SOURCES/mkdumprd
+++ b/SOURCES/mkdumprd
@@ -68,8 +68,8 @@ to_mount() {
 
     if [[ "$_fstype" == "nfs"* ]]; then
         _pdev=$_target
-        _options=$(echo $_options | sed 's/,addr=[^,]*//')
-        _options=$(echo $_options | sed 's/,proto=[^,]*//')
+        _options=$(echo $_options | sed 's/,\(mount\)\?addr=[^,]*//g')
+        _options=$(echo $_options | sed 's/,\(mount\)\?proto=[^,]*//g')
         _options=$(echo $_options | sed 's/,clientaddr=[^,]*//')
     else
         # for non-nfs _target converting to use udev persistent name
@@ -432,6 +432,11 @@ then
     add_dracut_arg "--add-drivers" \"$extra_modules\"
 fi
 
+# TODO: The below check is not needed anymore with the introduction of
+#       'zz-fadumpinit' module, that isolates fadump's capture kernel initrd,
+#       but still sysroot.mount unit gets generated based on 'root=' kernel
+#       parameter available in fadump case. So, find a way to fix that first
+#       before removing this check.
 if ! is_fadump_capable; then
     # The 2nd rootfs mount stays behind the normal dump target mount,
     # so it doesn't affect the logic of check_dump_fs_modified().
diff --git a/SOURCES/mkfadumprd b/SOURCES/mkfadumprd
new file mode 100644
index 0000000..5447c7a
--- /dev/null
+++ b/SOURCES/mkfadumprd
@@ -0,0 +1,64 @@
+#!/bin/bash --norc
+# Generate an initramfs image that isolates dump capture capability within
+# the default initramfs using zz-fadumpinit dracut module.
+
+if [ -f /etc/sysconfig/kdump ]; then
+	. /etc/sysconfig/kdump
+fi
+
+[[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut
+. $dracutbasedir/dracut-functions.sh
+. /lib/kdump/kdump-lib.sh
+. /lib/kdump/kdump-logger.sh
+
+#initiate the kdump logger
+if ! dlog_init; then
+	echo "mkfadumprd: failed to initiate the kdump logger."
+	exit 1
+fi
+
+readonly MKFADUMPRD_TMPDIR="$(mktemp -d -t mkfadumprd.XXXXXX)"
+[ -d "$MKFADUMPRD_TMPDIR" ] || perror_exit "mkfadumprd: mktemp -d -t mkfadumprd.XXXXXX failed."
+trap '
+    ret=$?;
+    [[ -d $MKFADUMPRD_TMPDIR ]] && rm --one-file-system -rf -- "$MKFADUMPRD_TMPDIR";
+    exit $ret;
+    ' EXIT
+
+# clean up after ourselves no matter how we die.
+trap 'exit 1;' SIGINT
+
+MKDUMPRD="/sbin/mkdumprd -f"
+# Default boot initramfs to be rebuilt
+REBUILD_INITRD="$1" && shift
+TARGET_INITRD="$1" && shift
+FADUMP_INITRD="$MKFADUMPRD_TMPDIR/fadump.img"
+
+### First build an initramfs with dump capture capability
+# this file tells the initrd is fadump enabled
+touch "$MKFADUMPRD_TMPDIR/fadump.initramfs"
+ddebug "rebuild fadump initrd: $FADUMP_INITRD $DEFAULT_INITRD $KDUMP_KERNELVER"
+if ! $MKDUMPRD "$FADUMP_INITRD" -i "$MKFADUMPRD_TMPDIR/fadump.initramfs" /etc/fadump.initramfs; then
+	perror_exit "mkfadumprd: failed to build image with dump capture support"
+fi
+
+### Unpack the initramfs having dump capture capability
+mkdir -p "$MKFADUMPRD_TMPDIR/fadumproot"
+if ! (pushd "$MKFADUMPRD_TMPDIR/fadumproot" > /dev/null && lsinitrd --unpack "$FADUMP_INITRD" && \
+	popd > /dev/null); then
+	derror "mkfadumprd: failed to unpack '$MKFADUMPRD_TMPDIR'"
+	exit 1
+fi
+
+### Pack it into the normal boot initramfs with zz-fadumpinit module
+_dracut_isolate_args="--rebuild $REBUILD_INITRD --add zz-fadumpinit \
+	-i $MKFADUMPRD_TMPDIR/fadumproot /fadumproot \
+	-i $MKFADUMPRD_TMPDIR/fadumproot/usr/lib/dracut/loaded-kernel-modules.txt
+	   /usr/lib/dracut/fadump-kernel-modules.txt"
+
+if is_squash_available; then
+	_dracut_isolate_args="$_dracut_isolate_args --add squash"
+fi
+if ! dracut --force --quiet $_dracut_isolate_args $@ "$TARGET_INITRD"; then
+	perror_exit "mkfadumprd: failed to setup '$TARGET_INITRD' with dump capture capability"
+fi
diff --git a/SOURCES/rhelonly-kexec-tools-2.0.20-makedumpfile-arm64-Add-support-for-ARMv8.2-LVA-52-bi.patch b/SOURCES/rhelonly-kexec-tools-2.0.20-makedumpfile-arm64-Add-support-for-ARMv8.2-LVA-52-bi.patch
index 85b5496..7b7ad63 100644
--- a/SOURCES/rhelonly-kexec-tools-2.0.20-makedumpfile-arm64-Add-support-for-ARMv8.2-LVA-52-bi.patch
+++ b/SOURCES/rhelonly-kexec-tools-2.0.20-makedumpfile-arm64-Add-support-for-ARMv8.2-LVA-52-bi.patch
@@ -1,27 +1,30 @@
-From 16028a119c85ed73944bcf6ca310a7ee4d2e64fe Mon Sep 17 00:00:00 2001
+From 0f632fa180e5a44219ab6bbe0879c3583f8c65cf Mon Sep 17 00:00:00 2001
 From: Pingfan Liu <piliu@redhat.com>
-Date: Mon, 21 Dec 2020 13:35:38 +0800
+Date: Tue, 9 Nov 2021 11:24:22 +0800
 Subject: [PATCH] RHEL-only
 
+Cope with RHEL8 kernel
+
+Signed-off-by: Pingfan Liu <piliu@redhat.com>
 ---
  arch/arm64.c   | 14 +++++++++++++-
  makedumpfile.c |  2 ++
  makedumpfile.h |  1 +
  3 files changed, 16 insertions(+), 1 deletion(-)
 
-diff --git a/makedumpfile-1.6.8/arch/arm64.c b/makedumpfile-1.6.8/arch/arm64.c
-index 3d7b416..c8e7f62 100644
---- a/makedumpfile-1.6.8/arch/arm64.c
-+++ b/makedumpfile-1.6.8/arch/arm64.c
-@@ -48,6 +48,7 @@ static int lpa_52_bit_support_available;
- static int pgtable_level;
- static int va_bits;
+diff --git a/makedumpfile-1.7.0/arch/arm64.c b/makedumpfile-1.7.0/arch/arm64.c
+index 1072178..95beae6 100644
+--- a/makedumpfile-1.7.0/arch/arm64.c
++++ b/makedumpfile-1.7.0/arch/arm64.c
+@@ -50,6 +50,7 @@ static int va_bits;
+ static int vabits_actual;
+ static int flipped_va;
  static unsigned long kimage_voffset;
 +static int max_user_va_bits;
  
  #define SZ_4K			4096
  #define SZ_16K			16384
-@@ -107,7 +108,7 @@ typedef unsigned long pgdval_t;
+@@ -108,7 +109,7 @@ typedef unsigned long pgdval_t;
  #define PGDIR_SHIFT		ARM64_HW_PGTABLE_LEVEL_SHIFT(4 - (pgtable_level))
  #define PGDIR_SIZE		(_AC(1, UL) << PGDIR_SHIFT)
  #define PGDIR_MASK		(~(PGDIR_SIZE-1))
@@ -30,7 +33,7 @@ index 3d7b416..c8e7f62 100644
  
  /*
   * Section address mask and size definitions.
-@@ -366,6 +367,17 @@ get_machdep_info_arm64(void)
+@@ -449,6 +450,17 @@ get_machdep_info_arm64(void)
  		ERRMSG("Can't determine platform config values\n");
  		return FALSE;
  	}
@@ -48,38 +51,38 @@ index 3d7b416..c8e7f62 100644
  
  	kimage_voffset = NUMBER(kimage_voffset);
  	info->section_size_bits = SECTIONS_SIZE_BITS;
-diff --git a/makedumpfile-1.6.8/makedumpfile.c b/makedumpfile-1.6.8/makedumpfile.c
-index cdde040..9fd3ae9 100644
---- a/makedumpfile-1.6.8/makedumpfile.c
-+++ b/makedumpfile-1.6.8/makedumpfile.c
-@@ -2322,6 +2322,7 @@ write_vmcoreinfo_data(void)
+diff --git a/makedumpfile-1.7.0/makedumpfile.c b/makedumpfile-1.7.0/makedumpfile.c
+index 3ad4443..018ea4c 100644
+--- a/makedumpfile-1.7.0/makedumpfile.c
++++ b/makedumpfile-1.7.0/makedumpfile.c
+@@ -2417,6 +2417,7 @@ write_vmcoreinfo_data(void)
  
  	WRITE_NUMBER("HUGETLB_PAGE_DTOR", HUGETLB_PAGE_DTOR);
  #ifdef __aarch64__
 +	WRITE_NUMBER("MAX_USER_VA_BITS", MAX_USER_VA_BITS);
  	WRITE_NUMBER("VA_BITS", VA_BITS);
+ 	/* WRITE_NUMBER("TCR_EL1_T1SZ", TCR_EL1_T1SZ); should not exists */
  	WRITE_NUMBER_UNSIGNED("PHYS_OFFSET", PHYS_OFFSET);
- 	WRITE_NUMBER_UNSIGNED("kimage_voffset", kimage_voffset);
-@@ -2728,6 +2729,7 @@ read_vmcoreinfo(void)
+@@ -2863,6 +2864,7 @@ read_vmcoreinfo(void)
  	READ_NUMBER("phys_base", phys_base);
  	READ_NUMBER("KERNEL_IMAGE_SIZE", KERNEL_IMAGE_SIZE);
  #ifdef __aarch64__
 +	READ_NUMBER("MAX_USER_VA_BITS", MAX_USER_VA_BITS);
  	READ_NUMBER("VA_BITS", VA_BITS);
+ 	READ_NUMBER("TCR_EL1_T1SZ", TCR_EL1_T1SZ);
  	READ_NUMBER_UNSIGNED("PHYS_OFFSET", PHYS_OFFSET);
- 	READ_NUMBER_UNSIGNED("kimage_voffset", kimage_voffset);
-diff --git a/makedumpfile-1.6.8/makedumpfile.h b/makedumpfile-1.6.8/makedumpfile.h
-index 698c054..2763a47 100644
---- a/makedumpfile-1.6.8/makedumpfile.h
-+++ b/makedumpfile-1.6.8/makedumpfile.h
-@@ -1937,6 +1937,7 @@ struct number_table {
+diff --git a/makedumpfile-1.7.0/makedumpfile.h b/makedumpfile-1.7.0/makedumpfile.h
+index e59239d..b6236dd 100644
+--- a/makedumpfile-1.7.0/makedumpfile.h
++++ b/makedumpfile-1.7.0/makedumpfile.h
+@@ -2064,6 +2064,7 @@ struct number_table {
  	long	phys_base;
  	long	KERNEL_IMAGE_SIZE;
  #ifdef __aarch64__
 +	long    MAX_USER_VA_BITS;
  	long 	VA_BITS;
+ 	long	TCR_EL1_T1SZ;
  	unsigned long	PHYS_OFFSET;
- 	unsigned long	kimage_voffset;
 -- 
-2.21.0
+2.31.1
 
diff --git a/SPECS/kexec-tools.spec b/SPECS/kexec-tools.spec
index c698cc9..79f596a 100644
--- a/SPECS/kexec-tools.spec
+++ b/SPECS/kexec-tools.spec
@@ -1,6 +1,6 @@
 Name: kexec-tools
 Version: 2.0.20
-Release: 57%{?dist}.1
+Release: 68%{?dist}
 License: GPLv2
 Group: Applications/System
 Summary: The kexec/kdump userspace component
@@ -13,7 +13,7 @@ Source4: kdump.sysconfig.i386
 Source5: kdump.sysconfig.ppc64
 Source7: mkdumprd
 Source8: kdump.conf
-Source9: https://github.com/makedumpfile/makedumpfile/archive/1.6.8.tar.gz
+Source9: https://github.com/makedumpfile/makedumpfile/archive/1.7.0.tar.gz
 Source10: kexec-kdump-howto.txt
 Source12: mkdumprd.8
 Source13: 98-kexec.rules
@@ -38,6 +38,7 @@ Source32: 60-kdump.install
 Source33: kdump-logger.sh
 Source34: kdump-migrate-action.sh
 Source35: kdump-restart.sh
+Source36: mkfadumprd
 
 #######################################
 # These are sources for mkdumpramfs
@@ -54,9 +55,14 @@ Source107: dracut-kdump-emergency.target
 Source108: dracut-early-kdump.sh
 Source109: dracut-early-kdump-module-setup.sh
 
+Source200: dracut-fadump-init-fadump.sh
+Source201: dracut-fadump-module-setup.sh
+
 %ifarch ppc64 ppc64le
 Requires(post): servicelog
+Recommends: keyutils
 %endif
+
 Requires(post): systemd-units
 Requires(preun): systemd-units
 Requires(postun): systemd-units
@@ -65,7 +71,7 @@ Requires: dracut >= 049-129
 Requires: dracut-network >= 049
 Requires: dracut-squash >= 049
 Requires: ethtool
-BuildRequires: zlib-devel zlib zlib-static elfutils-devel glib2-devel bzip2-devel ncurses-devel bison flex lzo-devel snappy-devel
+BuildRequires: zlib-devel zlib zlib-static elfutils-devel glib2-devel bzip2-devel ncurses-devel bison flex lzo-devel snappy-devel libzstd-devel
 BuildRequires: pkgconfig intltool gettext 
 BuildRequires: systemd-units
 BuildRequires: automake autoconf libtool
@@ -112,15 +118,13 @@ Patch610: kexec-tools-2.0.20-arm64-kexec-allocate-memory-space-avoiding-reserved
 Patch611: kexec-tools-2.0.20-arm64-kdump-deal-with-a-lot-of-resource-entries-in-p.patch
 Patch612: kexec-tools-2.0.20-Remove-duplicated-variable-declarations.patch
 Patch613: kexec-tools-2.0.20-eppic-Remove-duplicated-variable-declaration.patch
+Patch614: kexec-tools-2.0.20-1-printk-add-support-for-lockless-ringbuffer.patch
+Patch615: kexec-tools-2.0.20-2-printk-Use-ULL-suffix-for-64-bit-constants.patch
+Patch616: kexec-tools-2.0.20-3-printk-Use-zu-to-format-size_t.patch
 
 
 # Patches 701 onward for makedumpfile
 Patch701: rhelonly-kexec-tools-2.0.20-makedumpfile-arm64-Add-support-for-ARMv8.2-LVA-52-bi.patch
-Patch702: kexec-tools-2.0.20-makedumpfile-Add-dry-run-option-to-prevent-writing.patch
-Patch703: kexec-tools-2.0.20-makedumpfile-Add-shorthand-show-stats-option-to-show.patch
-Patch704: kexec-tools-2.0.20-makedumpfile-Show-write-byte-size-in-report-messages.patch
-Patch705: kexec-tools-2.0.22-makedumpfile-check-for-invalid-physical-address-proc-kcore-when-finding-max_paddr.patch
-Patch706: kexec-tools-2.0.22-makedumpfile-check-for-invalid-physical-address-proc-kcore-when-making-ELF-dumpfile.patch
 
 %description
 kexec-tools provides /usr/sbin/kexec binary that facilitates a new
@@ -149,12 +153,10 @@ tar -z -x -v -f %{SOURCE19}
 %patch611 -p1
 %patch612 -p1
 %patch613 -p1
+%patch614 -p1
+%patch615 -p1
+%patch616 -p1
 %patch701 -p1
-%patch702 -p1
-%patch703 -p1
-%patch704 -p1
-%patch705 -p1
-%patch706 -p1
 
 %ifarch ppc
 %define archdef ARCH=ppc
@@ -184,8 +186,8 @@ cp %{SOURCE31} .
 make
 %ifarch %{ix86} x86_64 ppc64 s390x ppc64le aarch64
 make -C eppic/libeppic
-make -C makedumpfile-1.6.8 LINKTYPE=dynamic USELZO=on USESNAPPY=on
-make -C makedumpfile-1.6.8 LDFLAGS="$LDFLAGS -I../eppic/libeppic -L../eppic/libeppic" eppic_makedumpfile.so
+make -C makedumpfile-1.7.0 LINKTYPE=dynamic USELZO=on USESNAPPY=on USEZSTD=on
+make -C makedumpfile-1.7.0 LDFLAGS="$LDFLAGS -I../eppic/libeppic -L../eppic/libeppic" eppic_makedumpfile.so
 %endif
 
 %install
@@ -218,6 +220,7 @@ SYSCONFIG=$RPM_SOURCE_DIR/kdump.sysconfig.%{_target_cpu}
 install -m 644 $SYSCONFIG $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/kdump
 
 install -m 755 %{SOURCE7} $RPM_BUILD_ROOT/usr/sbin/mkdumprd
+install -m 755 %{SOURCE36} $RPM_BUILD_ROOT/usr/sbin/mkfadumprd
 install -m 644 %{SOURCE8} $RPM_BUILD_ROOT%{_sysconfdir}/kdump.conf
 install -m 644 kexec/kexec.8 $RPM_BUILD_ROOT%{_mandir}/man8/kexec.8
 install -m 644 %{SOURCE12} $RPM_BUILD_ROOT%{_mandir}/man8/mkdumprd.8
@@ -245,17 +248,18 @@ install -m 755 -D %{SOURCE32} $RPM_BUILD_ROOT%{_prefix}/lib/kernel/install.d/60-
 
 
 %ifarch %{ix86} x86_64 ppc64 s390x ppc64le aarch64
-install -m 755 makedumpfile-1.6.8/makedumpfile $RPM_BUILD_ROOT/usr/sbin/makedumpfile
-install -m 644 makedumpfile-1.6.8/makedumpfile.8.gz $RPM_BUILD_ROOT/%{_mandir}/man8/makedumpfile.8.gz
-install -m 644 makedumpfile-1.6.8/makedumpfile.conf.5.gz $RPM_BUILD_ROOT/%{_mandir}/man5/makedumpfile.conf.5.gz
-install -m 644 makedumpfile-1.6.8/makedumpfile.conf $RPM_BUILD_ROOT/%{_sysconfdir}/makedumpfile.conf.sample
-install -m 755 makedumpfile-1.6.8/eppic_makedumpfile.so $RPM_BUILD_ROOT/%{_libdir}/eppic_makedumpfile.so
+install -m 755 makedumpfile-1.7.0/makedumpfile $RPM_BUILD_ROOT/usr/sbin/makedumpfile
+install -m 644 makedumpfile-1.7.0/makedumpfile.8.gz $RPM_BUILD_ROOT/%{_mandir}/man8/makedumpfile.8.gz
+install -m 644 makedumpfile-1.7.0/makedumpfile.conf.5.gz $RPM_BUILD_ROOT/%{_mandir}/man5/makedumpfile.conf.5.gz
+install -m 644 makedumpfile-1.7.0/makedumpfile.conf $RPM_BUILD_ROOT/%{_sysconfdir}/makedumpfile.conf.sample
+install -m 755 makedumpfile-1.7.0/eppic_makedumpfile.so $RPM_BUILD_ROOT/%{_libdir}/eppic_makedumpfile.so
 mkdir -p $RPM_BUILD_ROOT/usr/share/makedumpfile/eppic_scripts/
-install -m 644 makedumpfile-1.6.8/eppic_scripts/* $RPM_BUILD_ROOT/usr/share/makedumpfile/eppic_scripts/
+install -m 644 makedumpfile-1.7.0/eppic_scripts/* $RPM_BUILD_ROOT/usr/share/makedumpfile/eppic_scripts/
 %endif
 
 %define remove_dracut_prefix() %(echo -n %1|sed 's/.*dracut-//g')
 %define remove_dracut_early_kdump_prefix() %(echo -n %1|sed 's/.*dracut-early-kdump-//g')
+%define remove_dracut_fadump_prefix() %(echo -n %1|sed 's/.*dracut-fadump-//g')
 
 # deal with dracut modules
 mkdir -p -m755 $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase
@@ -274,6 +278,13 @@ cp %{SOURCE108} $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99earlyk
 cp %{SOURCE109} $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99earlykdump/%{remove_dracut_early_kdump_prefix %{SOURCE109}}
 chmod 755 $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99earlykdump/%{remove_dracut_prefix %{SOURCE108}}
 chmod 755 $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99earlykdump/%{remove_dracut_early_kdump_prefix %{SOURCE109}}
+%ifarch ppc64 ppc64le
+mkdir -p -m755 $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99zz-fadumpinit
+cp %{SOURCE200} $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99zz-fadumpinit/%{remove_dracut_fadump_prefix %{SOURCE200}}
+cp %{SOURCE201} $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99zz-fadumpinit/%{remove_dracut_fadump_prefix %{SOURCE201}}
+chmod 755 $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99zz-fadumpinit/%{remove_dracut_fadump_prefix %{SOURCE200}}
+chmod 755 $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99zz-fadumpinit/%{remove_dracut_fadump_prefix %{SOURCE201}}
+%endif
 
 
 %define dracutlibdir %{_prefix}/lib/dracut
@@ -288,7 +299,7 @@ mv $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/* $RPM_BUILD_ROOT/%{d
 touch /etc/kdump.conf
 
 %ifarch ppc64 ppc64le
-servicelog_notify --remove --command=/usr/lib/kdump/kdump-migrate-action.sh
+servicelog_notify --remove --command=/usr/lib/kdump/kdump-migrate-action.sh 2>/dev/null
 servicelog_notify --add --command=/usr/lib/kdump/kdump-migrate-action.sh --match='refcode="#MIGRATE" and serviceable=0' --type=EVENT --method=pairs_stdin
 %endif
 
@@ -363,6 +374,7 @@ done
 /usr/sbin/kexec
 /usr/sbin/makedumpfile
 /usr/sbin/mkdumprd
+/usr/sbin/mkfadumprd
 /usr/sbin/vmcore-dmesg
 %{_bindir}/*
 %{_datadir}/kdump
@@ -406,9 +418,47 @@ done
 %endif
 
 %changelog
-* Tue Nov  2 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-57.1
+* Thu Jan 27 2022 Pingfan Liu <piliu@redhat.com> - 2.0.20-68
+- Revert "Remove trace_buf_size and trace_event from the kernel bootparameters of the kdump kernel"
+
+* Fri Dec 24 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-67
+- Remove trace_buf_size and trace_event from the kernel bootparameters of the kdump kernel
+
+* Fri Dec 10 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-66
+- kdump/ppc64: suppress the error message "Could not find a registered notification tool" from servicelog_notify
+- Enable zstd compression for makedumpfile in kexec-tools.spec
+
+* Thu Dec  2 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-65
+- mkdumprd: drop mountaddr/mountproto nfs mount options 
+
+* Fri Nov 26 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-64
+- add keytuils as a weak dependency for POWER
+
+* Fri Nov 19 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-63
+- Document/kexec-kdump-howto.txt: fix escape
+
+* Wed Nov 17 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-62
+- Document/kexec-kdump-howto.txt: improve notes for kdump_pre  and kdump_post scripts
+
+* Tue Nov  9 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-61
+- rebase makedumpfile to 1.7.0
+
+* Fri Oct 22 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-60
+- fadump-init: clean up mount points properly
+- fadump: kdumpctl should check the modules used by the fadump initramfs
+- fadump: isolate fadump initramfs image within the default one
 - mkdumprd: Use xz for squash image compression
 
+* Mon Oct 18 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-59
+- makedumpfile: printk: use committed/finalized state values
+- makedumpfile: printk: add support for lockless ringbuffer
+- kexec-tools: printk: Use %zu to format size_t
+- kexec-tools: printk: Use ULL suffix for 64-bit constants
+- kexec-tools: printk: add support for lockless ringbuffer
+
+* Sun Oct 17 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-58
+- kdumpctl: fix fragile loops over find output
+
 * Fri Aug 27 2021 Pingfan Liu <piliu@redhat.com> - 2.0.20-57
 - kdumpctl: enable secure boot on ppc64le LPARs